JAVA Socket超时浅析

本文详细介绍了JAVA中Socket的超时机制,包括连接建立、读取和写入超时,并通过实例分析了TCP连接超时和Socket的读写缓冲区。在JAVA中,Socket的连接建立超时可以通过`connect(SocketAddress endpoint, int timeout)`设置,读超时使用`setSoTimeout(int timeout)`。当网络中断或对方进程崩溃时,设置超时时间至关重要,以防止线程长时间阻塞。" 125847618,9283329,Vue 若依系统单点登录实现详解,"['vue.js', '前端开发', 'OAuth', '用户认证']
摘要由CSDN通过智能技术生成

套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。JAVA有两个基于数据流的套接字类:ServerSocket,服务器用它“侦听”进入的连接;Socket,客户端用它初始一次连接。侦听套接字只能接收新的连接请求,不能接收实际的数据包。

  套接字是基于TCP/IP实现的,它是用来提供一个访问TCP的服务接口,或者说套接字socket是TCP的应用编程接口API,通过它应用层就可以访问TCP提供的服务。

在JAVA中,我们用ServerSocket、Socket类创建一个套接字连接,从套接字得到的结果是一个InputStream以及OutputStream对象,以便将连接作为一个IO流对象对待。通过IO流可以从流中读取数据或者写数据到流中,读写IO流会有异常IOException产生。

  套接字底层是基于TCP的,所以socket的超时和TCP超时是相同的。下面先讨论套接字读写缓冲区,接着讨论连接建立超时、读写超时以及JAVA套接字编程的嵌套异常捕获和一个超时例子程序的抓包示例。

1 socket读写缓冲区

  一旦创建了一个套接字实例,操作系统就会为其分配缓冲区以存放接收和要发送的数据。

 

 

  JAVA可以设置读写缓冲区的大小-setReceiveBufferSize(int size), setSendBufferSize(int size)。

  向输出流写数据并不意味着数据实际上已经被发送,它们只是被复制到了发送缓冲区队列SendQ,就是在Socket的OutputStream上调用flush()方法,也不能保证数据能够立即发送到网络。真正的数据发送是由操作系统的TCP协议栈模块从缓冲区中取数据发送到网络来完成的。

  当有数据从网络来到时,TCP协议栈模块接收数据并放入接收缓冲区队列RecvQ,输入流InputStream通过read方法从RecvQ中取出数据。

2 socket连接建立超时

  socket连接建立是基于TCP的连接建立过程。TCP的连接需要通过3次握手报文来完成,开始建立TCP连接时需要发送同步SYN报文,然后等待确认报文SYN+ACK,最后再发送确认报文ACK。TCP连接的关闭通过4次挥手来完成,主动关闭TCP连接的一方发送FIN报文,等待对方的确认报文;被动关闭的一方也发送FIN报文,然等待确认报文。

  正在等待TCP连接请求的一端有一个固定长度的连接队列,该队列中的连接已经被TCP接受(即三次握手已经完成),但还没有被应用层所接受。TCP接受一个连接是将其放入这个连接队列,而应用层接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java Socket编程中,可以通过设置Socket超时时间来控制连接超时。具体实现方法如下: 1. 设置连接超时时间 可以通过Socket类的setSoTimeout()方法来设置连接超时时间,该方法的参数为毫秒数,表示等待连接建立的最长时间。示例代码如下: ```java Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 8080), 5000); // 设置超时时间为5秒 ``` 上述代码中,connect方法的第二个参数表示连接超时时间为5秒。 2. 检测连接是否超时 可以通过捕SocketTimeoutException异常来检测连接是否超时,示例代码如下: ```java try { Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 8080), 5000); // 设置超时时间为5秒 } catch (SocketTimeoutException e) { // 连接超时 } ``` 上述代码中,如果连接超时,会抛出SocketTimeoutException异常,可以通过捕该异常来处理连接超时的情况。 需要注意的是,Socket超时时间的设置只对connect()方法生效,不适用于read()和write()方法。如果需要设置读写超时时间,可以使用Socket的setSoTimeout()方法,示例代码如下: ```java Socket socket = new Socket(); socket.setSoTimeout(5000); // 设置读取超时时间为5秒 ``` 上述代码中,setSoTimeout()方法的参数为毫秒数,表示等待读取的最长时间。如果在该时间内没有读取到数据,会抛出SocketTimeoutException异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔波的IT人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值