【发布时间】:2011-06-20 02:56:37
【问题描述】:
我正在开发一个一对多的服务器-客户端应用程序,这是一个小项目。
由于套接字 IO 阻塞。我正在为此寻找解决方案。
谁能告诉我这两种解决方案的优缺点是什么?
- 使用 java.nio
- 为每个连接的客户端新建一个线程。
谢谢
【问题讨论】:
-
每个客户端一个线程?不是每个客户端有两个线程,一个用于读取,一个用于写入吗?否则,只要线程在 read() 中被阻塞,你就什么都做不了。
-
@Sergey,写阻塞是真正的罪魁祸首,因为它不能被中断,并且在 IO 错误的情况下,线程会阻塞,直到操作系统认为它很酷。可以使用 SO_TIMEOUT 管理读取线程。所以每个套接字有 2 个线程。
-
@bestsss,SO_TIMEOUT 不也会影响 write() 吗?如果 IO 不好,通常线程没有什么比尝试写更好的事情了。
-
@Sergey,不,它没有。没有中断写操作,即使有,你也不知道写了多少。与每秒读取几个字节的任意“坏”客户端相比,这样的设计真的很糟糕。您甚至无法在写入期间停止线程。通过读取线程,您甚至可以使用可用的线程(但它会降低一次 JNI 调用的性能)
标签: java multithreading sockets nio