使用Windows上的默认套接字实现,我无法找到任何有效的方法来停止Socket.connect(). This answer表明Thread.interrupt()不起作用,但Socket.close()会.但是,在我的审判中,后者也没有用.
我的目标是快速,干净地终止应用程序(即在套接字终止后需要完成清理工作).我不想在Socket.connect()中使用超时,因为可以在合理的超时到期之前终止进程.
@H_404_8@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); } }
输出:
@H_404_8@/10.1.1.1:11 Closing... Closed Interrupted (A few seconds later) Exception in thread "main" java.net.SocketException: Socket operation on nonsocket: connect
最佳答案
您分叉线程,然后主线程尝试连接到远程服务器.套接字尚未连接,所以我怀疑s.close()在没有连接的套接字上什么都不做.很难看出INET套接字实现在这里做了什么. t.interrupt();因为connect(…)不可中断,所以不起作用.
您可以使用看起来可以中断的NIO SocketChannel.connect(…).也许是这样的:
@H_404_8@SocketChannel sc = SocketChannel.open(); // this can be interrupted boolean connected = sc.connect(t.address);
不确定这是否会有所帮助.