使用Swing的Java聊天应用程序(概念)

我想用Swing作为接口在Java中编写一个聊天应用程序。

我想出了一个想法(在MadProgrammer的帮助下),但我不确定这是否是最好的方法。

main线程中有两个Blockinqueue队列,一个用于传入消息,另一个用于传出消息。

有四个线程,两个用于传出,两个用于传入消息,每个用于处理GUI和套接字。

传出消息的线程:

  1. ActionListener (Swing) :当用户在GUI中单击“发送”时触发。 该线程将新消息添加到Outgoing Queue并在其上触发notifyAll()
  2. socketOutgoing :可以访问套接字。 在传出队列中wait() ,直到通知为止。 通过套接字在Outgoing Queue中发送新消息,然后再次进入hibernate状态。

传入消息的线程:

  1. socketIncoming:可以访问套接字。 在socket中连续检查新消息(如何?)。 当有新消息时,将其添加到Outgoing Queue并触发notifyAll()
  2. Swingworker displayIncoming :在传入队列中wait() ,直到通知为止。 在GUI中显示新消息,然后再次进入hibernate状态。

虽然这在理论上是可行的,但为此有四个线程似乎有点混乱(并且不可靠)。

有更实用的解决方案吗?

请注意未来的读者:我对socketIncoming描述是错误的:无法“在socket中连续检查新消息”。

当您调用ObjectInputStream#readObject() ,没有新消息,它只是等待或“阻塞”,直到新消息到达。 无法事先检查新消息是否已到达。 看到这个问题 。

如果我正在考虑做一些事情,我可能会设置两个队列,一个传出和传入队列。 这些将用于“暂存”消息。

想法是将传出的消息放入传出队列中,并且当Thread能够执行时,它会弹出下一条消息并发送它。 当队列为空时,它将“等待”直到新消息可用。

对于传入队列,该概念将反向工作。 Thread会读取一条消息并将其推送到传入队列。

其他一些进程(可能是SwingWorker )将监视队列并弹出其下一条消息并将其与GUI重新同步。

您可能会在Swing中找到并发使用的并发 。

底层协议实际上如何工作将决定更多的细节

对于简单的聊天应用程序,您应该有两个部分

  1. 客户部分
  2. 服务器部分。

现在,您必须决定要用于通信[Tcp]或[Udp]的协议。 虽然您的消息传输应该是可靠的,但您必须使用java Tcp ServerSocket。 您的服务器将是multithreading意味着每个客户端与服务器连接将具有单独的线程来处理来自该客户端的所有消息通信。

对于客户端,它将具有GUI组件和一个专用线程来接收来自服务器的消息。 当您想要向任何用户发送消息时,只需传递消息并通过客户端套接字发送。