C# 带有事件的套接字包装器

C# 带有事件的套接字包装器,c#,sockets,events,wrapper,C#,Sockets,Events,Wrapper,如何以适当的方式为服务器设计一个由简单客户端消息管理的类?此服务器使用事件模型通知父应用程序有关客户端请求的信息。它使用异步套接字。服务器负载可能非常有限 这就是我要尝试的: class Client { private Socket sock; public event EventHandler Start; public event EventHandler Stop; public event RequestEventHandler Request; public Client(Tcp

如何以适当的方式为服务器设计一个由简单客户端消息管理的类?此服务器使用事件模型通知父应用程序有关客户端请求的信息。它使用异步套接字。服务器负载可能非常有限

这就是我要尝试的:

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
}
类客户端
{
私人插座;
公共事件事件处理程序启动;
公共事件处理程序停止;
公共事件请求EventHandler请求;
公共客户端(TcpClient客户端)
//短袜
收到时的专用作废(IAsyncResult ar)
//将传入流分解为消息
//调用事件处理程序
//短袜
public void AnswerRequest(byte[]answer)//以这种方式或
private void OnSend(IAsyncResult ar)//直接调用sock.BeginSend
}
类服务器
{
私有TcpListener侦听器;
公开名单客户;
公共事件事件处理程序ClientConnected;
公共服务器(int端口)
//Listener.BeginAcceptTcpClient
专用void acceptCpclientCallback(IAsyncResult ar)
//获取TcpClient
//使用TcpClient作为参数创建新客户端
//启动ClientConnected,用户应在其中为客户端事件签名
//Listener.BeginAcceptTcpClient
}

我正在使用nito异步库,它有simpleserversocket和SimpleClient。 非常容易使用。

这取决于要使用的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();
         }

资料来源:详细设计。

我建议将此移到programmers.stackexchange.com,那里的概念设计似乎比这里更正确。答案相当简短,但在试图深入研究的过程中,我在标题为Nito的代码中偶然发现了一个不错的模式“将基于iSyncResult的通知转换为基于事件的通知的标准方式”。这让我很高兴,谢谢)
          public class StateObject 
         {
            public Socket workSocket = null; 
            public const int BufferSize = 256;   
            public byte[] buffer = new byte[BufferSize];
            public StringBuilder sb = new StringBuilder();
         }