在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
答案 0 :(得分:4)
您分叉线程,然后主线程正在尝试建立与远程服务器的连接。套接字尚未连接,所以我怀疑s.close()
在没有连接的套接字上什么都不做。很难看出INET套接字实现在这里做了什么。 t.interrupt();
无效,因为connect(...)
不可中断。
您可以使用看起来可以中断的NIO SocketChannel.connect(...)
。也许是这样的:
SocketChannel sc = SocketChannel.open();
// this can be interrupted
boolean connected = sc.connect(t.address);
不确定这是否会有所帮助。