2012-09-27 47 views
0

我目前正在學習和使用客戶端/服務器,並且我在如何存儲連接方面遇到了一些困難。存儲連接的客戶端?

下面是一些示例代碼:

while (_isRunning) 
{ 
    if (!tcpListener.Pending()) 
    { 
     Thread.Sleep(200); 
     continue; 
    } 

    TcpClient client = tcpListener.AcceptTcpClient(); 
    // TODO: handle connection 
} 

我知道我將不得不將接收/發送數據給定的客戶端但處理程序,只具有處理程序將不會允許我做這樣的事情知道如何許多客戶端已連接,向所有客戶端發送廣播消息或關閉消息。

將客戶端存儲在列表中應該沒問題,還是應該存儲其他內容?

在這種情況下存儲連接的客戶端的正確方法是什麼?

+0

這裏可能使用'Dictionary'或'List'。 '列表'應該足夠了。 – Matthew

+0

@Matthew是的,但我的意思是,只是列表就足夠了?除了TcpClient之外,我還應該保留其他任何信息,以便創建我的連接客戶端列表嗎?我只是在尋找一些關於如何去做的很好的方法的參考 – Guapo

+0

這取決於你感興趣的信息。如果你關心的只是連接的數量並且能夠廣播消息,那麼一個簡單的TcpClient列表就足夠了。 – Matthew

回答

1

對於大多數常見的使用模式,保持連接客戶端的List就足夠了。主要興趣點將決定:什麼

對於許多應用程序來說,純粹的TCP功能並不方便使用,因此您需要在其上面使用一層,將流轉換爲更像消息隊列的消息隊列,從中可以抽取完整的自包含「消息」這些消息的格式取決於您的應用程序。

我挖掘了一個老的項目,這是一個客戶端 - 服務器配置,其中多個客戶端連接到服務器並提供遠程控制功能。在該項目中的服務器保持一個List<ConnectedClient>其中:

// This is the whole actual class 
private class ConnectedClient 
{ 
    public TcpMessageConnection Connection { get; private set; } 

    public bool ConnectedEventRaised { get; set; } 

    public ConnectedClient(TcpMessageConnection connection) 
    { 
     this.Connection = connection; 
    } 
} 

而且TcpMessageConnection樣子:

// Only class outline shown 
public class TcpMessageConnection 
{ 
    private readonly MessageStream messageStream; // another custom class 

    private readonly TcpClient tcpClient; 

    public EndPoint RemoteEndPoint { get; private set; } // who connected here? 

    public MessageReader MessageReader { get; } // messageStream.Reader 

    public MessageWriter MessageWriter { get; } // messageStream.Writer 

    public bool IsCurrentlyDisconnecting { get; private set; } 

    public void Close(); 
} 
MessageReader

一起和MessageWriter(其真正的做到了繁重的),這是足以實施async-該服務器在單個線程上爲多個客戶端提供服務。

+0

這很有趣,是項目開源嗎?我很想檢查更多。我喜歡它如何捆綁連接的用戶,很容易檢索一些有用的數據,如IP,並且我假設你的關閉是發送關閉或關閉該客戶端? – Guapo

+0

@Guapo:不開源,對不起。 'Close'只是簡單地關閉'MessageStream'(它依次關閉'TcpClient'的'Stream')和'TcpClient'本身。 「IsCurrentlyDisconnecting」在此之前設置爲「true」,並用作警衛,因此應用的其餘部分不必擔心垃圾郵件關閉並導致某種錯誤。 – Jon

0

對於服務器,您通常對套接字不感興趣,因爲您在套接字的用途。我會採取的方法是創建一個類來管理客戶端和服務器之間的對話的服務器端。這個類將基於一個線程,所以想法是每次連接被接受時,你分離一個線程來處理對話,並且在該線程中是連接的服務器端的套接字。

此時您將管理各種線程而不是單個套接字。這是一個更高層次的抽象,更有用。

你如何管理線程取決於你想要做什麼。這可能是你真的不想擔心它。由於每個線程都有自己的功能,當它完成時,它會關閉TCP連接的結束並退出。

但是,直到它退出,線程類纔會處理對話的服務器端。

我建議你檢查這個計算器,Best way to accept multiple tcp clients