我想使用swing作为接口在java中编写聊天应用程序。
我提出了一个想法(在Madprogrammer的帮助下),但我不确定这是否是最好的方法。
main
线程中有两个Blockinqueue
队列,一个用于传入消息,一个用于传出消息。
有四个线程,两个线程用于外向,两条用于传入消息,一个用于处理GUI和插座。
线程用于传出消息:
-
ActionListener (Swing)
:当用户单击GUI中的"发送"时,会触发。该线程将新消息添加到即将发出的队列中,并在其上触发notifyAll()
。 -
socketOutgoing
:可以访问套接字。睡觉,wait()
在即将离职的队列上,直到通知。通过插座发送新消息,然后再次入睡。
传入消息的线程:
-
socketIncoming:
可以访问套接字。不断检查新的插座中的消息(如何?)。当有新消息时,将其添加到上流的队列和触发notifyAll()
。 -
Swingworker displayIncoming
:睡觉,在传入队列上使用wait()
,直到通知它为止。在GUI中显示新消息,然后再次回到睡眠。
从理论上讲这将起作用,但为此有四个线程似乎有些混乱(并且不可靠)。
是否有更实用的解决方案?
对未来读者的注意:我对socketIncoming
的描述被误导了:无法"连续检查套接字中的新消息"。
当您致电ObjectInputStream#readObject()
时,没有新的消息,它只是等待或"块",直到新消息到达为止。没有办法事先检查新消息是否已经到来。看到这个问题。
如果我正在考虑做类似的事情,我可能会设置两个队列,即一个外向且传入的队列。这些将用于"舞台"消息。
的想法是,即将发出的消息将被放置在排出的队列中,而当Thread
能够弹出时,它将弹出下一条消息并将其发送。当队列为空时,它只会"等待",直到新消息可用为止。
该概念将反向传入的队列起作用。Thread
会读取一条消息,然后将其推到传入的队列中。
其他一些过程(可能是SwingWorker
)将监视队列并弹出下一条消息,并与GUI重新同步。
您可能会发现某些用途的秋千。
尽管
对于简单的聊天应用程序,您将有两个部分
- 客户零件
- 服务器部分。
现在,您必须确定要用于通信[TCP]或[UDP]的协议。尽管您的消息传输应该是可靠的,因此您必须使用Java TCP serversocket。您的服务器将是每个客户端连接的多线程手段,将具有单独的线程来处理该客户端的所有消息通信。
对于客户端,它将具有GUI组合和一个专用线程,以从服务器接收消息。当您想向任何用户发送消息时,只需传递消息并通过客户端套接字发送。