【问题标题】:Thread-per-connection model每个连接的线程模型
【发布时间】:2013-03-19 06:32:13
【问题描述】:

谈到 thread-per-connection 模型,每个连接都应该有一个单独的线程。该线程用于从流中读取数据。但是,由于我使用的是阻塞 I/O,因此在它尝试读取某些内容时我无法发送任何内容。

显然 Minecraft 每个连接使用两个线程,一个用于读取,一个用于写入。这也是我应该做的事情还是我应该如何实施?

据我所知,发送数据也是阻塞的,所以我不能只从tick线程发送,对吧?

所以再一次,我想知道的是:

  • 我应该为每个连接设置一个读写线程吗?如果没有,那我应该如何实现呢?

提前致谢。

【问题讨论】:

  • 你可以选择nio
  • 你的使用场景是什么?您已经描述了一个实现,但在不知道您将如何使用这些线程的情况下,不可能说它是否是适当的实现。

标签: java multithreading sockets io blocking


【解决方案1】:

在简单的乒乓式网络对话框中,运行某种状态机的单个线程就足够了。

但是,如果需要异步发送和/或接收数据,而不是直接响应接收或发送的最后一条数据,则每个方向一个线程是明智的,不是一个糟糕的解决方案以任何方式。

Java 的NIO 提供的非阻塞 IO 有利于高性能、高吞吐量的应用程序,例如重负载的 Web 服务器等,在这些应用程序中不希望有一个或两个 线程 em> 每个连接,总共可能有数千个线程在服务器上同时运行。在客户端,使用非阻塞 IO 并没有什么好处,如果您不希望同时维护数百个连接,多线程是可行的方法。

【讨论】:

  • 感谢您的回答!我将继续使用每个方向的线程。我试图避免使用 NIO,因为 IO 更简单,而且无论如何都没有必要,因为我的游戏不会有超过 100 名玩家。谢谢!
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多