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
}
4

2 回答 2

0

我正在使用 nito 异步库,它有 simpleserversocket 和简单的客户端。非常容易使用。 Nito 异步

于 2013-01-22T08:25:55.233 回答
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();
         }

来源:有关详细设计,请参阅 msdn 示例

于 2013-01-22T09:18:33.950 回答