【问题标题】:Interrupt blocking network IO without closing the socket在不关闭套接字的情况下中断阻塞网络 IO
【发布时间】:2014-12-05 16:53:17
【问题描述】:

我从Socket.getInputStream() 创建的流中读取。当我使用它时,它会阻塞,直到它获得新数据(正是它应该得到的)。现在我需要流来读取一些东西(见下文)。但是当我开始新的阅读时,它会给我未指定的输出(或没有?)。我的问题是:

如何中断实际的读取,以便使用 read 方法?

详细信息:我连接到服务器并向其发送命令。服务器不时向我的客户端发送消息(事件通知),我需要注册。我希望能够在等待此消息时发送命令。当我发送命令时,将从流中读取此命令的答案。这就是问题所在:当我尝试阅读我的答案时,我仍在收听这些消息。所以我需要一些能打断当前读取的东西。

【问题讨论】:

  • 在使用阻塞流时,需要使用单独的线程进行读写。

标签: java multithreading sockets


【解决方案1】:

阻止事件处理器读取的问题是您引入了竞争条件:如果服务器在您终止读取后立即发送事件会发生什么?你读到的“回应”最终会成为一个事件。

正确的方法是在一个地方完成所有阅读,包括事件和响应,并像处理事件一样处理响应。在您发送命令之前,为响应注册一个侦听器,然后发送命令。当读取线程看到响应时,让它找到适当的侦听器并通知它已收到响应。

【讨论】:

  • 从未想过要为命令解析添加监听器。我现在关闭了当前线程的读取并将它们移动到侦听器。感谢您的快速帮助!
【解决方案2】:

处理此 IMO 最简单、最好的方法是使用带有事件回调的异步侦听器。 DataFetcher is an implementation(另请参阅 TimeoutPartialReadException,同一项目/包中的依赖项,以及 IOUtils,它可以直接将 FetcherListenerInputStream 连接起来)

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多