Socket 关于设置Socket连接超时时间

2023-11-03

做网络编程的人对setSoTimeout方法一定很熟悉,都知道是设置连接的超时时间!

但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间!我看了一下JDK 关于这个方法的说明,其实根本不是链路的超时时间!

 

Java代码 复制代码  收藏代码
  1. setSoTimeout   
  2. public void setSoTimeout(int timeout)   
  3.     throws SocketException启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。   
  4.     如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。   
  5.     超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。    
  6. 参数:   
  7. timeout - 指定的以毫秒为单位的超时值。    
  8. 抛出:    
  9. SocketException - 如果底层协议出现错误,例如 TCP 错误。   
  10. 从以下版本开始:    
  11. JDK 1.1    
  12. 另请参见:   
  13. getSoTimeout()  

其实说白了他只是read方法的超时时间,这个方法是堵塞的!

 

写个小例子验证一下:

服务端,收到一个请求后处理,但是只处理一个请求,处理完毕后结束:

Java代码 复制代码  收藏代码
  1. package socket;   
  2. import java.io.ByteArrayOutputStream;   
  3. import java.io.InputStream;   
  4. import java.net.InetSocketAddress;   
  5. import java.net.ServerSocket;   
  6. import java.net.Socket;   
  7. import java.net.SocketAddress;   
  8. import java.net.SocketException;   
  9. import java.net.SocketTimeoutException;   
  10. import java.text.SimpleDateFormat;   
  11. import java.util.Arrays;   
  12. import java.util.Date;   
  13. public class SocketService {   
  14.     public static void main(String[] args) {   
  15.         try {   
  16.             SocketAddress address = new InetSocketAddress("192.168.9.155"30001);   
  17.             // 启动监听端口 8001   
  18.             ServerSocket ss = new ServerSocket();   
  19.             ss.bind(address);   
  20.             // 接收请求   
  21.             Socket s = ss.accept();   
  22.             new Thread(new T(s)).start();   
  23.         } catch (Exception e) {   
  24.             e.printStackTrace();   
  25.         }   
  26.     }   
  27. }   
  28. class T implements Runnable {   
  29.     public void run() {   
  30.         try {   
  31.             System.out.println(socket.toString());   
  32.             socket.setKeepAlive(true);   
  33.             socket.setSoTimeout(5 * 1000);   
  34.             String _pattern = "yyyy-MM-dd HH:mm:ss";   
  35.             SimpleDateFormat format = new SimpleDateFormat(_pattern);   
  36.             while (true) {   
  37.                 System.out.println("开始:" + format.format(new Date()));   
  38.                 try {   
  39.                     InputStream ips = socket.getInputStream();   
  40.                     ByteArrayOutputStream bops = new ByteArrayOutputStream();   
  41.                     int data = -1;   
  42.                     while((data = ips.read()) != -1){   
  43.                         System.out.println(data);   
  44.                         bops.write(data);   
  45.                     }   
  46.                     System.out.println(Arrays.toString(bops.toByteArray()));   
  47.                 }catch(SocketTimeoutException e){   
  48.                     e.printStackTrace();   
  49.                 }catch(SocketException e){   
  50.                     e.printStackTrace();   
  51.                 } catch (Exception e) {   
  52.                     e.printStackTrace();   
  53.                 }   
  54.                 Thread.sleep(1000);   
  55.                 System.out.println(socket.isBound()); // 是否邦定  
  56.                 System.out.println(socket.isClosed()); // 是否关闭  
  57.                 System.out.println(socket.isConnected()); // 是否连接  
  58.                 System.out.println(socket.isInputShutdown()); // 是否关闭输入流  
  59.                 System.out.println(socket.isOutputShutdown()); // 是否关闭输出流  
  60.                 System.out.println("结束:" + format.format(new Date()));   
  61.             }   
  62.         } catch (Exception e) {   
  63.             e.printStackTrace();   
  64.         }   
  65.     }   
  66.     private Socket socket = null;   
  67.     public T(Socket socket) {   
  68.         this.socket = socket;   
  69.     }   
  70.     public Socket getSocket() {   
  71.         return socket;   
  72.     }   
  73.     public void setSocket(Socket socket) {   
  74.         this.socket = socket;   
  75.     }   
  76. }  

 

 第一个客户端,连接后一直保持连接对象的存活,但是不发送数据,服务端打印:

Java代码 复制代码  收藏代码
  1. package socket;   
  2. import java.net.Socket;   
  3. public class Client {   
  4.     public static void main(String[] args) {   
  5.         try {   
  6.             Socket socket = new Socket("192.168.9.155"30001);   
  7.             socket.setKeepAlive(true);   
  8.             while(true && null != socket){   
  9.                 Thread.sleep(10 * 1000);   
  10.             }   
  11.         } catch (Exception e) {   
  12.             e.printStackTrace();   
  13.         }   
  14.     }   
  15. }  

打印如下,可以看到链路一直是活的,间隔超时时间的间隔就打印一组异常信息: 

 

Java代码 复制代码  收藏代码
  1. Socket[addr=/192.168.9.155,port=3017,localport=30001]   
  2. 开始:2012-11-14 11:15:30  
  3. java.net.SocketTimeoutException: Read timed out   
  4.     at java.net.SocketInputStream.socketRead0(Native Method)   
  5.     at java.net.SocketInputStream.read(Unknown Source)   
  6.     at java.net.SocketInputStream.read(Unknown Source)   
  7.     at socket.T.run(SocketService.java:42)   
  8.     at java.lang.Thread.run(Unknown Source)   
  9. true  
  10. false  
  11. true  
  12. false  
  13. false  
  14. 结束:2012-11-14 11:15:36  
  15. 开始:2012-11-14 11:15:36  
 

 然后我们编写一个客户端,连接后马上关闭连接,也不发送任何数据:

Java代码 复制代码  收藏代码
  1. package socket;   
  2. import java.net.Socket;   
  3. public class Client {   
  4.     public static void main(String[] args) {   
  5.         try {   
  6.             Socket socket = new Socket("192.168.9.155"30001);   
  7.             socket.setKeepAlive(true);   
  8.         } catch (Exception e) {   
  9.             e.printStackTrace();   
  10.         }   
  11.     }   
  12. }  
package socket;
import java.net.Socket;
public class Client {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("192.168.9.155", 30001);
			socket.setKeepAlive(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

打印如下:

Java代码 复制代码  收藏代码
  1. 开始:2012-11-14 11:17:42  
  2. java.net.SocketException: Connection reset   
  3.     at java.net.SocketInputStream.read(Unknown Source)   
  4.     at java.net.SocketInputStream.read(Unknown Source)   
  5.     at socket.T.run(SocketService.java:42)   
  6.     at java.lang.Thread.run(Unknown Source)   
  7. true  
  8. false  
  9. true  
  10. false  
  11. false  

异常是不一样的,不一样的还有,如果是超时,则五秒钟循环一次,然后是连接中断,则不在循环马上再报错,因为连接已经挂了!但是打印这个连接还是有效的,这个我也不知道怎么回事!

 

所以,如果大家理解为超时时间内没有数据连接就自动关闭或失效,那么这个理解就非常有问题了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket 关于设置Socket连接超时时间 的相关文章

  • java中的Socket编程

    基于Socket的java网络编程 网络上的两个程序通过一个双向的通讯连接实现数据的交换 这个双向链路的一端成为一个socket Socket通常用来实现客户方和服务方的连接 Socket是TCP IP协议的一个十分流行的编程界面 一个so
  • linux内核中socket读取和接收的缓冲区大小

    linux内核中socket读取和接收的缓冲区大小 1 socket内核缓冲区大小可用getsockopt获取 2 socket内核缓冲区大小可用setsockopt设置 缓冲区的大小为设置的值的2倍 具体设置代码入下 3 socket缓冲
  • Libevent3——bufferevent上创建socket通信的服务器端、客户端的流程、及服务器端、客户端的代码实现分析⛽

    承接上文 服务器监听流程简要如下 创建监听器 有客户端连上时就是满足条件的时候 监听器的回调函数被调用 回调函数会创建新的用于通信的文件描述符fd 那么fd是需要被封装到一个bufferevent对象中 所以再创建一个bev对象对fd进行封
  • 在浏览器输入URL,按下回车之后的流程?

    1 在浏览器中输入一个URL 2 查找本地配置文件 如果之前有访问过 浏览器会进行缓存 如果没有的话会在本机域名解析文件hosts文件中寻找是否存在该URL的域名映射 如Windows的配置文件 C Windows System32 dri
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址
  • Qt4代码移植Qt5时的 QTcpServer 64位 BUG

    原Qt4上接口代码如下 void QTcpServer incomingConnection int socketDescriptor 移植到Qt5后 BUG现象就是 用MinGW32位编译出来的程序 QTcpServer工作正常 但用Mi
  • unity游戏开发-socket网络通信

    本篇主要是分享基于unity的客户端socket网络通信方案 关于服务器的c socekt搭建放在了这里 基于C 的Tcp服务端通信 其中关于socekt粘包断包的处理放在这里分享了 C socket粘包断包处理 目录 整体设计 TcpCl
  • select 模型解释

    套接字模式 阻塞套接字和非阻塞套接字 或者叫同步套接字和异步套接字 套接字模型 描述如何对套接字的I O行为进行管理 Winsock提供的I O模型一共有五种 select WSAAsyncSelect WSAEventSelect Ove
  • Socket传输文件/传输图片(Windows)

    利用UDP socket 来传输文件与图片 流程图如下 主要流程 1 client端发送command请求 上传数据或者下载数据 选择文件路径 2 server端应答 start代表开始传输 no代表拒绝 3 fopen打开文件进行读取 f
  • IOS 网络初探(一) - NSURLConnection

    在IOS中 除了最基本的socket外 苹果提供了NSURLConnection类来实现网络通信 请求服务器数据 GET方式 请求服务器数据分成异步和同步两种方式 先来看看异步 非阻塞 NSURL url NSURL URLWithStri
  • 通过socket获取对方ip地址

    struct sockaddr in sa int len sizeof sa if getpeername sockfd struct sockaddr sa len printf 对方IP s inet ntoa sa sin addr
  • Java实战项目(一)---编写聊天室程序

    刚开始学java 参考 java从入门到精通 这本书 学到网络程序设计基础这一章节 尤其与其他计算机进行通信 觉得还挺有意思的 所有深入地试试做一个小程序 聊天室程序 在代码中加入我自己的理解和困惑 希望能和大家一起探讨 每行的代码基本都有
  • Java网络编程之带文件名的文件传输(服务器+客户端)

    Java网络编程之带文件名的文件传输 文章总览 作者的话 需求分析 客户端代码 服务器端代码 服务器线程定义 结语 文章总览 作者的话 最近做的某个项目涉及到这方面的内容 因有感写下这篇学习记录 希望能给和我一样正在学习java的朋友们起到
  • Java实现一个简单的命令行聊天程序

    Socket编程 Java实现 客户端 package net import java io BufferedReader import java io InputStreamReader import java io PrintWrite
  • 使用Java socket简单模拟HTTP服务器

    1 HTTP server 接收client端的http请求并将同级目录的root 返回 package httpDemo import java io InputStream import java io OutputStream imp
  • java socket——心跳包

    首先先说说心跳包在socket连接中的意义 通过socket连接的双方为了保证在一段时间未发消息不被防火墙断开连接或者使对方及时知道自己是否已经断线而定期给对方发送的某些特殊标识字符 这个字符可以根据双方自定义 没有实际的通讯意义 而定制的
  • /etc/init.d/mysql: No such file or directory 和 ERROR 2002 (HY000): Can't connect to local MySQL server through socket 解决办法

    更改 etc my cnf client password your password port 3306 socket tmp mysql sock Here follows entries for some specific progr
  • 基于TCP的socket通信

    本文转载自http blog csdn net chocolate001 article details 6612201 基于TCP 面向连接 的socket编程 分为客户端和服务器端 客户端的流程如下 1 创建套接字 socket 2 向
  • Go_一文入门网络编程:常见协议、通信过程、Socket、CS/BS、TCP/UDP

    网络编程三要素 ip地址 端口 协议 在网络通信协议下 不同计算机上运行的程序 可以进行数据传输 IP地址 IP地址是一种在互联网协议中用于识别和定位设备的32位或128位数字地址 它是一个设备在网络上的唯一标识符 用于在互联网上定位和识别
  • C++知识分享: Socket 编程详解,万字长文

    介绍 Socket编程让你沮丧吗 从man pages中很难得到有用的信息吗 你想跟上时代去编Internet相关的程序 但是为你在调用 connect 前的bind 的结构而不知所措 等等 好在我已经将这些事完成了 我将和所有人共享我的知

随机推荐

  • 机试复试准备中--梦校(华科)真题

    一 矩阵转置 二 统计单词 写法一 读取一整行 写法二 依次读入每一个单词 三 二叉排序树 DFS 四 IP地址 五 特殊排序 六 a b 高精度加法 七 奇偶校验 八 最大的两个数 九 二叉树遍历 DFS 十 成绩排序 十一 守形数 十二
  • vue:webpack打包过程中的常见错误-加载CSS文件

    问题1 ReferenceError dirname is not defined 解决方法 将 dirname写为 dirname 注意是两条 问题2 npm ERR code ERESOLVE npm ERR ERESOLVE unab
  • C# 任意开次方,次幂, 开平方,开三次方,平方根, 三次方根

    double a 0 开任意次方的关键是 1 0 2 必须写 0 点零 如果不写 就永远等于1 具体原因不清楚 可以测试代码 a Math Pow 2 1 2 可以跟开平方对比一下 开平方 平方根 a Math Pow 2 1 0 2 开任
  • c# yield 用法

    返回类型必须为 IEnumerable IEnumerable
  • 洛谷 P3374 【模板】树状数组 1

    题目链接 https www luogu com cn problem P3374 include
  • 标签平滑(label smoothing)

    目录 1 标签平滑主要解决什么问题 2 标签平滑是怎么操作的 3 标签平滑公式 4 代码实现 标签平滑 label smoothing 出自GoogleNet v3 关于one hot编码的详细知识请见 One hot编码 1 标签平滑主要
  • HDMI与TMDS接口

    目录 0 Xilinx的HDMI 1 4 2 0 Transmitter Subsystem Product Guide 1 HDMI是新一代的多媒体接口标准 2 HDMI向下兼容DVI 3 TMDS 最小化传输差分信号 4 TMDS编码算
  • DB2多行转一行【XML方式】

    分组然后合并 然后去除XML标签 SELECT replace replace replace xml2clob xmlagg xmlelement name A 字段 a 分隔符 a a from 表 group by 分组字段 如 SE
  • python通信仿真_通信协议TLV的介绍及在python下的代码实现及仿真

    TLV协议是一种通讯协议 一般将数据封装成TLV的形式 即Tag Length Value 协议就是指通信双方对数据传输控制的一种规定 规定了数据格式 同步方式 传送速度 传送步骤的问题作出统一的规定 可以理解为两个节点之间为了协同工作 协
  • Elasticsearch实战(十五)---查询query,filter过滤,结合aggs 进行局部/全局聚合统计

    Elasticsearch实战 查询query filter过滤 结合aggs 进行局部 全局聚合统计 文章目录 Elasticsearch实战 查询query filter过滤 结合aggs 进行局部 全局聚合统计 1 准备数据 2 ES
  • C++调用Python Win10 Miniconda虚拟环境配置

    目录 前言 1 Win10 安装 Miniconda 2 创建虚拟环境 3 配置C 调用python环境 4 C 调用Python带参函数 5 遇到的问题 6 总结 前言 本文记录了Win10 系统下Qt 应用程序调用Python时配置Mi
  • (译) 如何使用 React hooks 获取 api 接口数据

    点击上方 蓝字 带你每天阅读全栈前端精选好文 原文地址 robinwieruch 在本教程中 我想向你展示如何使用 state 和 effect 钩子在React中获取数据 你还将实现自定义的 hooks 来获取数据 可以在应用程序的任何位
  • t1服务器显示演示版,T1与T3经常找不到加密狗,及提示演示版本到期,同一个加密狗,WIN2008R2 64位系统。T1工贸版V11.5,T3是普及版本10.8,都已注册。服务器与用户都是同一网络。请...

    经济责任审计结果运用中存在的问题及对策经济责任审计结果运用中存在的问题及对策 近年来 各级高度重视经济责任审计结果运用工作 采取完善机制 健全制度 加强配合等有效措施不断加大结果运用力度 通过将审计结果进行科学合理的转化利用 在加强干部监管
  • mnist

    mnist是什么 它是在机器学习和计算机视觉领域相当于hello world的一个最基础的数据集 内容是手写的数字 从0到9 我们想通过这个数据集来让计算机进行图像识别和手写识别 from matplotlib import pyplot
  • 超详细

    本教程讲述在论文编写中使用ChatGPT进行辅助 提供思路 提升效率 祝看到本教程的小伙伴们都完成论文 顺利毕业 可以加QQ群交流 一群 123589938 第一章 论文框架搭建 1 1 明确论文题目 1 1 1 适合的研究方向 首先赋予它
  • shell-read读取控制台输入

    基本语法 read 选项 参数 选项 p 指定读取值时的提示符 t 指定读取值时等待的时间 秒 如果没有在指定的时间内输入 就不再等待了 参数 变量 指定读取值的变量名 编写一个shell 1 读取控制台输入一个NUM1值 2 读取控制台输
  • android设备外接多个usb摄像头

    转自 https youshaohua com post android device external multiple USB camera 代码访问 OTG USB camera https github com quantum6 A
  • DGL学习笔记03-消息传递机制

    DGL学习笔记03 消息传递机制 1 什么是消息传递 举个简单的例子 1 什么是消息传递 什么是消息传递机制 首先来看下官方的解释 也可以去看论文 对于这一节的话 我感觉如果没接触过Message Passing的人可能看了官方文档也不太容
  • 文件系统FATFS使用 总结

    最近在使用FATFS 现将使用的方法记录下来 f open 函数 此函数用来打开或创建文件 重点 是这个函数的最后一个参数所代表的访问的模式 例子 state f open mfileinfo bmp name FA WRITE FA RE
  • Socket 关于设置Socket连接超时时间

    做网络编程的人对setSoTimeout方法一定很熟悉 都知道是设置连接的超时时间 但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间 我看了一下JDK 关于这个方法的说明 其实根本不是链路的超时时间 Java代码 setS