简体   繁体   English

什么是Android上正确的TCP / IP套接字关闭顺序?

[英]what is the proper tcp/ip socket shutdown sequence on android?

i have some code that does send a message using tcp/ip. 我有一些代码确实使用tcp / ip发送消息。

the client sequence is: connect, write, flush, shutdown output, shutdown input, close socket. 客户端顺序为:连接,写入,刷新,关闭输出,关闭输入,关闭套接字。

the server sequence is accept, readline, shutdown input, shutdown output, close socket. 服务器顺序为接受,读取行,关闭输入,关闭输出,关闭套接字。

this works fine on windows using the same wifi betwork as the android. 这在使用与Android相同的wifi的Windows上运行良好。 on a 2013 nexus 7 android 6.0.1, the socket.shutdownInput() sometimes throws an ENOTCONN (please see below). 在2013 nexus 7 android 6.0.1上,socket.shutdownInput()有时会抛出ENOTCONN(请参见下文)。 the program still works, but i would like to understand what is happening and get rid of the exception if possible. 该程序仍然有效,但是我想了解正在发生的事情,并在可能的情况下摆脱异常。

thanks 谢谢

edit: closing the output stream (and not doing a shutdown output) works better. 编辑:关闭输出流(而不执行关闭输出)效果更好。

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

connect, write, flush, 连接,写入,刷新,

Flush before close is redundant. 关闭前冲洗是多余的。

shutdown output, shutdown input, close socket 关闭输出,关闭输入,关闭插座

Both shutdowns are redundant before close. 关闭之前,这两次关闭都是多余的。

All you need is connect, write, close. 您所需要做的就是连接,编写,关闭。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM