gpt4 book ai didi

java - Socket.close() 在 Socket.connect() 期间无效

转载 作者:搜寻专家 更新时间:2023-10-31 20:13:29 26 4
gpt4 key购买 nike

使用 Windows 上的默认套接字实现,我找不到任何有效的方法来停止 Socket.connect()This answer建议 Thread.interrupt() 不会工作,但 Socket.close() 会。然而,在我的试用中,后者也不起作用。

我的目标是快速干净地终止应用程序(即需要在套接字终止后完成清理工作)。我不想在 Socket.connect() 中使用超时,因为可以在合理的超时到期之前终止进程。

import java.net.InetSocketAddress;
import java.net.Socket;


public class ComTest {
static Socket s;
static Thread t;

public static void main(String[] args) throws Exception {
s = new Socket();
InetSocketAddress addr = new InetSocketAddress("10.1.1.1", 11);
p(addr);
t = Thread.currentThread();
(new Thread() {
@Override
public void run() {
try {
sleep(4000);
p("Closing...");
s.close();
p("Closed");
t.interrupt();
p("Interrupted");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
s.connect(addr);
}

static void p(Object o) {
System.out.println(o);
}
}

输出:

/10.1.1.1:11
Closing...
Closed
Interrupted
(A few seconds later)
Exception in thread "main" java.net.SocketException: Socket operation on nonsocket: connect

最佳答案

您 fork 线程,然后主线程尝试与远程服务器建立连接。套接字尚未连接,所以我怀疑 s.close() 在未连接的套接字上什么也没做。很难看出 INET 套接字实现在这里做了什么。 t.interrupt(); 将无法工作,因为 connect(...) 不可中断。

您可以使用看起来可中断的 NIO SocketChannel.connect(...)。也许是这样的:

SocketChannel sc = SocketChannel.open();
// this can be interrupted
boolean connected = sc.connect(t.address);

但不确定这是否有帮助。

关于java - Socket.close() 在 Socket.connect() 期间无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14529021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com