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



我想使用swing作为接口在java中编写聊天应用程序。

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

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

有四个线程,两个线程用于外向,两条用于传入消息,一个用于处理GUI和插座。

线程用于传出消息:

  1. ActionListener (Swing):当用户单击GUI中的"发送"时,会触发。该线程将新消息添加到即将发出的队列中,并在其上触发notifyAll()
  2. socketOutgoing:可以访问套接字。睡觉, wait()在即将离职的队列上,直到通知。通过插座发送新消息,然后再次入睡。

传入消息的线程:

  1. socketIncoming:可以访问套接字。不断检查新的插座中的消息(如何?)。当有新消息时,将其添加到上流的队列和触发notifyAll()
  2. Swingworker displayIncoming:睡觉,在传入队列上使用wait(),直到通知它为止。在GUI中显示新消息,然后再次回到睡眠。

从理论上讲这将起作用,但为此有四个线程似乎有些混乱(并且不可靠)。

是否有更实用的解决方案?

对未来读者的注意:我对socketIncoming的描述被误导了:无法"连续检查套接字中的新消息"。

当您致电ObjectInputStream#readObject()时,没有新的消息,它只是等待或"块",直到新消息到达为止。没有办法事先检查新消息是否已经到来。看到这个问题。

如果我正在考虑做类似的事情,我可能会设置两个队列,即一个外向且传入的队列。这些将用于"舞台"消息。

的想法是,即将发出的消息将被放置在排出的队列中,而当Thread能够弹出时,它将弹出下一条消息并将其发送。当队列为空时,它只会"等待",直到新消息可用为止。

该概念将反向传入的队列起作用。Thread会读取一条消息,然后将其推到传入的队列中。

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

您可能会发现某些用途的秋千。

尽管

,基础协议实际上的工作方式实际上将决定更多细节。

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

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

现在,您必须确定要用于通信[TCP]或[UDP]的协议。尽管您的消息传输应该是可靠的,因此您必须使用Java TCP serversocket。您的服务器将是每个客户端连接的多线程手段,将具有单独的线程来处理该客户端的所有消息通信。

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

最新更新