针对套接字关闭异常:Socket closed解决方案

socket
思路:客户端连接服务器,当客户端要退出时,首先要关闭两者之间的通信,再将其各自的处理类所在的线程关闭掉。
                        在做多线程的猜拳小游戏中,其中一个玩家(客户端)退出,断开与服务器的连接,首先关闭了通信的inputStream和outputStream,再关闭socket对象。
                        dis.close();
          dos.flush();
           dos.close();
                        send("exit "+uname);
                     connected=false;//设置flag使其退出线程
                          在服务器中,接收来自客户端的退出信息,关闭通信
                          //某人退出连接
                        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)


                原因:重复关闭了流   (此错误在控制台打印了俩次) 在退出线程时,默认会关闭流。(图二)在服务器端则
一直报错IO异常,对于服务器端的输入流来说,它一直获取不到资源。
                解决方法:注释掉客户端的 dis.close(); dos.flush(); dos.close();即可
针对套接字关闭异常:Socket closed解决方案_第1张图片针对套接字关闭异常:Socket closed解决方案_第2张图片

你可能感兴趣的:(Socket,closed,解决方案,线程,多线程,项目笔记)