針對套接字關閉異常:Socket closed解決方案
阿新 • • 發佈:2019-02-17
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();即可
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();即可