2010-01-09 84 views
2

我们正在为每个客户端服务器构建一个异步线程,并偶然发现问题。我们希望线程始终准备好从套接字读取或写入\。我们目前使用的套接字的读取方法是阻塞的,因此我们不能发出任何写入请求。读写套接字

  • 有没有办法中断读取操作?
  • 也许最好有主服务器线程负责写入套接字?

如果是这样,它是否仍然符合每个客户端设计模式的线程?

回答

1

您应该使用单独的线程,一个用于读取,一个用于写入,并使用某种同步方法(例如,用互斥锁保护的共享缓冲区)在两者之间进行通信。另外,可以使用select调用来查看套接字上是否有任何待处理的数据。

更新

我本来想从C哦select()函数调用的好。

我可以在Java API中找到的最接近的东西是Socket.getInputStream(),它为您提供了一个可以测试的流,以确定字节是否可用于读取或不从底层套接字读取。

+0

你能详细说说select()吗?我不能在socket API中找到它 – kfiroo 2010-01-09 17:07:53

2

使用异步(非阻塞)套接字IO。或者你也可以使用一个单独的线程来写作。

2

确保套接字是非阻塞的(FIONBIO我认为)。并使用select()来确定何时可以读取数据。

+0

使用非阻塞套接字通道有何帮助?我们是否应该重复检查读写准备情况?这似乎有点低效。 – kfiroo 2010-01-09 17:10:25

+0

select()函数是需要照顾的。用它来知道什么时候在一个套接字(或一组套接字)上读取数据。然后尝试从套接字读取数据。非阻塞选项只是保证在套接字上的读取将立即返回而不存在任何数据。 – 2010-01-09 18:25:07