多线程聊天程序架构

时间:2016-03-27 00:19:01

标签: java multithreading architecture software-design instant-messaging

目前我正在制作一个聊天程序(在java中为那些想知道的人)而且我正处于需要为整个事情提出一个好的架构的地方。这是我目前的大纲,但随时提供任何反馈(我没有专业培训,只是一些阅读)。

客户端:

生命周期如下:

  1. 与服务器连接 - 首先,我计划让客户端与服务器建立连接,提示用户登录或创建新帐户,然后将这些凭据发送到服务器,然后发回用户朋友列表和我能想到的任何其他相关数据等信息。
  2. 等待用户与某人建立联系会有一个目前在线且用户可以连接的朋友列表以及一个查找和请求其他用户成为朋友的按钮它们。
  3. 聊天我会在服务器部分详细介绍,但是用户会将文本和图片发送到服务器,然后将其发送给其他用户。
  4. 冲洗并重复 - 用户完成聊天后,将返回步骤2,直到退出程序,此时它将关闭与服务器的所有连接。
  5. 似乎客户端只需要是单线程的。此外,如果您考虑到许多IM类型程序具有的任何有用(主要)功能,请分享它们。我很高兴听到(如果你想让我非常开心,那么你也可以包括实施的大纲:)。

    服务器端

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

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

    目前关于聊天看起来像服务器端的想法:

    1. 与一个客户建立连接 - 服务器和客户端进行通信并让客户端登录(或注册),服务器告诉客户端其朋友是谁,客户端是否已添加到列表中目前在线用户此外,此时我正在启动一个新线程来侦听来自此客户端的输入
    2. 客户选择与某人开始对话 - 此时我认为我需要为此对话创建一个新线程,因为其中许多线程需要同时进行。到目前为止,我的想法是,我在服务器端启动一个新线程,它处理所有路由,并与对话中的这两个客户端通信。
    3. 等待更多用户连接 - 虽然我预计不会有超过两个人连接到我的服务器,但我想这样做,理论上服务器可以处理多个对话。我相信这将是我的主线程,等待某人连接然后为他们创建一个监听器线程。一旦建立了对话,该线程就会给该对话提供自己的线程,然后回到它正在做的事情。这应该只能在一个线程中完成(至少根据我的逻辑)。
    4. 就是这样。现在,当然还有像我没有包含的图形和诸如此类的东西。此外,凭借我在Java中所拥有的,我应该能够在两个以上的人之间进行对话。尽管如此,这似乎是我使用了过多的线程。有主线程,每个用户一个线程,每个对话一个线程。这意味着有1000个用户聊天,我已经启动了1501个新线程。这太过分吗?我可以使用某种类型的线程池吗?您有什么其他建议吗?如果我错过任何东西,只要问(如果它是我没有想到的东西那么我也会这么说)。最后,如果您对该计划的实际功能有任何想法,我会很高兴听到。

2 个答案:

答案 0 :(得分:1)

每个会话的一个主题或所有会话的一个主题都不会扩展。你需要介于两者之间。

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

只要有可用的线程(即,您没有太多消息要立即处理),就应该立即处理该消息。

如果要处理的消息多于池中的线程,则处理某些消息会有延迟。虽然这并不理想,但评论说聊天程序需要相当低的处理/带宽,但管理线程池的最大大小意味着你不会破坏处理器或耗尽内存。非常适合扩展解决方案。

随着硬件大小的增加,并发线程的数量会增加,但这听起来不像是一个问题。

答案 1 :(得分:0)

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