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
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();
}