在练习写一个网络聊天室时,遇到了一个问题,当其中一个客户端主动结束连接后,别的客户端也会受到影响,无法再发送信息,服务端代码如下:
while(true){
try {
String s = bufferedReader.readLine();
System.out.println(s);
for (Socket socket1 : serve.arrayList) {
if (socket1!=this.socket) {
OutputStreamWriter outputStreamWriter =
new OutputStreamWriter(socket1.getOutputStream());
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(s);
bufferedWriter.newLine();
bufferedWriter.flush();
}
}
}
}
每个客户端由一个线程管理,接受一个客户端的信息,然后转发给别的客户端。当客户端调用socket.close()时,bufferedReader.readLine()会返回一个 null,而不是阻塞等待客户端的信息,就会继续运行下面的代码,然后进行无限循环。
解决办法:本来使用了isclosed方法去判断socket是否关闭,但是发现该方法只能判断本地的socket是否关闭。可以通过判断s是否是null或者让客户端在调用socket.close()方法时主动发送一个结束标志,服务端接受到该标志后也主动关闭socket
if (s.equals("$stop$")){
serve.arrayList.remove(socket);
System.out.println(serve.arrayList);
socket.close();
return;
}