- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我开始从事 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/
我是一名优秀的程序员,十分优秀!