簡體   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