Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Swing的Java聊天应用程序(概念)_Java_Multithreading_Swing_Sockets - Fatal编程技术网

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

使用Swing的Java聊天应用程序(概念),java,multithreading,swing,sockets,Java,Multithreading,Swing,Sockets,我想用Java编写一个聊天应用程序,使用Swing作为接口 我在的帮助下想出了一个主意,但我不确定这是否是最好的办法 主线程中有两个Blockinqueue队列,一个用于传入消息,另一个用于传出消息 有四个线程,两个用于传出消息,两个用于传入消息,每个线程一个用于处理GUI和套接字 传出消息的线程: ActionListener Swing:当用户在GUI中单击发送时触发。线程将新消息添加到传出队列中,并触发notifyAll。 socketOutgoing:可以访问套接字。休眠,等待传出队列,

我想用Java编写一个聊天应用程序,使用Swing作为接口

我在的帮助下想出了一个主意,但我不确定这是否是最好的办法

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

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

传出消息的线程:

ActionListener Swing:当用户在GUI中单击发送时触发。线程将新消息添加到传出队列中,并触发notifyAll。 socketOutgoing:可以访问套接字。休眠,等待传出队列,直到收到通知。通过套接字在传出队列中发送新消息,然后再次返回睡眠状态。 传入消息的线程:

socketIncoming:可以访问套接字。不断检查是否有新的 套接字中的消息如何?。当有新消息时,将其添加到 传出队列及其上的所有触发器。 Swingworker displayIncoming:休眠,等待传入队列,直到收到通知。在GUI中显示新消息,然后再次返回睡眠状态。 虽然这在理论上是可行的,但有四个线程来实现这一点似乎有点混乱和不可靠

有更实际的解决办法吗

未来读者注意:我对socketIncoming的描述是错误的:不可能持续检查socket中的新消息


当您调用ObjectInputStreamreadObject,并且没有新消息时,它只是等待或阻止,直到新消息到达。没有办法事先检查是否有新邮件到达

如果我想做类似的事情,我可能会设置两个队列,一个传出队列和一个传入队列。这些将被用来传递信息

其思想是,传出消息将被放入传出队列,当线程能够这样做时,它将弹出下一条消息并发送它。当队列为空时,它只需等待新消息可用

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

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

你可能会发现它有些用处


底层协议的实际工作方式将规定更多的细节,尽管对于一个简单的聊天应用程序,您应该有两个部分

客户部分 服务器部分。 现在,您必须决定要使用哪种协议进行通信[Tcp]或[Udp]。虽然您的消息传输应该是可靠的,所以您必须使用java Tcp服务器套接字。您的服务器将是多线程的,这意味着与服务器连接的每个客户端将有单独的线程来处理来自该客户端的所有消息通信


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

谢谢你的回答。我会调查的。我已经添加了很多细节。你能看一下并告诉我你的想法吗?你可能想对阻塞队列进行搜索,因为这些队列实际上可以减少一些工作量。另外,这完全取决于协议的编写方式。发送消息时应该有某种收据,例如,如果消息接收正常、已传递或因某种原因被拒绝,则立即通知发件人。这使问题复杂化,因为您不能简单地从另一个线程中的传入流中读取下一条消息,因为它可能会获取协议消息,例如……非常多。这样做的目的是,如果您可以找到一个实现来执行此操作,那么当您调用get时,它们应该会阻止,直到有东西可用为止。啊,应该是……但是您需要仔细阅读文档,因为poll方法的大多数状态类似,或者如果此队列为EmptyTanks,则返回null,我已经决定使用TCP,目前正在对客户端进行编码。我已经编辑了我的答案,你能看一下吗?如何在套接字中不断检查新消息?基本上是在运行{checkForMessage;}时,但您不希望它完全精神错乱地运行。您可以查看和它的旧版本,以便以一定的速率调度单个任务。对于这个多线程的系统来说,使用四个线程似乎有点混乱和不可靠,因为多个线程使复杂的任务远离EDT,GUI响应速度更快。谢谢你,我将对此进行研究。