【发布时间】:2016-07-14 12:54:12
【问题描述】:
目前我正在制作一个聊天程序(对于那些想知道的人来说,Java 语言),我现在需要为整个事情想出一个好的架构。这是我目前的大纲,但请随时提供任何反馈(我没有受过专业培训,只是阅读了一些内容)。
客户端:
生命周期如下:
- 与服务器连接- 首先我打算让客户端与服务器建立连接,提示用户登录或创建一个新帐户,并将这些凭据发送到服务器,然后服务器会发回诸如用户好友列表之类的信息以及我能想到的任何其他相关数据。
- 等待用户与某人联系- 将会有一个当前在线且用户可以联系的朋友列表,以及一个用于查找和请求其他用户与他们成为朋友的按钮。
- 聊天-我将详细介绍服务器部分,但用户会将文本和图像发送到服务器,服务器将继续将其路由给其他用户。
- Rinse and Repeat-用户聊天结束后,会回到第2步,直到退出程序,此时会关闭与服务器的所有连接。
看来客户端只需要单线程即可。另外,如果您认为许多 IM 类型程序具有的任何有用(主要)功能,请分享。我很高兴听到(如果您想让我非常高兴,那么您也可以包括实施的总体大纲:)。
服务器端
现在这是变得相当混乱的地方。我认为我正在为许多线程创建方式,而不是我需要的。让我解释一下。
- 服务器使用每个用户的 JSON 表示形式在每个客户端上存储信息。此外,还会维护当前在线用户的列表。
目前关于服务器端聊天的想法:
- 与一个客户端建立连接- 服务器和客户端通信,让客户端登录(或注册),服务器告诉客户端它的朋友是谁,并将客户端添加到当前用户列表中在线的。同样,此时我正在启动一个新线程来监听来自该客户端的输入
- 客户选择与某人开始对话-此时我认为我需要为此对话创建一个新线程,因为其中许多需要同时进行。到目前为止,我的想法是在服务器端启动一个新线程,该线程处理所有路由并仅与对话中的这两个客户端进行通信。
- 等待更多用户连接- 虽然我预计连接到我的服务器的人不会超过两个,但我想这样做,以便理论上服务器可以处理多个对话。我相信这将是我的主线程,等待某人连接然后为他们创建一个侦听器线程。建立对话后,该线程将为该对话提供自己的线程,然后返回它正在执行的操作。这应该可以在一个线程中完成(至少根据我的逻辑)。
就是这样。现在,当然还有我没有包括的图形之类的东西。此外,凭借我在 Java 中所拥有的一切,我应该能够在两个以上的人之间进行对话。尽管如此,这似乎我使用了过多的线程。有一个主线程,每个用户一个线程,每个对话一个线程。这意味着在有 1000 个用户聊天时,我已经启动了 1501 个新线程。这过分吗?我可以使用某种类型的线程池吗?你还有什么建议?如果我错过了什么,请问(如果它是我没有想到的,那么我也会这么说)。最后,如果您对该程序的实际功能有任何想法,我将很高兴听到。
【问题讨论】:
-
是的,这太过分了。聊天的带宽比较低,你应该可以只用一个线程写服务器。客户端通常需要两个线程——一个用于侦听来自服务器的消息,一个用于其他一切:GUI、发送消息等。
-
另外,你的问题很开放,而且不是很好。请阅读帮助中心常见问题解答,了解要问什么样的问题:stackoverflow.com/help/dont-ask
-
这样一个简单的聊天应用程序只需使用标准的 Java API 即可轻松编写。你可以例如使用
ExecutorService创建少量线程,然后使用AsynchronousSocketChannel允许每个线程处理大量并发连接。
标签: java multithreading architecture software-design instant-messaging