工作填坑记,关于Socket的一个大BUG

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

文章目录

背景

工作填坑记,关于URLConnection的一个大BUG
这是之前URLConnection的一个bug记录,好吧,之前写错了,不过我懒得改了,重要的是知识点,啦啦啦~
项目中的心跳用的是socket,不是之前说的URLConnection。
刚刚发现socket还是有Connectiontimeout的阻塞的问题,感觉java的生态确实不太好,这种jvm层面的东西确实有点不严谨。

复现

上面说的是客户哪里的问题,我本地,让心跳的接口去连接未翻墙电脑的google,结果复现了,也不报错,也不往下继续走,就卡在那里。

解决

我肯定解决不了,只能粘贴点链接,希望以后遇到问题的自己能有所启发

跟我一模一样的问题以及解决方案:
socket 连接超时处理 java
Java中Socket连接超时问题

相关资料:
Socket笔记之深入分析java中的ConnectionTimedOut
Socket超时时间设置

如果出现socket connection timeout的问题,可能是因为网络波动、防火墙等原因,如果想在本地复现的话,可能需要修改hosts为google等其他网站,即可以复现。

Demo

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class SocktClientTest {
	public static void main(String[] args) throws IOException {
		Socket socket = null;
		String ip = "61.19.1.54";
		int port = 10025;

		socket = new Socket(ip, port);//这里会出现问题
		socket.setSoTimeout(1000);

//		 socket = new Socket(); //实例化socket
//		SocketAddress socketAddress = new InetSocketAddress(ip ,port); //获取sockaddress对象
//		socket.connect(socketAddress,10); //设置超时参数为5秒
//		socket.setSoTimeout(1000);

		Scanner scanner = new Scanner(System.in);
		InputStream in = socket.getInputStream();
		InputStreamReader isr = new InputStreamReader(in);
		BufferedReader br = new BufferedReader(isr);
		OutputStream out = socket.getOutputStream();
		PrintStream ps = new PrintStream(out);
		String tempstr = "abc";
		while (!tempstr.equals("bye")) {
			ps.println(tempstr);
			System.out.println(br.readLine());
			tempstr = scanner.nextLine();
		}

	}
}

代码如上,不设置timeout
结果如下:阻塞,也不报错,也不继续往下走
在这里插入图片描述
等了大概几分钟
在这里插入图片描述
还是抛出了异常,但是在另一个博文中 另一个博文 ,发现如下截图
在这里插入图片描述
虽然我实际操作后并非像这个人博客中说的这样,但是确实是会阻塞
2019-10-17,更新:
Socket笔记之深入分析java中的ConnectionTimedOut这个博文中有详细的案例,0确实是永不超时,但是超过了操作系统的时间,还是会报我上面截图的错误,这就是为什么会报上面你的错误的原因。
建议自己以后遇到上面的错误,仔细阅读上面的文章,包括了连接超时的原因和比较详细的分析,以及实例。

如果将socket = new Socket(ip, port);//这里会出现问题 socket.setSoTimeout(1000); 注释掉,
// socket = new Socket(); //实例化socket // SocketAddress socketAddress = new InetSocketAddress(ip ,port); //获取sockaddress对象 // socket.connect(socketAddress,10); //设置超时参数为5秒 // socket.setSoTimeout(1000); 注释打开,即设置timeout
结果如下
在这里插入图片描述
在指定的时间内抛出异常

摘抄

为了方便自己查阅,将上面博文中的socket 连接超时处理 java 抄了下来

扫描二维码关注公众号,回复: 7572686 查看本文章

之前很少做这种纯的socket编程,最近公司有项目需要跟pc端通信,自己定协议发报文,就写了一个简单的基于java socket的client。

功能差不多了以后,发现一个问题,向pc端发报文时,pc端ip port 不通的情况下,会一直死等,等到天荒地老。这种情况我刚开始以为是代码出现了问题。

之前的代码:

Socket socket = null;
try {
socket =new Socket(host,port);//问题出在这里
socket.setSoTimeout(timeout);

我以为我设置了超时: socket.setSoTimeout(timeout);,其实这个是响应阻塞超时,是client和服务端建立连接后,等待接收数据的超时时间,真正的连接超时我没有处理。

解决:

Socket socket = null;
try {
socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress(host, port);
socket.connect(socketAddress, 100);//连不上的0.1毫秒断掉连接
socket.setSoTimeout(timeout);//响应阻塞超时

这样就好了 ip连不上的0.1秒就断开,connectTimeout 异常
参考的这位老哥的 http://blog.csdn.net/tterminator/article/details/52494141 感谢!!!

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/102575918
今日推荐