amp@java

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  99 随笔 :: 0 文章 :: 228 评论 :: 0 Trackbacks

打开了连接服务器的一个Socket后,隔了一段时间没用,Socket就会自动关闭(为什么?),这时候如果获取该Socket的OutputStream,并往里面写东西,在flush的时候就会出现:
java.net.SocketException: Software caused connection abort: socket write error
的异常。因此,如果隔了一段时间没有使用某个Socket,需要重新使用它的时候,就要先判断它究竟是否还在连接当中,一共尝试了Socket的三个方法:
1、isClosed()
2、isOutputShutdown()
3、isConnected()
发现前两个都没用,即使已经断开了,返回的还是false,只有第三个可以解决问题。
具体原因未知。

2007-4-19更新:
第三个也解决不了问题,还会出现同样的异常,目前的解决方法是catch SocketException,不管socket的状态如何,都把它关闭了重新再连,但是SocketException的种类有很多,不一定是因为Socket已关闭,所以这种方法有点粗鲁,但找不到更好的方法。

posted on 2007-04-12 12:21 amp@java 阅读(13118) 评论(8)  编辑  收藏 所属分类: Java common

评论

# re: 如何判断Socket已断开 2007-04-28 12:18 ddbird
3、isConnected()

一样没用 只要连上过,就一直给true  回复  更多评论
  

# re: 如何判断Socket已断开 2007-05-07 01:15 amp@java
的确三个方法都没用,不知道如何解决这个问题。如果服务器和客户端都是自己做的,可以采用心跳测试的方法,但有时候服务器不是自己做的,只做客户端,就不知道怎么判断究竟连接是否还有效了。  回复  更多评论
  

# re: 如何判断Socket已断开 2008-01-02 14:20 cosmicbao
isConnect()方法是判断最近一次是否连接上的,
所以对本次连接不起作用  回复  更多评论
  

# re: 如何判断Socket已断开 2008-09-22 21:01 liuguoling
最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。

首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。

然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。

最后又回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,太好了,正是我需要的!

于是,下面一段代码就可以判断远端是否断开了连接:

try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
}  回复  更多评论
  

# re: 如何判断Socket已断开 2009-09-17 10:15 我们
首先调用socket的setKeepAlive(true)确保主动连接,这样当断开的时候isConnected()就是false  回复  更多评论
  

# re: 如何判断Socket已断开 2010-05-07 16:16 宝贝兔
怎么写长连接的socket客户端呢?  回复  更多评论
  

# re: 如何判断Socket已断开 2013-01-29 17:23 wee
isConnected()&&!isClosed()  回复  更多评论
  

# re: 如何判断Socket已断开 2015-05-14 14:55 songxin
@liuguoling
这种方法也有问题,可以看看我的博客中摘录别人遇到的问题  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问