我在C下面写程序,如果对面的socket主动关闭,会发一个0长度的数据包,本地可以判断出来。如果是网络问题,比如拔了网线,这个时候是没有对方给你发的包的。处理办法是通过发送测试线路的报文(当然和对方有约定)查看是否有返回结果数据。还一个办法是设置linger的一个什么参数,让底层自动多久侦测一下线路状况,具体的就看Java里面有没有了。
解决方案 »
- 关于Java对话框的问题
- 问下工作的事
- SSH getHibernateTemplate()的按照条件查询怎么写???
- 应用对象关联出现的问题!!!
- 在ACTION中返回NULL,是否还需要ACTIONFORM?
- AXIS返回的结果中的对像为什么不能强制转化??
- JTable焦点控制的问题(如何使用KeyboardFocusManager)
- tomcat 怎么设置不要虚拟目录就可以访问我的 网页? 就是直接打 127.0.0.1:8080就可以?
- 如何在linux+apache+tomcat上配置soap?急!
- 初学EJB,问一个部署问题,马上给分
- 请各位大侠帮忙, weblogic在运行时的两处错误, 谢谢.
- java怎么检测socket连接中断异常
我现在正好碰到这个问题,服务端主动断掉但是我的客户端怎么read都没有抛出异常
read操作不一定抛出异常吧,但是write肯定会抛出异常的
下午的时候碰到一个奇怪的问题,就是server端断开后我write一个buffer竟然还可以发送并且没有抛出异常(当然server端肯定没收到),一定要等到write第二个buffer的时候才抛出异常broken pipe的异常,究竟怎么回事??哪位能给点提示??
其实,当TCP包到达后,就放入你这端的缓冲区中,read是读缓冲区的数据,
而不是说,通知另一端,我要读你的数据了,因为read读到的数据是另一端
过来的,发不发送是另一端控制的.在这个时候,java本身的实现是不知道
缓冲区是不是有效,它只管从中读取数据.
当然,如果关闭自己这段的连接,就意味着缓冲区被注销,这时再read,绝对
有异常出来了.
顺便再加一点,很多的这种通信程序都有所谓的心跳检测,来进行判断,实际
上就是定时发送检查链路是否可达的TCP包.
其关闭时没有释放完资源,在java中,显式地调用资源,需要显式地释放.
你做个这样的测试嘛,你把网线拔掉,再发包给sever端,看是不是在第二个buffer时异常才出来.