Java 服务端 socket 掉线重启后,客户端自动重连_java socket和serversocket多链接,且断线自动重连-程序员宅基地

技术标签: Java  java  断线重连  setSoTimeout  socket  

目的

强调:setSoTimeout()函数的重要性,目的是为了写出更健壮的程序。

问题:如果客户端发起的socket 在连接后,读取数据流之前,刚好服务器端突然断线了,紧接着又重启了,则当前socket连接,容易死锁,从而整个客户端程序停滞。

一般网上的思路,都是要判断服务端的状态、发送心跳包什么之类的,我个人认为这些操作比较繁琐、也不一定有效,经过多番摸索,终于明白了函数socket.setSoTimeout() 的重要性:

方法

1)使用socket 短连接

2)  启用 socket 的 setSoTimeout()的方法,以及ConnectTimeout() 连接超时。

3)捕捉异常:java.net.SocketTimeoutException: Read timed out后,重新开启一个socket。

具体代码如下:

            try {
                // 并将其连接到指定主机上的指定端口号
                while (true) {    // Java里Socket的循环往复使用 https://www.pianshen.com/article/58251192706/

                    socket = new Socket(); //使用socket 短连接
                    socketAddress = new InetSocketAddress(ip, port);
                    //socket.setKeepAlive(true);
                    socket.connect(socketAddress, 2*1000);//设置超时为20秒
                    socket.setSoTimeout(3*1000);//设置读操作超时时间 3 s,
                    //这样才能捕捉异常:java.net.SocketTimeoutException: Read timed out,非常重要,否则
                    //当在连接伤后,刚好服务器器socket server断开,则直接运行下面语句中的readLine()会死锁

                    out = new PrintStream(socket.getOutputStream());
                    out.println("push message...");// 向服务器端发送数据

                    // 读取服务器端数据
                    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    ret = br.readLine();
                    releaseResource(br ,out, socket);

                    if( ret == null ){
                        break;
                    }

                    Thread.sleep(1 * 1000);

                }
            } catch (Exception e) {
                System.out.println("--- socket连接error-----------");
                e.printStackTrace();
            } finally {
                releaseResource(br ,out, socket);

                try {
                    Thread.sleep(3 * 1000); //必须要 等待一定的秒数,等远端的socket server在足够时间内,启动起来,再尝试重连。
                } catch (Exception e) {
                }
                System.out.println("- - - finally语句中,socket server断开后,开始重连-----------\n\n");
            }
        }

上面代码,如果刚好在执行br = new BufferedReader(n。。。之后,执行语句ret = br.readLine() 之前,刚好服务端的socket service断掉、并瞬间快速重启了,那么之前的建立的socket TCP/IP就其实是个死的TCP/IP连接,这个时候执行 readLine()语句就会timeout死锁,程序停滞,如果前面,没有,设置setSoTimeout(),那么这个异常就不会,被捕捉到,从而一直停在语句readLine()那里死锁下去。那这个不是我们期望的,当前socket发送来的数据,丢失了也就算了;后续的要能正确接受、保存。

如果前面设置了socket.setSoTimeout(3*1000),就会在3秒内,捕捉到这个异常,从而放弃这个socket,进入重连。重连后,由于通道中会继续存在先前死的TCP/IP连接,可能会再次报告SocketTimeoutException异常,但是不要急(欲速则不达),经过几次反复重连后,服务器系统会重新开辟一个新的TCP/IP连接,回收老的、有问题的TCP/IP连接,整个重连就彻底变正常了。

---------------------------------

参考: java.net.SocketTimeoutException: Read timed out报警_summer089089的博客-程序员宅基地

connect timeout 是建立连接的超时时间;
read timeout, 是传递数据的超时时间。
ConnectTimeout只有在网络正常的情况下才有效,而当网络不正常时,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,这2个属性应该结合实用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/taikeqi/article/details/122128406

智能推荐

QT学习之QString的arg方法-程序员宅基地

文章浏览阅读217次。在QT的QString中,arg方法类似于C中的printf中使用的格式输出符(只是有点类似)。在QT5的帮助文档中,可以看出以下几点:使用arg(str1, str2, str3)这种方法进行替换。使用arg(str1).arg(str2).arg(str3)这种方法进行替换。​使用arg(int,int,int)这种方式进行替换。..._qt qurl args

ubuntu16.04 安装ssh_ubuntu16.04重装ssh-程序员宅基地

文章浏览阅读2.2k次。安装sshroot@ubuntu: apt-get install openssh-server安装后需要启动sshroot@ubuntu: /etc/init.d/ssh restart允许root登录需要修改配置信息root@ubuntu: vi /etc/ssh/sshd_config修改为:修改保存后再重启sshroot@ubuntu: /etc/init.d..._ubuntu16.04重装ssh

关于Unity中红外线瞄准的效果实现-程序员宅基地

文章浏览阅读1.1k次。今天做一个FPS游戏的时候,由于我做的是第三人称的射击,所以需要一个枪的红外线瞄准的效果。一开始我在枪上挂一个很细很长的聚光灯,瞄准远处物体的时候,看起来有点红外线的样子,但是靠近之后光线就变成一个手电筒的那种光,不是我想要的效果。后来我用粒子特效,虽然远处近处都是一条射线,但是效果很粗糙,不是那种细细的有穿透的感觉,而是像激光一样,而且感觉不断生成粒子,性能消耗会很大。最后..._unity红外线效果

matlab频率响应数据模型创建函数frd_matlab frd函数-程序员宅基地

文章浏览阅读3.3k次。使用方法:frd(resp,freq)其中resp是取样点,freq是频率函数方程,而frd以resp为freq的输入计算频率响应输出,并将该输出和输入resp对应的组合在一起,得到类型为frd的频率响应模型示例:在10到100之间取50个对数间距点,以y=0.05xexp(i2*x)为频率响应方程>> freq = logspace(1,2)>> resp = .05*(freq).*exp(i*2*freq)>> sys = frd(resp,freq)_matlab frd函数

人工智能内容生成元年—AI绘画原理解析_ai绘画技术原理-程序员宅基地

文章浏览阅读1.9w次,点赞39次,收藏183次。AIGC元年达到了学术-商业共振,本文介绍现有AI绘画、AI作画背后的相应基本原理、应用、以及论文参考文献。_ai绘画技术原理

Python爬虫网页解析神器Xpath快速入门教学!!!_python xpath 等于class的标签-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏18次。文章目录1、Xpath介绍2、Xpath路径表达式3、结合实例讲解1、Xpath介绍 XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。2、Xpath路径表达式表达式描述nodename选取此节点的所有子节点。/从根节点选取。//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。.选取当前节点…选取当前节点的父节点_python xpath 等于class的标签

随便推点

研发主管接私活被辞退,法院判决公司赔偿20.7万元_接私活赔偿案例-程序员宅基地

文章浏览阅读1.4w次,点赞19次,收藏52次。2019年8月15日,因员工李某在合资公司接私活,九次方大数据信息集团有限公司(以下简称:九次方公司)将其开除,被法院判定赔偿李某20.7万元,双方在违法解除劳动合同赔偿金存争议,经二审判决,驳回九次方上诉请求,维持原判。12月2日,中国裁判文书网公布了这起劳动争议的民事判决书。图源:中国裁判文书网接私活应不应该被公司开除?从法院公布的文书中,我们理清了事件的来龙去脉。原、被告主张九次方公司向一审法院起诉请求:判令九次方公司无须向李某支付违法解除劳动合同赔偿金20.7万元。_接私活赔偿案例

react native识别html5,GitHub - soliury/react-native-html-render: A html render for react-native-程序员宅基地

文章浏览阅读117次。react-native-html-renderA html render for react-native. But don't Suitable for all html. Only Suitable for the html generator by markdown with minify.Now it used by Noder.Be careful to use, the perfor..._react native render html 阅读器

MindOpt——优化虚拟电厂智能调度问题(二)-程序员宅基地

文章浏览阅读449次。智慧楼宇调度,是在保证社区负荷需求的情况下,通过储能设备的指令控制,以**用电经济性、环保性和对电网稳定性**为综合目标的一种调度场景。_mindopt

Java调用c++的动态链接库正确方式,踩坑选手!_java调用c++动态库-程序员宅基地

文章浏览阅读2.6k次。前言,前几个月泛泛的看了一下c++的相关书籍。在看的过程中,做几个例子啥的没啥感觉。但是在整合起来的过程中还是发现了蛮多问题。_java调用c++动态库

NeuralCoref: python的共指消解工具,向代词指代的问题进军!_neuralcoref.neuralcoref.array-程序员宅基地

文章浏览阅读7.7k次,点赞3次,收藏17次。首先简要地说说共指消解是什么,有什么用处。假设机器正在阅读一个这样的文本: 克劳德·莫奈是印象派代表人物和创始人之一。 他最重要的风格是改变了阴影和轮廓线的画法。如果机器想要从这段话中了解到关于莫奈风格的知识,它首先必须知道,第二句话中的“他”指的就是莫奈。弄清代词的指代就是共指消解中的一个典型任务。NeuralCoref是使用时下先进神经网络技术完成指代消解任务的一个工具。_neuralcoref.neuralcoref.array

python多线程/进程问题:以iperf3为例与测试平台解析_iperf3多线程测试方法-程序员宅基地

文章浏览阅读4.9k次,点赞3次,收藏14次。在给一个项目写可视化的时候,项目需要用iperf3来进行网络测试。遇到了subprocess与多线程问题,后来解决_iperf3多线程测试方法

推荐文章

热门文章

相关标签