gpt4 book ai didi

Java套接字编程中的线程间通信问题

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:43 25 4
gpt4 key购买 nike

我开始从事 Java Socket 编程。我已经制作了以下应用程序:1. 客户端向服务器发送消息,服务器收到消息后做出响应2.客户端和服务器像点对点聊天一样聊天

现在我想开发一个应用程序,其中每当请求到达服务器时,它都会为其生成一个线程。但现在的问题是,我无法识别线程。如果一个线程正在发送消息,那么服务器如何识别消息来自该客户端,并且我必须将其转发给该客户端。两个客户端(实际上是他们的线程)如何通信?

我搜索了它,我找到了synchronized关键字并且我知道它的用法,我知道wait()、notify()和notifyAll(),但我仍然无法提供它们之间的通信。

如果我做错了什么或者我需要在进入这个概念之前了解一些概念,请向我提供有关这方面的知识。TIA

最佳答案

您不能将数据传递给线程,只能将数据传递给它们正在读取的数据结构。

我建议您使用这个简单的模式,每个连接使用两个线程和一个输出队列。这些线程在连接被接受时创建并运行直到连接关闭。如果您的连接生命周期较短,则可以使用线程池。

每个连接都有一个读取器线程,它从套接字读取数据,直到使用阻塞 IO 关闭连接。该读取线程还处理客户端行为的工作。

每个连接的另一个线程从 BlockingQueue 中读取消息并将其写入套接字。

当用户连接时,他们会传递一个唯一的 token 来说明他们是谁,该 token 存储在 ConcurrentMap<String, BlockingQueue> 中其中 BlockingQueue 是该连接的输出队列。

这样,每当连接向特定用户发送消息时,您就可以将其添加到与该用户关联的队列中。

您可以减少此模型以使用更少的线程,例如使用选择器,您只需要一个线程,但这要复杂得多。

关于Java套接字编程中的线程间通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31623447/

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