2013-01-22 28 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的详细设计。