中断阻塞网络IO而不关闭套接字

时间:2014-12-05 16:53:18

标签: java multithreading sockets

我从Socket.getInputStream()创建的流中读取。当我使用它时,它会阻塞,直到它获得新数据(确切地说它应该是什么)。现在我需要流来读取内容(见下文)。但是当我开始新的读取时,它会给我未指定的输出(或不是?)。我的问题是:

如何中断实际读取,所以我可以使用read方法?

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

2 个答案:

答案 0 :(得分:1)

停止事件处理器读取的问题是您引入了竞争条件:如果服务器在您终止读取后立即发送事件会发生什么? "响应"你读过的东西最终会成为一件大事。

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

答案 1 :(得分:0)

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