android上正确的tcp / ip socket关闭顺序是什么?

时间:2016-01-30 07:47:50

标签: java android sockets tcp

我有一些代码确实使用tcp / ip发送消息。

客户端序列是:connect,write,flush,shutdown output,shutdown input,close socket。

服务器序列是accept,readline,shutdown input,shutdown output,close socket。

这在Windows上使用与android相同的wifi前端工作正常。在2013 nexus 7 android 6.0.1上,socket.shutdownInput()有时会抛出一个ENOTCONN(请参见下文)。该程序仍然有效,但我想了解发生了什么,并尽可能摆脱异常。

感谢

编辑:关闭输出流(而不是关闭输出)效果更好。

01-29 23:24:29.394 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err: java.net.SocketException: shutdown failed: ENOTCONN (Transport endpoint is not connected)
01-29 23:24:29.394 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.net.PlainSocketImpl.shutdownInput(PlainSocketImpl.java:361)
01-29 23:24:29.394 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.net.Socket.shutdownInput(Socket.java:635)
01-29 23:24:29.394 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at com.tayek.tablet.io.Client.send(Client.java:49)
01-29 23:24:29.394 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at com.tayek.tablet.Tablet.send(Tablet.java:66)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at com.tayek.tablet.Tablet.access$200(Tablet.java:11)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at com.tayek.tablet.Tablet$SendCallable.call(Tablet.java:82)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at com.tayek.tablet.Tablet$SendCallable.call(Tablet.java:72)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
01-29 23:24:29.395 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.lang.Thread.run(Thread.java:818)
01-29 23:24:29.397 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err: Caused by: android.system.ErrnoException: shutdown failed: ENOTCONN (Transport endpoint is not connected)
01-29 23:24:29.397 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at libcore.io.Posix.shutdown(Native Method)
01-29 23:24:29.397 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at libcore.io.ForwardingOs.shutdown(ForwardingOs.java:159)
01-29 23:24:29.397 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     at java.net.PlainSocketImpl.shutdownInput(PlainSocketImpl.java:359)
01-29 23:24:29.397 7164-9300/com.tayek.tablet.gui.android.cb7 W/System.err:     ... 10 more

1 个答案:

答案 0 :(得分:0)

  

连接,写入,刷新,

关闭前冲洗是多余的。

  

关闭输出,关闭输入,关闭套接字

关闭前两次停机都是多余的。

您只需要连接,写入,关闭。