【问题标题】:what is the proper tcp/ip socket shutdown sequence on android?android 上正确的 tcp/ip 套接字关闭顺序是什么?
【发布时间】:2016-05-08 01:35:27
【问题描述】:

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

客户端顺序是:连接、写入、刷新、关闭输出、关闭输入、关闭套接字。

服务器顺序为accept、readline、shutdown input、shutdown output、close socket。

这在使用与 android 相同的 wifi 网络的 Windows 上运行良好。在 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

【问题讨论】:

    标签: java android sockets tcp


    【解决方案1】:

    连接、写入、刷新、

    关闭前刷新是多余的。

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

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

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

    【讨论】:

    • 似乎我需要关闭输出流并关闭套接字(至少在 Windows 上)。
    • 没有。关闭输出流或输入流会关闭套接字。你应该关闭输出流,以防它下面有缓冲,以确保它被刷新。
    • 根据link,您对两次关机冗余的错误。
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多