2012-07-18 100 views
3

我在C#中創建了一個異步服務器以與我的Android應用程序一起運行。服務器與此類似:http://msdn.microsoft.com/en-us/library/fx6588te.aspx關閉異步連接

它運行良好,我可以有許多客戶端同時連接和從服務器接收數據。我發現的一個問題是,在我的Android應用程序中,如果您已通過Wifi連接並再次按下連接按鈕,則服務器會產生一個新套接字。服務器應該先殺掉舊的連接,然後創建一個新的連接。在Android方面,我確保打電話close(),甚至在之後將其設置爲空。我還向服務器發送斷開連接控制信號,以便它也可以在套接字上調用close()。例如,這裏就是我如何做到這一點的服務器:

if (state.storage.parseJson(content) == JsonStorage.DISCONNECT) 
{ 
    Console.WriteLine("Disconnect2!"); 
    state.workSocket.Shutdown(SocketShutdown.Both); 
    state.workSocket.Close(); 
    return; 
} 

當我檢查我的服務器進程在一個名爲「CurrPorts」程序它顯示了幾個連接打開我的不同端口上的Android設備。我使用Timer對象將數據發送給客戶端,並且還檢查連接是否處於活動狀態,否則關閉它。例如,我的TimerCallback方法:

public void TimeCallBack(object input) 
{ 
    StateObject state = (StateObject)input; 
    if (state.workSocket.Connected) 
    { 
     Send(state.workSocket, state.storage.getJson()); 
    } 
    else 
    { 
     Console.WriteLine("Dispose!"); 
     state.timer.Dispose(); 
     state.workSocket.Close(); 
    } 
} 

我想不出爲什麼我的服務器沒有關閉舊連接。應該只有與連接到服務器的設備一樣多的連接打開。如果這是一個線程化的阻塞服務器,那麼只需關閉線程就很容易,但我不確定在這種情況下要做什麼。

編輯:所以我剛剛刷新了CurrPorts程序後讓它坐了一會兒,它下降到一個建立連接。我的解決方案是否正確,Windows需要一段時間才能清除已創建的舊套接字連接?

回答

1

是的,Windows會保留有關插槽的信息一段時間。你可以通過netstat看到這一點,關閉的套接字在關閉後甚至在承載套接字的應用程序終止後將顯示TIME_WAIT狀態。