Red de conocimientos turísticos - Información de alquiler - Preguntas sobre la programación de redes asíncronas de sockets en C#

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?