3

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

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

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

老实说,我真正关心的只是制作一个运行平稳高效的程序。你认为什么是更有效和更容易构建的设计?我只是在玩,所以除了我的感觉告诉我之外,我没有构建高效和强大的客户端/服务器程序的经验。

4

2 回答 2

5

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

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

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

于 2012-12-27T05:22:08.017 回答
2

你正在编写一个聊天程序,不是吗?在这种情况下,发送广告接收的数据量非常小,您不必关心效率。以更容易编程的方式进行。我会选择直接在 UI 线程中发送数据(写入延迟不应该很大)并在单独的线程中读取数据,然后使用众所周知的方法将接收到的数据发送到 UI 线程。在这两个方向上,使用普通阻塞套接字是最简单的方法。

于 2012-12-27T05:36:46.113 回答