多线程聊天程序体系结构



目前我正在制作一个聊天程序(对于那些想知道的人来说是用java编写的),我正处于需要为整个事情制定一个好的架构的阶段。这是我目前的大纲,但请随时提供任何反馈(我没有受过专业培训,只是读了一些书)。

客户端:

生命周期如下:

  1. 连接服务器-首先,我计划让客户端与服务器建立连接,提示用户登录或创建新帐户,并将这些凭据发送到服务器,然后服务器会发回用户朋友列表等信息以及我能想到的任何其他相关数据
  2. 正在等待用户与某人连接-将有一个当前在线的用户可以连接的朋友列表,以及一个用于查找和请求其他用户与他们成为朋友的按钮
  3. 聊天-我将在服务器部分详细介绍,但用户将向服务器发送文本和图像,服务器将继续将其发送给其他用户
  4. 冲洗并重复-用户完成聊天后,将返回步骤2,直到他们退出程序,此时将关闭与服务器的所有连接

客户端似乎只需要是单线程的。此外,如果你认为许多IM类型的程序有任何有用的(主要)功能,请分享。我很高兴听到(如果你想让我很高兴,那么你也可以包括一个实施的总体纲要:)。

服务器端

现在这里变得相当混乱。我认为我正在创建比我需要的更多线程的方法。让我解释一下。

  • 服务器使用每个用户的JSON表示来存储每个客户端的信息。此外,还维护了当前在线用户的列表

当前关于服务器端聊天的想法:

  1. 与一个客户端建立的连接-服务器和客户端进行通信并让客户端登录(或注册),服务器告诉客户端其朋友是谁,客户端被添加到当前在线的用户列表中。同样,在这一点上,我正在启动一个新线程来侦听来自该客户端的输入
  2. 客户选择与某人开始对话-此时,我认为我需要为此对话创建一个新的线程,因为其中许多需要同时进行。到目前为止,我的想法是在服务器端启动一个新线程,该线程处理所有路由,并仅与会话中的这两个客户端通信
  3. 等待更多用户连接-虽然我从未想过会有两个人以上连接到我的服务器,但我希望这样做,理论上服务器可以处理多个对话。我相信这将是我的主线程,等待有人连接,然后为他们创建一个监听器线程。一旦建立了一个对话,这个线程就会给这个对话提供自己的线程,然后返回到它正在做的事情。这应该能够在一个线程中完成(至少根据我的逻辑)

就是这样。现在,当然还有一些像图形之类的东西我没有包括在内。此外,凭借我在Java中的优势,我应该能够在两个以上的人之间进行对话。尽管如此,我似乎使用了过多的线程。有一个主线程,每个用户一个线程,每个会话一个线程。这意味着,随着1000名用户的聊天,我已经开始了1501个新线程。这过分了吗?我可以使用某种类型的线程池吗?你还有什么其他建议?如果我错过了什么,就问问(如果是我没有想到的,我也会这么说)。最后,如果你对这个节目的实际功能有什么想法,我很高兴听到。

无论是每个会话一个线程,还是所有对话一个线程都无法扩展。你需要介于两者之间的东西。

使用具有一定最大允许线程数的线程池,对于为会话接收的每个消息,将消息的处理排队到线程池。

只要有可用的线程(即,一次处理的消息不多),就应该立即处理该消息。

如果要处理的消息比池中的线程多,则在处理某些消息时会出现延迟。尽管这并不理想,就像评论中所说的聊天程序需要相当低的处理/带宽,但管理线程池的最大大小意味着你不会耗尽处理器或内存。是缩放解决方案的理想选择。

随着硬件大小的增加,并发线程的数量可能会增加,尽管这听起来不会成为问题。

我建议您使用www.netty.io。有一些教程可以开发聊天客户端/服务器:http://www.allreadable.com/6b8c8U4g

最新更新