chr*_*chr 5 java sockets multithreading network-programming timeout
我有一个调用服务器的Java套接字。但是,我不知道我可以在哪个地址访问服务器,因此我在多个线程中放置了几个套接字,它们尝试在一个地址上分别访问服务器。我的探究是我不想等待超时,但不知道如何正确停止套接字及其线程。
码:
socket = new Socket();
socket.connect(endpoint, timeout); // **Blocking method**
OutputStream out = socket.getOutputStream();
//Write Data here
Run Code Online (Sandbox Code Playgroud)
如何中断操作?我认为Thread.stop()样式不好,而且也无法正常工作。.NET Tcp端点具有一种非阻塞pending方法,该方法允许uinsg布尔标志,但是我找不到类似的东西
我不知道可以在哪个地址到达服务器,因此我在多个线程中放置了多个套接字,它们尝试在一个地址上分别到达服务器。
坏的。错误的决定。执行一些逻辑步骤来确定服务器的地址。或者,执行一些操作来帮助您了解服务器的 IP 地址。
仅当这是最后的希望时才这样做。
我的问题是我不想等待超时,但不知道如何正确停止套接字及其线程。
除超时外,您没有任何其他选择。Socket.connect() 正在阻塞。除了等待你什么也做不了。
您必须等待超时,因为这是关闭创建的套接字对象的逻辑方法。你不能直接关闭,直到超时。当结果应该出现时,将超时减少到限制(连接应该被接受)。
如何中断操作?我认为 Thread.stop() 是一种不好的风格,而且它也不能正常工作。
是的,您不应该执行 Thread.stop() 或 Thread.interrupt()。这些都是糟糕的编程风格。
如果超时,则对套接字进行 close() 操作。
您应该为客户端套接字设置套接字超时。最好的做法是为套接字设置超时。根据需要,超时时间应为 10 秒左右或更长。
您可以通过调用在当前代码中设置超时
socket.setSoTimeout(timeout);用于读取超时,或者
对于连接超时,connect(endpoint,timeout)正如您在代码中所做的那样。
如果超时到期,java.net.SocketTimeoutException则会引发 a,但 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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |