我有一个调用服务器的java套接字。但是,我不知道我可以到达服务器的哪个地址,所以我在几个线程中放了几个套接字,并且他们尝试在一个地址上到达每个服务器。我的问题是我不想等待超时,但不知道如何正确地停止套接字及其线程。
代码:
socket = new Socket();
socket.connect(endpoint, timeout); // **Blocking method**
OutputStream out = socket.getOutputStream();
//Write Data here
如何中断操作?我认为Thread.stop()
是一种不好的风格,它也无法正常工作。 .NET Tcp端点有一个非阻塞pending
方法,允许使用uinsg布尔标志,但我找不到类似的东西
答案 0 :(得分:0)
我不知道我可以到达服务器的哪个地址,所以我放了 几个线程中的几个套接字,它们试图到达服务器 每个在一个地址上。
BAD。不良决定。执行一些逻辑步骤以确定服务器的地址。或者,执行一些可以帮助您了解服务器IP地址的内容。
这样做,只有这是最后的希望。
我的问题是我不想等待 超时但不知道如何停止套接字及其线程 正常。
您没有任何其他超时选项。 Socket.connect()正在阻塞。除了等待,你无能为力。
您必须等待超时,因为这是关闭创建的套接字对象的逻辑方法。你不能直接关闭,直到超时。当结果到来时(应该接受连接),将超时减少到极限。
如何中断操作?我认为Thread.stop()很糟糕 风格,它也无法正常工作。
是的,您不应该执行Thread.stop()或Thread.interrupt()。这些是糟糕的编程风格。
如果超时到期,请在socket上执行close()操作。
您应该为客户端套接字设置套接字超时。为套接字设置超时是最佳做法。根据需要,超时应该在10秒左右到更长时间。
您可以通过调用
在当前代码中设置超时 socket.setSoTimeout(timeout);
用于读取超时,或者
用于连接超时,connect(endpoint,timeout)
就像在代码中一样。
如果超时到期,则引发java.net.SocketTimeoutException
,尽管Socket仍然有效。超时必须> 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();
}