【问题标题】:reading and writing from sockets从套接字读取和写入
【发布时间】:2010-01-09 16:52:19
【问题描述】:

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

  • 有没有办法中断读操作?
  • 或许让主服务器线程负责写入套接字会更好?

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

【问题讨论】:

    标签: java multithreading client-server


    【解决方案1】:

    使用异步(非阻塞)套接字 IO。或者您也可以使用单独的线程进行编写。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 使用非阻塞套接字通道究竟有什么帮助?我们是否应该反复检查读\写准备情况?这似乎有点低效。
      • select() 函数负责处理这些问题。使用它来了解何时在套接字(或一组套接字)上要读取数据。然后尝试从套接字读取数据。非阻塞选项只是保证套接字上的读取将立即返回不存在数据。
      【解决方案3】:

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

      更新

      我原本想的是可以从 C 中调用的 select() 函数。哦,好吧。

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

      【讨论】:

      • 您能详细说明一下 select() 吗?我在套接字 api 中找不到它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2021-10-12
      • 2014-11-04
      相关资源
      最近更新 更多