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

时间:2015-07-25 05:54:03

标签: java multithreading sockets java-io

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您无法将数据传递给线程,您只能将数据传递给他们正在阅读的数据结构。

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

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

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

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

这样,只要连接发送消息以转发给特定用户,就会将其添加到与该用户关联的队列中。

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