2011-10-08 128 views
-1

我正在用Java編寫一個Server/Client程序。服務器等待連接,然後爲該連接創建一個新線程。服務器然後返回並偵聽其他端口上的連接。用java多線程服務器/客戶端,如何判斷客戶端線程是否關閉?

sck = srvrSckt.accept(); 
server.numConnections++; 
System.out.print("Connection was made on " + server.port[i] + ".\n"); 
Connections conn = new Connections(sck); 
server.threads[i] = new Thread(conn); 
server.threads[i].start(); 

一個連接已完成後,我想回去檢查是否有以前的連接已經關閉。然後我會將這些端口標記爲可供將來的連接使用。有沒有辦法做到這一點?

我已經讀過,線程間通信的最佳方式是使用共享變量。但是,我找不到這樣的一個好例子。另外,我不確定共享變量是否可行,因爲我不僅要檢查已成功關閉的連接,還要檢查突然斷開連接的連接。

任何幫助你可以提供將不勝感激。謝謝。

編輯:

這是代碼的一個較大的部分。這可能會讓我的問題更清楚。

if (server.isAvailable[i] == true) 
{ 
    availablePort = server.allPorts[i]; 
    server.isAvailable[i] = false; 
    ServerSocket srvrSckt = new ServerSocket(availablePort); 
    System.out.println("Waiting for connection on port " + availablePort + "..."); 
    srvrSckt.setSoTimeout(5000); 
    try { 
     sck = srvrSckt.accept(); 
     server.numConnections++; 
     System.out.print("Connection was made on " + server.port[i] + ".\n"); 
     Connections conn = new Connections(sck); 
     server.threads[i] = new Thread(conn); 
     server.threads[i].start(); 
    } catch (Exception e) { 
    server.isAvailable[i] = true; // no connection was made 
    srvrSckt.close(); 
} 
+1

'你的意思是,你將標誌着這些端口avalaible'你有什麼端口開放的X號和要到服務器只佔1級的要求嗎?端口?我不明白你的問題 – Cratylus

+0

什麼端口? TCP服務器只使用一個端口。您根本不必管理它,更不用說將其標記爲可用於未來的連接。而'客戶端線程'沒有關閉,客戶端*連接*被關閉。你的問題仍然模糊。請重申。 – EJP

+0

@ user985637,您可能希望選擇一篇文章作爲您接受的答案,這是SO上的一個非常好的練習。 – Bhaskar

回答

1

據我瞭解,您對傳入的遠程TCP連接分配端口完全沒有控制。這是操作系統的工作。當Socket.isClosed返回true或當Socket.getInputStream.read返回-1表示流結束時,將關閉套接字。

+1

當* *關閉*這個套接字時,Socket.isClosed()返回true。*當對等關閉連接時它不會告訴你:EOS會這樣做。 – EJP

1

一個連接已完成後,我想回去檢查是否有以前的連接已經關閉

通常情況下,一個會話結束在服務器上檢測與客戶的最佳途徑是在客戶端和服務器之間建立「再見協議」。客戶端向服務器發送一個固定令牌,並通過關閉該通道來確認服務器。如果客戶端突然終止,那麼在服務器上知道這一點的唯一方法是設置一個心跳協議,在每次不活動的時間內,服務器將ping客戶端,並且客戶端必須通過pingback進行響應。如果沒有響應,服務器必須終止客戶端會話。

至於共享線程之間的變量,你可以參考:http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

+0

那麼,你不需要做出再見的事情和心跳實現。在關閉連接之前,TCP本身接受超時值,所以如果在這段時間內沒有收到任何信息,則可以結束連接。 – SHiRKiT

+0

謝謝!這回答了我的問題。 – user985637