Сервер на java
Всем привет.
Возник такой вопрос. Вот у меня есть сервер на 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){
}
}
}
}