Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说java tcp socket 与 go tcp socket 的超时[通俗易懂],希望能够帮助你!!!。
最近因为做一个监控系统,在其中用到了大量的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设置。
————————————————
版权声明:本文为CSDN博主「aixinaxc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aixinaxc/article/details/89208107