1. 程式人生 > >針對套接字關閉異常:Socket closed解決方案

針對套接字關閉異常: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();即可