开发者社区> 问答> 正文

可以为Java Socket写消息设置超时吗??报错

在使用java Socket的过程中发现了这么一个现象, 若服务端进程退出了,客户端发送消息时会报错,如下所示:

java.net.SocketException: Broken pipe

但若服务端进程正常,网络异常导致超时的话,如通过下面的命令模拟超时情况:

sudo iptables -A INPUT -p tcp --dport 9000 -j DROP

此时客户端仍可以正常发送消息,当然服务端是收不到了。这些消息会积累在缓冲区中,等网络恢复正常后,服务端会一次性收到之前客户端发送的消息。

有办法为Socket写消息设置超时吗? Api中好像只有设置连接超时与读超时。

假如放任不管会有什么问题吗? 如缓冲区满了会怎样?

展开
收起
爱吃鱼的程序员 2020-06-14 15:53:10 784 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    发现若使用的是NIO的话,网络超时的话,注册了写事件的channel是不会被选择的,所以就相当于间接的解决了上面的问题。 

    <spanstyle="color:#222222;font-family:'HelveticaNeue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px;background-color:#FFFFFF;">最后会block住,直到缓存区的数据发出去了,能写入,没有参数可以设置write的timeout,但是有参数可以设置read的timeout。

    <spanstyle="color:#222222;font-family:'HelveticaNeue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px;background-color:#FFFFFF;">Thereisnomechanismtosetawritetimeoutonajava.net.Socket.Thereisa Socket.setSoTimeout()<spanstyle="color:#222222;font-family:'HelveticaNeue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px;background-color:#FFFFFF;"> method,butitaffects accept()<spanstyle="color:#222222;font-family:'HelveticaNeue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px;background-color:#FFFFFF;"> and read()<spanstyle="color:#222222;font-family:'HelveticaNeue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px;background-color:#FFFFFF;"> calls...andnot write()<spanstyle="color:#222222;font-family:'HelveticaNeue',Helvetica,Arial,sans-serif;font-size:15px;line-height:19.5px;background-color:#FFFFFF;"> calls.Apparently,youcangetwritetimeoutsifyouuseNIO,non-blockingmode,andaSelector,butthisisnotasusefulasyoumightimagine.

    Thanks!能提供原始文档链接吗?

    2020-06-14 15:53:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载