2013-01-22 63 views
0

如何以適當的方式設計服務器的類,它由簡單的客戶端消息管理?該服務器使用事件模型向父應用程序通知客戶端請求。它使用異步套接字。服務器負載可能非常有限。帶事件的套接字包裝

這是我想嘗試:

class Client 
{ 
private Socket sock; 

public event EventHandler Start; 
public event EventHandler Stop; 
public event RequestEventHandler Request; 

public Client(TcpClient Client) 
//sock.BeginReceive 

private void OnReceived(IAsyncResult ar) 
//Dissect incoming stream into messages 
//Call event handlers 
//sock.BeginReceive 

public void AnswerRequest(byte[] answer) //either this way or 
private void OnSend(IAsyncResult ar)  //direct call of sock.BeginSend 
} 

class Server 
{ 
private TcpListener Listener; 
public List<Client> Clients; 

public event EventHandler ClientConnected; 

public Server(int port) 
//Listener.BeginAcceptTcpClient 

private void AcceptTcpClientCallback(IAsyncResult ar) 
//Get TcpClient 
//Create new Client with TcpClient as a parameter 
//Launch ClientConnected, where one should sign for Client events 
//Listener.BeginAcceptTcpClient 
} 
+1

我建議將此移至programmers.stackexchange.com,概念設計似乎比這裏更正確。 – Destrictor

回答

0

我使用NITO異步庫,它已simpleserversocket和簡單的客戶端。 非常容易使用。 Nito Async

+0

很簡單的答案,但是當試圖深入時,我偶然發現了Nito代碼中的一個很好的模式,標題爲「將基於IAsyncResult的通知轉換爲基於事件的通知的標準方式」。這是我的一天,謝謝) – ZuOverture

0
How would one design a class for server, which is managed by simple client messages, 
    in a proper way? 

這取決於哪一個I /使用O策略。與Winsock進行通信有幾種不同的約定,每種方法都有明顯的優勢。

  • 阻止套接字
  • 純非阻塞套接字
  • 異步插座
  • 選擇()
  • 事件對象
  • 重疊I/O

類異步客戶端設計套接字: 用您的回調添加Stateobject。從客戶端套接字讀取數據需要一個在異步調用之間傳遞值的狀態對象。

  public class StateObject 
     { 
      public Socket workSocket = null; 
      public const int BufferSize = 256; 
      public byte[] buffer = new byte[BufferSize]; 
      public StringBuilder sb = new StringBuilder(); 
     } 

來源:See msdn sample的詳細設計。