gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:11:26 24 4
gpt4 key购买 nike

我想用 Java 编写一个聊天应用程序,使用 Swing 作为界面。

我想出了一个主意(在 MadProgrammer 的帮助下),但我不确定这是否是解决此问题的最佳方法。

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

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

传出消息的线程:

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

传入消息的线程:

  1. socketIncoming: 可以访问套接字。不断检查新的套接字中的消息(如何?)。当有新消息时,将其添加到传出队列并在其上触发 notifyAll()
  2. Swingworker displayIncoming:在传入队列上使用 wait() hibernate ,直到收到通知。在 GUI 中显示新消息,然后再次进入 hibernate 状态。

虽然这在理论上可行,但为此设置四个线程似乎有点困惑(而且不可靠)。

有没有更实用的方案?

future 读者请注意:我对 socketIncoming 的描述被误导了:不可能“持续检查套接字中的新消息”。

当您调用 ObjectInputStream#readObject() 并且没有新消息时,它只是等待或“阻塞”,直到新消息到达。没有办法事先检查是否有新消息到达。 See this question .

最佳答案

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

想法是传出消息将被放入传出队列,当 Thread 能够时,它会弹出下一条消息并发送。当队列为空时,它会简单地“等待”直到有新消息可用。

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

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

您可能会找到 Concurrency in Swing有一定的用处。

底层协议(protocol)的实际工作方式将决定更多细节

关于使用 Swing 的 Java 聊天应用程序(概念),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com