6

使用 Windows 上的默认套接字实现,我找不到任何有效的方法来停止Socket.connect(). 这个答案表明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
4

1 回答 1

4

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

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

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

不确定这是否会有所帮助。

于 2013-01-25T19:35:36.710 回答