栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

检查ClientSocket在Java中是否已断开连接

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

检查ClientSocket在Java中是否已断开连接

创建套接字时,请先设置超时:

private int timeout    = 10000;private int maxTimeout = 25000;clientSocket.setSoTimeout(timeout);

这样,如果读取超时,您将获得

java.net.SocketTimeoutException
(必须抓住)。因此,您可以执行以下操作,假设您之前已如上所示设置了SO_TIMEOUT,并假定心跳将始终从远程系统获得响应:

volatile long lastReadTime;try {    bufferedReader.read();    lastReadTime = System.currentTimeMillis();} catch (SocketTimeoutException e) {    if (!isConnectionAlive()) {        logger.info("ConNECTION TERMINATED!");        clientSocket.close();         setUpSocket(); //sets up the server to reconnect to the client    } else {        sendHeartBeat(); //Send a heartbeat to the client    }}public boolean isConnectionAlive() {    return System.currentTimeMillis() - lastReadTime < maxTimeout;}

解决此问题的一种常见方法是将超时设置为某个数字(例如10秒),然后跟踪上一次成功从套接字读取的时间。如果您的超时时间已达到2.5倍,请放弃客户端并关闭套接字(以防万一,将FIN数据包发送到另一端)。

如果心跳信号 _不会_从远程系统获得任何响应,而只是在连接断开时最终最终更早地产生IOException的一种方式,那么您可以这样做(假设sendHeartBeat本身不会抛出IOException):

try {    if (bufferedReader.read() == -1) {        logger.info("ConNECTION TERMINATED with EOF!");        resetConnection();    }} catch (SocketTimeoutException e) {    // This just means our read timed out ... the socket is still good    sendHeartBeat(); //Send a heartbeat to the client} catch (IOException e) {    logger.info("ConNECTION TERMINATED with Exception " + e.getMessage());    resetConnection();}....private void resetConnection() {    clientSocket.close();     setUpSocket(); //sets up the server to reconnect to the client}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496889.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号