<分区>
嘿,我正在为 C# 异步套接字编程做噩梦。你能给我指一个指南或教程或一本深入解释异步编程的书吗?如果可能包含如何在 Begin Send/Receive 函数中使用 state 参数来处理多个客户端。
<分区>
嘿,我正在为 C# 异步套接字编程做噩梦。你能给我指一个指南或教程或一本深入解释异步编程的书吗?如果可能包含如何在 Begin Send/Receive 函数中使用 state 参数来处理多个客户端。
最佳答案
服务器可以按这样的场景组织:用于客户端连接的独立线程监听端口。
/// Async server
public class AsyncServer
{
/// Server socket
private Socket _serverSocket;
/// Element for sync wait
private static ManualResetEvent _connectionMutex =
new ManualResetEvent(false);
/// Client handler
private ClientManager _clientManager;
public AsyncServer(string ipAddrees, int port)
{
try
{
this._serverSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
this._serverSocket.Bind(
new IPEndPoint(IPAddress.Parse(ipAddrees), port));
}
catch (Exception ex)
{
throw new Exception("Server Init Error.", ex);
}
}
private BackgroundWorker _listenThread = new BackgroundWorker();
public void Start()
{
this._clientManager = new ClientManager(this._clientConnections);
this._listenThread.WorkerReportsProgress = true;
this._listenThread.WorkerSupportsCancellation = true;
this._listenThread.DoWork +=
new DoWorkEventHandler(ListenThread_DoWork);
this._listenThread.RunWorkerAsync(this._serverSocket);
}
/// Thread for listening port
private void ListenThread_DoWork(object sender, DoWorkEventArgs e)
{
Socket serverSocket = (Socket)e.Argument;
serverSocket.Listen(100);
while (true)
{
// reset mutex
_connectionMutex.Reset();
serverSocket.BeginAccept(
new AsyncCallback(this.AcceptCallback), this._serverSocket);
// waiting for the next connection
_connectionMutex.WaitOne();
}
}
/// List of client connections
private List _clientConnections = new List();
public int ConnectionsCount
{
get { return this._clientConnections.Count; }
}
/// Callback method for handling connections
private void AcceptCallback(IAsyncResult asyncResult)
{
_connectionMutex.Set();
Socket serverSocket = (Socket)asyncResult.AsyncState;
Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult);
this._clientConnections.Add(clientSocket);
this._clientManager.HandleClient(clientSocket);
}
}
AcceptCallback(IAsyncResult asyncResult) 方法处理所有新的客户端连接并将传输到 ClientManager,后者为每个客户端创建单独的线程。
public class ClientManager
{
private List _clientProcessors = new List();
private List _connections;
public ClientManager(List connections)
{
this._connections = connections;
}
/// Handling of client connection
public void HandleClient(Socket clientSocket)
{
BackgroundWorker clientProcessor = new BackgroundWorker();
clientProcessor.DoWork += new DoWorkEventHandler(ClientProcessing);
this._clientProcessors.Add(clientProcessor);
List args = new List();
//
// args.Add(...);
clientProcessor.RunWorkerAsync(args);
}
private void ClientProcessing(object sender, DoWorkEventArgs e)
{
// reading args
List args = (List)e.Argument;
ProtocolSerializer serializer = new ProtocolSerializer();
try
{
while (socket.Connected)
{
// ...
}
}
catch (SocketException)
{
// ...
}
catch (Exception)
{
// ...
}
}
}
关于C#套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1392514/