socket关闭后再new,再connect失败的问题

socket属于一个类,socket在该类的A函数中close之后,在B函数中新建线程new SOcket(),再connect会报错,如下代码片段
socket = new Socket();
					//socket = new Socket("192.168.0.100",2582);
					socket.connect(new InetSocketAddress("192.168.0.100",2582),2000);

错误如下:

java.net.SocketException: Socket closed

at libcore.io.Posix.connect(Native Method)

at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)

at libcore.io.IoBridge.connectErrno(IoBridge.java:144)

at libcore.io.IoBridge.connect(IoBridge.java:112)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)

解决方法:

只要将先new再connect改为直接new Socket带参数就行了。具体原因不知

### Java Socket Connect API 文档概述 在Java中,`Socket`类用于表示客户端套接字。通过该类可以建立与服务器之间的连接,并进行数据传输。为了创建一个Socket实例并与远程主机建立连接,通常使用如下构造函数之一: ```java // 使用IP地址和端口号初始化Socket对象 public Socket(InetAddress address, int port) // 使用主机名和端口号初始化Socket对象 public Socket(String host, int port) ``` 当调用上述任一构造器时,程序会尝试立即打开一条到指定机器上的特定端口的物理连接[^1]。 如果需要更灵活地设置连接参数,则可以通过先创建未连接的Socket对象再显式调用connect方法来完成: ```java Socket socket = new Socket(); SocketAddress sockaddr = new InetSocketAddress("example.com", 80); socket.connect(sockaddr, timeoutMillis); ``` 这里需要注意的是,在实际应用中应当考虑异常处理以及超时机制等问题,以确保应用程序能够稳健运行[^3]。 ### 常见问题及其解决方案 #### 连接失败Connection refused) 这通常是由于目标服务不可达造成的,可能是防火墙阻止了请求或者是对方并没有开启相应的服务监听。建议检查网络配置和服务状态后再重试。 #### 设置合理的超时时间 为了避免长时间等待无响应的服务,应该合理设定连接超时时长。可通过`setSoTimeout()`方法为读取操作设置最大阻塞时间;而对于整个连接过程中的超时控制则可以在`connect()`方法第二个参数传入毫秒数作为超时期限。 ```java try { InetAddress addr = InetAddress.getByName(hostName); SocketAddress sockaddr = new InetSocketAddress(addr, portNumber); // 尝试连接给定地址,默认情况下不带任何选项 Socket clientSocket = new Socket(); // 设定连接超时时间为5秒钟 int connectionTimeoutMs = 5 * 1000; clientSocket.connect(sockaddr, connectionTimeoutMs); } catch (IOException e) { System.err.println(e.getMessage()); } ``` #### 关闭资源泄漏 每次成功建立了新的Socket之后都应确保最终能正确关闭它,防止造成文件描述符耗尽的风险。最佳实践是在finally块内执行close动作,即使发生错误也能保证清理工作得以实施。 ```java Socket server = null; InputStream input = null; OutputStream output = null; try { server = new Socket(address, port); // ...其他逻辑... } finally { try {if(output != null)output.close();}catch(IOException ignored){} try {if(input != null)input.close();}catch(IOException ignored){} try {if(server != null && !server.isClosed())server.close();}catch(IOException ignored){} } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值