针对套接字关闭异常:Socket closed解决方案
socket
思路:客户端连接服务器,当客户端要退出时,首先要关闭两者之间的通信,再将其各自的处理类所在的线程关闭掉。
在做多线程的猜拳小游戏中,其中一个玩家(客户端)退出,断开与服务器的连接,首先关闭了通信的inputStream和outputStream,再关闭socket对象。
dis.close();
dos.flush();
dos.close();
send("exit "+uname);
connected=false;//设置flag使其退出线程
dos.flush();
dos.close();
send("exit "+uname);
connected=false;//设置flag使其退出线程
在服务器中,接收来自客户端的退出信息,关闭通信
//某人退出连接
dis.close();
dos.flush();
dos.close();
sk.close();
break;
dis.close();
dos.flush();
dos.close();
sk.close();
break;
当我执行退出操作时,就会报java.net.SocketException: Socket closed


at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
at com.mummy.ggbt.Client.send(Client.java:512)
at com.mummy.ggbt.Client.access$1(Client.java:509)
at com.mummy.ggbt.Client$9.widgetSelected(Client.java:479)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422)
at com.mummy.ggbt.Client.open(Client.java:96)
at com.mummy.ggbt.Client.main(Client.java:73)
at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
at com.mummy.ggbt.Client.send(Client.java:512)
at com.mummy.ggbt.Client.access$1(Client.java:509)
at com.mummy.ggbt.Client$9.widgetSelected(Client.java:479)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422)
at com.mummy.ggbt.Client.open(Client.java:96)
at com.mummy.ggbt.Client.main(Client.java:73)
原因:重复关闭了流 (此错误在控制台打印了俩次) 在退出线程时,默认会关闭流。(图二)在服务器端则
一直报错IO异常,对于服务器端的输入流来说,它一直获取不到资源。
解决方法:注释掉客户端的 dis.close(); dos.flush(); dos.close();即可