[英]Separate threads for input and output in Java TCP Server
我的任务是用Java编写TCP服务器和客户端。 我在确定服务器的一般结构时遇到了一些麻烦。 服务器必须接受多个连接,但是没有请求响应协议。 建立连接后,客户端可以将数据发送到服务器,而服务器可以将数据发送到客户端。 鉴于此,我认为将每个连接都具有独立的输入和输出线程是一个好主意。 我浏览了许多示例,但大多数示例都非常简单,没有用于输入和输出的单独线程。 我将不胜感激任何帮助或建议。
到目前为止,我的tcp服务器具有一个侦听线程,用于侦听客户端连接。 建立连接后,我将为该连接创建一个输入线程和一个输出线程。
在TCPServer中
while (true)
{
SocketChannel clientChannel = m_serverChannel.accept();
new Thread(new ReadWorker(clientChannel)).start();
new Thread(new WriteWorker(clientChannel)).start();
}
我应该如何传递要发送到输出线程的数据? 我最初的想法是让输出线程在未决数据队列上侦听,并在数据可用时发送数据。
在TCPServer中
ConcurrentHashMap<SocketChannel, LinkedBlockingQueue<ByteBuffer>> pendingWrites
= new ConcurrentHashMap<SocketChannel, LinkedBlockingQueue<ByteBuffer>>();
void broadcast(ByteBuffer buffer) {
synchronized(pendingWrites) {
Iterator it = pendingWrites.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
((LinkedBlockingQueue<ByteBuffer>) pairs.getValue()).put(buffer);
}
}
在WriteWorker中
pendingWrites.get(socketChannel).take()
// send the data
这是一个合理的解决方案吗?
我遇到的另一个问题是,如果一个工作程序由于客户端断开而失败,如何将其传达给另一个线程? 如果一个线程失败,我想终止另一个线程。
谢谢
您不使用单独的输入和输出线程。 您有一个套接字,可以对其进行读写。
如果您需要服务器输出某些内容而没有从客户端获取输入,则可以使用超时来阻止读取,或者使用Selector
(好像您正在使用nio)
我在一个关于SO的答案中给出了一个示例,该示例可以帮助您: 检查Java TCP服务器上的客户端断开连接-仅输出
这不是使用新的NIO类,而是显示了如何使用带超时的阻塞读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.