Сервер на java

Рейтинг: 0Ответов: 0Опубликовано: 25.01.2015

Всем привет.

Возник такой вопрос. Вот у меня есть сервер на java, такой простенький, и клиент (приложение на андройде), они обмениваются строками, то есть клиент ему отправляет, серв принимает и передает обратно. У меня такая проблема возникла: когда клиент подключается, инициализируется PrintWriter и добавляется в ArrayList.

PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); 
clientsOutputStreams.add(writer);

Далее вызывается поток считывания строки:

public void run() {
            String message; 
            try{ 
                while((message = reader.readLine()) != null){ 
                    System.out.println("read "+message); 
                    tellEveryone(message); 
                }
            }catch(Exception e){ 
                e.printStackTrace(); 
                System.out.println("Client disconected");
            }

        }

После чего вызывается метод отправки сообщения, где с помощью итератора пробегаемся по каждому из объектов writer в ArrayList и отправлем на него строку

public void tellEveryone(String message){ 
            Iterator it = clientsOutputStreams.iterator(); 
            while(it.hasNext()){ 
                try{ 
                    PrintWriter writer = (PrintWriter) it.next(); 
                    writer.println(message); 
                    writer.flush(); 
                    System.out.println("Message sent!"); 
                }catch(Exception e){

                } 
            } 
        }

Но вот проблема в приложении две активности: редактирования сообщения и список с сообщениями, при этом подключение происходит в первой активности (где список), то есть приложение запустилось, подключилось, на сервере в массив занесен writer, далее пользователь перешел в др. активность, создал строку для отправки и вернулся обратно, при этом активность заново создает подключение, и в массиве уже 2 writer-a при одном подключенном клиенте, затем в методе отправки сервер пишет сообщение двум writer-ам, хотя подключен лишь один клиент, таким образом я смог нагрузить серв, что он пытался разослать строку 40 writer-ам при одном реально подключенном клиенте.
Так вот к чему я веду - как можно с клиента на java разорвать подключение на серве, то есть чтобы writer удалить из ArrayList?

Полный код сервера:

class Server {

@SuppressWarnings("rawtypes")
ArrayList clientsOutputStreams;

public class ClientHandler implements Runnable{

    BufferedReader reader; 
    Socket sock;

    public ClientHandler(Socket sockClient){ 
        try{ 
            sock = sockClient; 
            InputStreamReader isReader = new InputStreamReader(sock.getInputStream()); 
            reader = new BufferedReader(isReader); 
        }catch(Exception e){

        } 
    }

    @Override 
    public void run() {
        String message; 
        try{ 
            while((message = reader.readLine()) != null){ 
                System.out.println("read "+message); 
                tellEveryone(message); 
            }
        }catch(Exception e){ 
            e.printStackTrace(); 
            System.out.println("Client disconected");
        }

    } 
}

public static void main(String[] args){ 
    new Server().go(); 
}

    @SuppressWarnings({ "rawtypes", "resource", "unchecked" })
    public void go(){

        clientsOutputStreams = new ArrayList(); 
        try{ 
            ServerSocket serverSocket = new ServerSocket(5050); 
            InetAddress adress = InetAddress.getLocalHost();
            System.out.println("Forward to the client ..\n"+adress); 
            while(true){ 
                Socket clientSocket = serverSocket.accept();        
                System.out.println("The client is connected");
                int size = clientsOutputStreams.size() +1;
                System.out.println("Client number is "+size);
                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); 
                clientsOutputStreams.add(writer);

                Thread t = new Thread(new ClientHandler(clientSocket)); 
                t.start(); 
            } 
        }catch(Exception e){ 
            e.printStackTrace();

        } 
    }

    @SuppressWarnings("rawtypes")
    public void tellEveryone(String message){ 
        Iterator it = clientsOutputStreams.iterator(); 
        while(it.hasNext()){ 
            try{ 
                PrintWriter writer = (PrintWriter) it.next(); 
                writer.println(message); 
                writer.flush(); 
                System.out.println("Message sent!"); 
            }catch(Exception e){

            } 
        } 
    } 
}

Ответы

Ответов пока нет.