繁体   English   中英

Java TCP Server中用于输入和输出的单独线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM