在使用java Socket的过程中发现了这么一个现象, 若服务端进程退出了,客户端发送消息时会报错,如下所示:
java.net.SocketException: Broken pipe
但若服务端进程正常,网络异常导致超时的话,如通过下面的命令模拟超时情况:
sudo iptables -A INPUT -p tcp --dport 9000 -j DROP
此时客户端仍可以正常发送消息,当然服务端是收不到了。这些消息会积累在缓冲区中,等网络恢复正常后,服务端会一次性收到之前客户端发送的消息。
有办法为Socket写消息设置超时吗? Api中好像只有设置连接超时与读超时。
假如放任不管会有什么问题吗? 如缓冲区满了会怎样?
发现若使用的是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!能提供原始文档链接吗?版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。