在java中停止阻塞套接字
Posted
技术标签:
【中文标题】在java中停止阻塞套接字【英文标题】:Stopping blocking sockets in java 【发布时间】:2017-01-11 13:10:01 【问题描述】:我有一个调用服务器的 java 套接字。但是,我不知道我可以在哪个地址到达服务器,所以我在几个线程中放置了几个套接字,它们尝试在一个地址上分别到达服务器。我的问题是我不想等待超时,但不知道如何正确停止套接字及其线程。
代码:
socket = new Socket();
socket.connect(endpoint, timeout); // **Blocking method**
OutputStream out = socket.getOutputStream();
//Write Data here
如何中断操作?我认为Thread.stop()
是一种糟糕的风格,它也不能正常工作。 .NET Tcp Endpoints 有一个非阻塞 pending
方法,允许使用 uinsg 布尔标志,但我找不到类似的东西
【问题讨论】:
尝试使用thread.interrupt()
中断线程或关闭套接字。两者都应该抛出异常。
可以给套接字添加超时时间吗?超时后,让线程停止。不建议拨打Thread.interrupt
。
我不希望超时时间过长,因为应用程序不应该运行太久@prasanth
【参考方案1】:
我不知道我可以在哪个地址到达服务器,所以我把 多个线程中的多个套接字,它们尝试访问服务器 每个地址都在一个地址上。
糟糕。糟糕的决定。执行一些逻辑步骤来确定服务器的地址。或者,执行一些有助于您了解服务器 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();
【讨论】:
Socket.setSoTimeout()
设置读取超时。 connect(endpoint, timeout)
导致连接超时。它们不是同一个东西,或等价物。
情况是只有一组地址,没有这样的逻辑步骤来找到它们
@chr - 如果是这样,那就没问题了。那么这意味着您只有有限的服务器选项可供连接。然后你可以采用这种方法。
@chr - 如果我的回答有帮助,您可能想给他们投票。另外,如果有,请采纳!谢谢。以上是关于在java中停止阻塞套接字的主要内容,如果未能解决你的问题,请参考以下文章
使用带有选择器的非阻塞模式下的 Java NIO 和 Unix 域套接字