怎样判断socket断开并自动重连?

snowvolcano 2002-08-27 05:55:48
在用socket通讯过程中经常会发生socket异常断开的情况,故请教各位高手
...全文
5113 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hccpro 2002-08-30
  • 打赏
  • 举报
回复
设置socket的setSoTimeout(int t)

catch IOException即可
snowvolcano 2002-08-30
  • 打赏
  • 举报
回复
我试用了setTimeOut,好像不奏效,能否举个例子?
hccpro 2002-08-29
  • 打赏
  • 举报
回复
你要设置超时!!!!!

网络出错不是立即就发现的!!要判断是否超时!

搞明白网络传输的原理你就明白了!
snowvolcano 2002-08-29
  • 打赏
  • 举报
回复
谢谢。我发现try{ }catch{}的方法好像不是完全能检测socket的异常断开。
我建了一个socket和一个serverSocket,并定义了socket的输入流in:
BufferedReader in =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
并循环in.readLine();
他们开始时是正常连接并正常通讯。
但是后来当我用网上邻居的属性断开网络连接后,客户端就死在in.readLine()那了,根本catch不到。请问各位兄弟有没有遇到这种情况?
本来很想给分,但问题真的未解决。
hccpro 2002-08-28
  • 打赏
  • 举报
回复
不关闭流呗
super_zzw 2002-08-28
  • 打赏
  • 举报
回复
如果只用线程监测是否处于连接状态好像不行,资源浪费并且起不到应有的效果!
因为是否连接良好是要在通讯的过程中监测的,Socket连接不在通讯状态的时候监测是否连接良好就没有什么意义了,也就是说你在传输数据的时可能连接会异常断开,这时候测试连接的线程肯定不可能在运行中(监测线程的优先级不可能比传输数据线程的优先级高吧)!除非你把优先级设得比较高,如果这样的话就太浪费资源了(辅助线程比主要线程的优先级高更是笑话),所以用监测线程就不大适合了。
如果你需要在Socket连接不在使用中时仍然保持连接,比较折衷的办法是,其一,建立一个低优先级的监视线程,用来保持非通讯状态的连接完好。其二,用try...catch...来维持通讯过程中的连接良好(一旦通讯异常立即重新连接)!
SAsura 2002-08-28
  • 打赏
  • 举报
回复
isClosed
public boolean isClosed()
Returns the closed state of the socket.

Returns:
true if the socket has been closed
Since:
1.4
See Also:
close()

不过只能在1.4上用,而且是客户端有效,服务器端无法根据此函数判断
snowvolcano 2002-08-28
  • 打赏
  • 举报
回复
请问起一个线程监听耗资源厉不厉害?
因为我希望客户端与服务器在我控制的时间内一直保持连接,不但是客户端,服务器也会不定时间往Socket写信息。
zhangkai 2002-08-28
  • 打赏
  • 举报
回复
如果你还需要继续传输数据,为什么要关闭流?
你关闭了流自是关闭了套接字连接。
scutjnet 2002-08-27
  • 打赏
  • 举报
回复
我用socket创建的流来下载文件,但是一个文件传完后一关闭流,它就连socket也关了,要下载第一个文件的话就要重新连接,请问有什么办法能使socket不关闭?
zhangkai 2002-08-27
  • 打赏
  • 举报
回复
如果是要达到即使检查到socket是否在断开,只能是起一线程来检查吧?
至于catch,只能适用于在发送数据或在接受数据的时候能catch到。

想到一点,你还是可以catch的,如果你的程序是作为客户端的话,你就需要在接受数据处理部分阻赛,这个时候catch,检查到错误后马上从新连接。

如果你的客户端不再接受数据出诸塞的话,而又要检查到数据,只有是采用线程检查了。
hccpro 2002-08-27
  • 打赏
  • 举报
回复
楼上的方法效率很低哦。

你可以自定义一个监听器,catch到错误的时候,通知监听器,然后建立连接。

或者也可以用while(ture)循环
zhangkai 2002-08-27
  • 打赏
  • 举报
回复
在每次要向服务器发送数据的时候判断socket是否断开,如果断开则连接。

如果要实现在没有向服务器发送请求的时候也能检查是否断开,那就启一个线程,
再线程中不停的检查socket是否断开,如果是连接,则睡眠会,醒来继续检查是否断开。这样做需要消耗很多资源。如果你的系统认为保持连接非常重要的话就可采用这个办法。否则还是不要这样做的好。
snowvolcano 2002-08-27
  • 打赏
  • 举报
回复
我想实现两个类: Client和ClientListener.
当客户端用socket连接到服务器后Client在客户端创建,同时ClientListener在服务器创建。
但由于网络的不稳定因素,socket有时会异常断开,我希望socket会自动重新连接,并保证Client与ClientListener的通讯不受影响,应怎么设计?
bhr 2002-08-27
  • 打赏
  • 举报
回复
try catch,在异常中重连。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧