Preguntas sobre la programación de redes asíncronas de sockets en C#
Hay algunos problemas con esta forma de escribir:
1) Dado que se utiliza la aceptación asincrónica, no es necesario iniciar el hilo en el lado del servidor.
2) Se estima que allDone es un ManualResetEvent.
El código del lado del servidor que utiliza Accept asincrónico es en realidad muy simple y no requiere sincronización ManualResetEvent
public?class?AppTCPServer
{
público?AppTCPServer(string?localIP,?int?port)
{
Socket?socket?=?new?Socket(AddressFamily.InterNetwork,?
SocketType.Stream,?
ProtocolType.Tcp);
EndPoint?localEP?=?new?IPEndPoint(IPAddress.Parse(localIP),?port);
socket.Bind(localEP);
socket.Listen(100);
socket.BeginAccept(AcceptAsync,?socket);
}
privado?void?AcceptAsync(IAsyncResult?ar)
{
Socket?socket?=?ar.AsyncState?as?Socket;
intenta
{
Socket?client?=?socket.EndAccept(ar);
Console.WriteLine("¡Conexión del cliente exitosa! Cliente: {0}",?client.RemoteEndPoint.ToString());
if(OnConnected!!=?null)
{
OnConnected(esto, ?new?ClientConnectedEventArgs(cliente));
}
}
catch(Exception?e)
{
Console.WriteLine("Se produjo una excepción en AcceptAsync, mensaje de excepción:\n{0}",?e.Message);
}
finalmente
{
//Continuar con Accept asincrónico
socket.BeginAccept(AcceptAsync,?socket);
}
}
//Evento después de que el cliente se conecta?OnConnect
public?event?EventHandlerlt.ClientConnectedEventArgsgt;?OnConnected;
}
// ?lt; resumengt;
//?Parámetros del evento: parámetros del evento después de recibir la conexión del cliente
//?lt;/summarygt;
public?clientConnectedEventArgs ?:?EventArgs
{
público?ClientConnectedEvent
Args(Socket? clientSocket)
{
ClientSocket?=?clientSocket;
}
¿público?
}
clase?Programa
{
estática?void?Main(cadena[]?args)
{
AppTCPServer?server?=?new?AppTCPServer(" 127.0.0.01",?8000);
server.OnConnected? =?server_OnConnected;
Console.WriteLine( "Presione cualquier tecla para finalizar el programa...");
Console.ReadKey();
}
static?Hello?from ?AppTCPServer" ;
client.Send(Encoding.Default.GetBytes(hello));
}
}¿Clase de programa de prueba del cliente?Program{
static?void?Main(string[]?args)
{
// Simular 100 clientes conectándose al servidor
para?(int? i?=?0;?i?lt;?100;?i)
{
Socket?socket?=?ConnectToServer("127.0.0.1" ,?8000);
byte[]?buffer?=?new?byte[1024];
int?bytesRecevied?=?socket.Receive(buffer,?buffer.Length ,?SocketFlags.None );
byte[]?messageBytes?=?new?byte[bytesRecevied];
Array.Copy(buffer,?bytesRecevied);
Consola. WriteLine(Encoding.Default.GetString(messageBytes));
socket.Disconnect(false);
socket.Close();
}
Console.ReadKey();
¿estático?Socket?ConnectToServer(string?serverIP,?int?serverPort)
{
Socket?socket ?=?new?Socket(AddressFamily.InterNetwork,?SocketType.Stream,?ProtocolType.Tcp);
EndPoint?localEP?=?new?IPEndPoint(IPAddress.Any,?0 );
socket.Bind(localEP);
socket.Connect(nuevo IPEndPoint(IPAddress.Parse(serverIP), serv
erPort));
¿regresar?