Introducción a varios métodos operativos de programación de aplicaciones TCP
Los métodos BeginAcceptTcpClient y EndAcceptTcpClient están incluidos en la clase TcpListener bajo el espacio de nombres System .Net.Sockets.
En la programación de aplicaciones TCP asíncrona, el servidor puede utilizar el método BeginAcceptTcpClient proporcionado por la clase TcpListener para comenzar a recibir nuevas solicitudes de conexión de clientes. En este método, el sistema crea automáticamente los subprocesos necesarios a partir de su propio grupo de subprocesos y utiliza el mecanismo de devolución de llamada asincrónica para llamar al método proporcionado cuando se completa la operación, mientras devuelve los parámetros de estado correspondientes. El prototipo del método es:
público IAsyncResult BeginAcceptTcpClient(devolución de llamada AsyncCallback, estado del objeto)
Entre ellos: el parámetro 1 es un delegado del tipo AsyncCallback; el parámetro 2 es el tipo de objeto, que se utiliza para transferir; información de estado Pasada al método proporcionado por el delegado.
Por ejemplo: AsyncCallback callback=new AsyncCallback(AcceptTcpClientCallback);
tcpListener.BeginAcceptTcpClient(callback, tcpListener);
Después de que el programa ejecuta el método BeginAcceptTcpClient, inmediatamente en el subproceso Cree los subprocesos necesarios en el grupo y supervise los requisitos de conexión del cliente en los subprocesos creados. Una vez que se acepta la solicitud de conexión del cliente, el método correspondiente se ejecuta automáticamente a través del delegado y se devuelve información de estado. En el ejemplo, llamamos a este método AcceptTcpClientCallback y la información de estado es una instancia del tipo TcpListener tcpListener.
Defina el formato del método de devolución de llamada asincrónica:
void AcceptTcpClientCallback(IAsyncResult ar){código de devolución de llamada}
[ Nota: solo hay un parámetro en el método de devolución de llamada, que es obligatorio Es una interfaz que implementa el tipo IAsyncResult, que representa el estado de las operaciones asincrónicas. ]
En el método de devolución de llamada, se debe llamar al método EndAcceptTcpClient para completar la conexión del cliente. El código clave es el siguiente:
void AcceptTcpClientCallback(IAsyncResult ar){
... ....
TcpListener myListener=(TcpListener)ar.AsyncState;
TcpClient client=myListener.EndAcceptTcpClient(ar);
..... .
}
Después de que el programa ejecute el método EndAcceptTcpClient, completará automáticamente la solicitud de conexión del cliente y devolverá el objeto TcpClient que contiene el socket subyacente. Puede utilizar este objeto para comunicarse con El cliente se comunica.
De forma predeterminada, después de que el programa ejecuta el método BeginAcceptTcpClient, antes de devolver la información de estado, no bloqueará el hilo que espera a que el usuario se conecte como el método TCP síncrono si queremos bloquear el hilo actual. Antes de devolver la información de estado, debemos llamar al método WaitOne del objeto ManualResetEvent.
El método BeginConnect y el método EndConnect están incluidos en la clase TcpClient y la clase Socket en el espacio de nombres System.Net.Sockets. Aquí solo analizamos los métodos de la clase TcpClient.
En la programación de aplicaciones TCP asincrónicas, el método BeginConnect emite una solicitud de conexión al host remoto de manera asincrónica. Hay tres formas sobrecargadas. El prototipo del método es:
public IAsyncResult BeginConnect. (Dirección IPAddress, puerto int, AsyncCallback requestCallback, estado del objeto);
público IAsyncResult BeginConnect(IPAddress[] direcciones, int puerto, AsyncCallback requestCallback,
público IAsyncResult BeginConnect); (string host, int port, AsyncCallback requestCallback, Object state);
Donde la dirección es el objeto IPAddress del host remoto, el número de puerto del host remoto requestCallback es el delegado del estado AsyncCallback; contiene información relevante sobre la operación de conexión. Cuando se completa la operación, este objeto se pasa al delegado requestCallback.
Antes de que se complete la operación del método BeginConnect, el hilo que llama a este método no se bloqueará y el sistema llamará automáticamente a un hilo independiente para ejecutar este método hasta que la conexión con el host remoto sea exitosa o se produzca una excepción. es arrojado. Si desea bloquear el hilo después de llamar al método BeginConnect, puede llamar al método WaitOnet del objeto ManualResetEvent.
El método asincrónico BeginConnect no se completa hasta que se llama al método EndConnect. Por lo tanto, el programa necesita llamar al método EndConnect del objeto TcpClient en el método proporcionado a la llamada del delegado requestCallback. El código clave es:
......
AsyncCallback requestCallback=new AsyncCallback(RequestCallback);
tcpClient.BeginConnect (IP o dominio del host remoto nombre, número de puerto del host remoto, requestCallback, tcpClient);
......
void RequestCallback(IAsyncResult ar){
.... ..
tcpClient=(TcpClient)ar.AsyncState;
client.EndConnect(ar);
.......
}