Java 线程开销。我应该使用套接字还是套接字 channel ?

标签 java multithreading sockets client-server socketchannel

<分区>

我有两个用 Java 编写的即时消息程序的设计

第一个想法使用 2 个独立的线程。第一个线程忽略了 gui,并通过写入阻塞套接字来发送即时消息数据。第二个线程使用另一个阻塞套接字来监视来自 friend 的传入数据包。我不确定使用线程是否是解决此问题的最佳方法,但我发现它比使用非阻塞套接字 channel 更容易处理。

我的第二种设计是在一个线程中使用非阻塞套接字 channel ,它会偶尔检查是否有传入或传出数据。这种设计的好处是我不必担心线程之间的资源共享,但我不确定它是否更有效率。

老实说,我真正关心的是制作一个运行流畅高效的程序。您认为哪种设计更高效、更易于构建?我只是在玩,所以除了我的感官告诉我的,我没有构建高效和强大的客户端/服务器程序的经验。

最佳答案

很久以前我做了一个软件,里面有TCP/IP聊天模块:sockets。

在开始时,每个客户端都是 2 个线程:ReaderThread 和 WriterThread。这还不够,因为客户端会断开连接。我也需要制作一个 InactivityChecker 线程,因为读者无法检测到服务器端的断开连接,而作者只有在收到消息时才能检测到。 3 thread/client 有点浪费资源,但是最多可以同时支持 5000 个 clients!! -它会通过上下文切换吃掉你的处理器!还必须注意打开的最大端口号。

如果出于技术原因您希望“同时”允许超过 65525/2 个客户端,则异步方式是唯一可行的方法。

关于Java 线程开销。我应该使用套接字还是套接字 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14049604/

相关文章:

简单 Java RMI 示例中的 java.lang.AbstractMethodError

java - 在JavaFx Gui中添加图片

multithreading - 如何实现Qt "Blocking Auto Connection"

java - BufferedReader readLine 每两行跳过一次

.net - Delphi 7 中 .NETs NetworkStream/SslStream 的对应物

c - 为什么不能将 C 标准 I/O 与套接字一起使用

java - Spring Boot 日志记录中的 ClassCastException

java - 使用字符串存储 double - Java

c++ - 如何在 Poco 中设置在内核跟踪/ps/gdb 中调试可见的单个线程名称?

c - c中使用malloc为线程分配栈,使用SP在栈上存储上下文