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