中断连接插座

我有一个带有要连接的服务器列表的GUI。 如果用户点击连接到它的服务器。 如果用户点击第二台服务器,它将断开第一台服务器并连接到第二台服务器。 每个新连接都在一个新线程中运行,以便程序可以执行其他任务。

但是,如果用户在第一台服务器仍在连接时单击第二台服务器,则会有两个同时连接。

我用这个连接,connect()是阻塞的那一行:

Socket socket = new Socket();
socket.connect(socketAddress, connectTimeout);

我想也许是Thread.currentThread().interrupt(); 会工作,但没有。

我是否必须重构我的代码,以便它继续进行第一次连接,但直接关闭它? 或者实际上有一种方法可以中断连接方法。


如果您使用的是阻塞套接字实现,则中断该线程将不会“取消”或中断您的套接字连接。 打破“阻塞呼叫”的唯一方法是关闭套接字。 您可以在Runnable任务中公开一个方法(例如cancel ),这些方法关闭套接字并在用户尝试连接到第二台服务器时清理资源。

如果你想要的话,你可以看看我的一次尝试中断阻塞调用的线程。


你可以改为使用非阻塞套接字? 我不是一个Java专家,但它看起来像SocketChannel是他们的非阻塞套接字类。

这里是一个例子:

// Create a non-blocking socket and check for connections
try {
    // Create a non-blocking socket channel on port 80
    SocketChannel sChannel = createSocketChannel("hostname.com", 80);

    // Before the socket is usable, the connection must be completed
    // by calling finishConnect(), which is non-blocking
    while (!sChannel.finishConnect()) {
        // Do something else
    }
    // Socket channel is now ready to use
} catch (IOException e) {
}

采取从这里:http://www.exampledepot.com/egs/java.nio/NbClientSocket.html

在while循环中,您可以检查一些共享通知,您需要取消并释放,随时关闭SocketChannel。


我尝试了建议的答案,但没有为我工作。 所以我做的是,而不是将连接超时设置为10秒,我尝试连接5次,连接超时为2秒。 我也有一个全局变量boolean cancelConnection声明。

每超时异常被抛出的时候,我可以eather摆脱或继续基于价值的循环cancelConnection

这里是我正在写的android应用程序的代码片段:

try {
    SocketAddress socketaddres = new InetSocketAddress(server.ip,server.port);
    int max=5;
    for (int i = 1; i<=max; i++) {
        try {
            socket = new Socket();
            socket.connect(socketaddres, 2000);
            break;
        } catch (Exception e) {
            Log.d(TAG, "attempt "+i+ " failed");
            if (cancelConnection) {
                Log.d(TAG, "cancelling connection");
                throw new Exception();
            } else if (i==max) {
                throw new Exception();
            }
        }
    }
} catch (Exception e) {
    if (cancelConnection) {
            // Do whatever you would do after connection was canceled.
    } else {
            // Do whatever you would do after connection error or timeout
    }
}
链接地址: http://www.djcxy.com/p/51657.html

上一篇: Interrupt a connecting socket

下一篇: When function returns result and when function in JavaScript