我有一个java套接字调用服务器。然而,我不知道在哪个地址我可以到达服务器,所以我在几个线程中放了几个套接字,它们试图在一个地址上分别到达服务器。我的问题是,我不想等待超时,但不知道如何正确地停止套接字和它们的线程。
代码:socket = new Socket();
socket.connect(endpoint, timeout); // **Blocking method**
OutputStream out = socket.getOutputStream();
//Write Data here
如何中断操作?我认为Thread.stop()
是一个坏的风格,它也不能正常工作。。. NET Tcp端点有一个非阻塞pending
方法,允许使用布尔标志,但我找不到类似的
我不知道在哪个地址我可以到达服务器,所以我把多个线程中的多个套接字试图访问服务器每个人都有一个地址。
坏。糟糕的决定。执行一些逻辑步骤来确定服务器的地址。或者,执行一些可以帮助您了解服务器ip地址的操作。
这样做,只有当它是最后的希望。
我的问题是我不想等超时,但不知道如何停止套接字及其线程正确。
除了超时,你没有其他选项。Socket.connect()正在阻塞。除了等待,你别无他法。
您必须等待超时,因为这是关闭创建的套接字对象的逻辑方式。你不能直接关闭,直到超时。当你的结果出现时,将超时时间减少到极限(连接应该被接受)。
如何中断操作?我认为Thread.stop()很糟糕样式,也不能正常工作。
是的,你不应该执行Thread.stop()或Thread.interrupt()。这些都是糟糕的编程风格。
如果超时,在socket上执行close()操作。
您应该为客户端-套接字设置套接字超时。为套接字设置超时是最佳实践。根据需要,超时时间应该在10秒左右或更久。
可以通过调用
在当前代码中设置超时时间socket.setSoTimeout(timeout);
为读取超时,或连接超时,
connect(endpoint,timeout)
,因为你已经在你的代码。
如果超时超时,则抛出java.net.SocketTimeoutException
,尽管Socket仍然有效。超时时间必须大于0。超时值为0将被解释为无限超时。
您可能没有在代码中使用try-catch-finally。这是一个更好的设计。
当您正在执行连接超时时,可以修改代码以退出阻塞方法,如下所示:
try{
socket = new Socket();
socket.connect(endpoint,timeout); // **Blocking method**
OutputStream out = socket.getOutputStream();
//Write Data here
}
catch(Exception e){
e.printStackTrace();
}
finally{
socket.close();
}