【发布时间】:2011-03-26 04:06:37
【问题描述】:
我的任务是用 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
这是一个合理的解决方案吗?
我遇到的另一个问题是,如果一个工作人员由于客户端断开连接而失败,我如何将其传达给另一个线程?如果一个线程出现故障,我想终止另一个线程。
谢谢
【问题讨论】:
标签: java multithreading tcp client