c++ socket 连接超时_java tcp socket 与 go tcp socket 的超时

本文介绍了在C++、Java和Golang中如何设置socket的连接超时,澄清了对socket超时设置的常见误解。在Java中,setSoTimeout() 实际上设置的是读超时,而Go中的SetDeadline()用于设置读写超时。正确设置连接超时的方法分别是Java的socket.connect()和Go的net.DialTimeout。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

15d55e24744ccb4ee5251073e0a16b13.png

最近因为做一个监控系统,在其中用到了大量的socket。由于平时很少用到socket,在使用过程中还是遇到了一些问题的。比如:

1.socket一般在不主动关闭的情况下阻塞时间一般是有系统本身决定的(这个时间一般都很长)。

2.超时一般有连接超时,和读写超时。对于刚接触socket的人很容易把代码中提供的超时方法理解为连接超时。这就导致了一些错误,同时没有达到自己的预期。(往往会奇怪我明明设置了超时时间,为什么抛错时间和自己设置的对不上)

在做连接监控的时候就用到了对socket的连接超时设置,由于对socket接触的少就遇到了以上问题。

在项目中用的是java socket,在之后又看了一下go 的 socket。下面让我们看一下他们各自的实现:

我们平时不加超时时间的时候一般都是:

java :

// 要连接的服务端IP地址和端口 String host = "192.168.1.7"; int port = 6000; // 与服务端建立连接 Socket socket = null; try { socket = new Socket(host, port); // 建立连接后获得输出流 int n = 0; String message=this.getName() + "你好" + n; socket.getOutputStream().write(message.getBytes("UTF-8")); } catch (IOException e) { if(num == 0){ System.out.println("我连接不上他"); } num++; TSocket tSocket = new TSocket(); tSocket.start(); e.printStackTrace(); } 

go :

conn,err:=net.Dial("tcp","192.168.1.7:6000") if err != nil { fmt.Println(err) } str := []byte{32, 0, 0, 0, 7, 85, 35, 160, 176, 7, 226, 12, 18, 15, 45, 0} //向连接端发送一个数据 _,err=conn.Write(str) if err != nil { fmt.Println(err) } //读取连接端返回来的数据, result,err:=ioutil.ReadAll(conn) if err != nil { fmt.Println(err) } fmt.Println(string(result)) 

在java中为我们socket.setSoTimeOut()来设置超时时间,在go中这是conn.SetDialLine(),conn.SetReadDialLine(),

conn.SetWriteDialLine()。

刚开始用socket的人会理所当然的认为这两个是设置的连接超时。就会导致上面所说的问题。

java中的socket.setSoTimeOut()是设置socket的读超时。设置后在读超时后,就会抛出java.net.SocketTimeoutException: Read timed out。

go中的conn.SetDialLine()是设置socket的读写超时。相当于conn.SetReadDialLine()和conn.SetWriteDialLine()。同时conn.SetDialLine()设置的距离读写的结束时间,而不是直接就是设置每次读写的超时时间。

其实想实现对连接超时时间的设置很简单,java和go都为我们实现了:

java:

socket = new Socket(host, port);修改为:socket = new Socket();socket.connect(new InetSocketAddress(host, port), 5000);//地址,超时时间 

go:

conn,err:=net.Dial("tcp","192.168.1.7:6000")修改为 :conn,err:=net.DialTimeOut("tcp","192.168.1.7:6000",5*time.Second)//连接类型,地址,超时时间 

在java中通过socket.connect()超时时间,同时单位是毫秒。

在go中通过net.DialTimeOut设置。

————————————————

版权声明:本文为优快云博主「aixinaxc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.youkuaiyun.com/aixinaxc/article/details/89208107

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值