中断连接插座
我有一个带有要连接的服务器列表的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