问题解决:java.net.SocketTimeoutException: Read timed out
简单了解Sockets
Sockets:两个计算机应用程序之间逻辑链接的一个端点,是应用程序用来通过网络发送和接收数据的逻辑接口
- 是
IP地址和端口号
的组合 - 每个Socket都被分配了一个用于标识服务的特定端口号
- 基于连接的服务使用基于tcp的流Sockets
Java为客户端编程提供了java.net.Socket类
- 相反,
服务器端TCP/IP编程使用java.net.ServerSocket类
。 - 另一种类型的Socket是基于udp的数据报Sockets,用于无连接的服务。
Java为UDP操作提供了java.net.DatagramSocket
什么是“Connection Timed Out”
为了从客户端建立到服务器的连接,调用Socket构造函数,它实例化一个Socket对象
构造函数将远程主机地址和端口号作为输入参数。之后,它尝试根据给定的参数建立到远程主机的连接,该操作将阻塞所有其他进程,直到成功建立连接
然而,如果连接在一段时间后没有成功,程序会抛出一个ConnectionException
,并带有" connection timed out "消息
:java.net.ConnectException: Connection timed out: connect
在服务器端,ServerSocket类持续侦听传入的连接请求。当ServerSocket接收到连接请求时,它调用accept()方法来实例化一个新的Socket对象。类似地,此方法也会阻塞,直到与远程客户机成功建立连接。
- 如果TCP握手没有完成,则连接仍然不成功。结果,程序抛出IOException,指示在建立新连接时发生错误
发生“ Read timed out”的原因
没有服务正在侦听远程主机上的给定端口
远程主机不接受任何连接
远程主机不可用
网速慢
没有到远端主机的转发路径
有时,防火墙出于安全原因会阻塞某些端口。因此,当客户端试图建立到服务器的连接时,可能会出现“连接超时”错误。因此,在将端口绑定到服务之前,我们应该检查防火墙设置,看看它是否阻塞了端口。
解决方法
对于TCP客户端和服务器端,我们可以使用setSoTimeout(int timeout)方法指定socketInputStream.read()方法阻塞的时间量:
Socket socket = new Socket(host, port);socket.setSoTimeout(30000);
但是,如果在方法返回之前超时,程序将抛出SocketTimeoutException。
来源地址:https://blog.csdn.net/yyuggjggg/article/details/129288416
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341