我有一个多线程套接字服务器,它为每个连接的客户端创建一个单独的线程来进行一些数据处理。实际上,我可以从所有连接的客户端接收数据,并对每个客户端进行相同的数据处理。
我现在需要做的是在不阻塞通信的情况下向指定的连接客户端发送一些数据(我需要全双工通信)。我的问题是:
1)如何识别持有想要的客户的线程?2)是否可以在不阻塞通信的情况下向该客户端发送一些数据?
我有一个多线程套接字服务器,它为每个连接的客户端创建一个单独的线程来进行一些数据处理。实际上,我可以从所有连接的客户端接收数据,并对每个客户端进行相同的数据处理。
我现在需要做的是在不阻塞通信的情况下向指定的连接客户端发送一些数据(我需要全双工通信)。我的问题是:
1)如何识别持有想要的客户的线程?2)是否可以在不阻塞通信的情况下向该客户端发送一些数据?
您应该使用SocketChannel
. 它支持非阻塞通信的全双工。
有关它的更多信息,请参阅SocketChannel。
由于通道与流完全不同,这里有一个关于 SocketChannels 的简短教程,并从一个小示例开始。
我认为这可以通过使用单独的线程来读取(和处理)并向每个客户端发送。线程可以共享一个 BlockingQueue,例如 ArrayBlockingQueue,处理线程将写入它,发送线程将从它读取并发送给客户端。
实际上,另一种方法是将读取线程与处理线程分开,并让处理线程也进行发送。您可以使用 Executors.newSingleThreadExecutor 进行处理,并让读取线程通过 execute 方法向其发送“作业”。
您还可以使用 Apache MINA 等网络库,它为您实现所有细节,还可以使用具有可定制线程模型的异步套接字以获得更大的可扩展性。