【发布时间】:2010-01-09 16:52:19
【问题描述】:
我们正在为每个客户端服务器构建一个异步线程,但偶然发现了一个问题。我们希望线程始终准备好从套接字读取或写入\。我们目前使用的是阻塞的套接字读取方法,因此我们无法发出任何写入请求。
- 有没有办法中断读操作?
- 或许让主服务器线程负责写入套接字会更好?
如果是这样,它是否仍然符合每个客户端设计模式的线程?
【问题讨论】:
标签: java multithreading client-server
我们正在为每个客户端服务器构建一个异步线程,但偶然发现了一个问题。我们希望线程始终准备好从套接字读取或写入\。我们目前使用的是阻塞的套接字读取方法,因此我们无法发出任何写入请求。
如果是这样,它是否仍然符合每个客户端设计模式的线程?
【问题讨论】:
标签: java multithreading client-server
使用异步(非阻塞)套接字 IO。或者您也可以使用单独的线程进行编写。
【讨论】:
确保套接字是非阻塞的(我认为是 FIONBIO)。并使用select() 来确定何时可以读取数据。
【讨论】:
您可能应该使用单独的线程,一个用于读取,一个用于写入,并使用某种同步方法(例如,由互斥锁保护的共享缓冲区)在两者之间进行通信。此外,select 调用可用于查看套接字上是否有任何待处理的数据。
更新
我原本想的是可以从 C 中调用的 select() 函数。哦,好吧。
我在 Java API 中能找到的最接近的东西是Socket.getInputStream(),它为您提供了一个流,可以测试该流以确定是否可以从底层套接字读取字节。
【讨论】: