Programación de aplicaciones de red C#: resumen de revisión

Capítulo 1 Introducción a la programación de aplicaciones de red

Tres arquitecturas de red

Los protocolos TCP y UDP están en la capa de transporte

enchufe hembra

El socket está ubicado entre la capa de aplicación y la capa de transporte . Una instancia de socket almacena información como la dirección IP y el puerto de la máquina, la dirección IP y el puerto de la otra parte, y el protocolo de red adoptado por las dos partes para la comunicación. .

Tres tipos:

  1. Stream socket: realice una comunicación TCP orientada a la conexión

  2. Zócalo de datagramas: realice la comunicación UDP sin conexión

  3. Conectores sin procesar: implementar la comunicación de paquetes IP

Programación de aplicaciones TCP

Existen dos tipos de comunicación en el campo de las conexiones IP: Orientada a la conexión y Sin conexión

El servidor usa la clase TcpListener y el cliente usa la clase TcpClient; o todos usan Socket para implementar

Programación de aplicaciones UDP

La clase UdpClient es una encapsulación adicional de la programación de sockets en el nivel UDP.

Clase de dirección IP

Proporciona funciones de conversión y procesamiento de direcciones IP

  • El método Parse convierte una cadena de dirección IP en una instancia de IPAddress:IPAddress ip = IPAddress.Parse("143.24.20.36");

  • El atributo AddressFamily puede determinar si la dirección IP es IPv6 o IPv4:if (ip.AddressFamily == AddressFamily.InterNetworkV6)

Clase IPEndPoint

Describe la información de host y puerto que necesita una aplicación para conectarse a un servicio en un host

Constructor común: public IPEndPoint(IPAddress address, int port);el primer parámetro especifica la dirección IP y el segundo parámetro especifica el número de puerto

clase IPHostEntry

La clase IPHostEntry asocia un nombre de host del Sistema de nombres de dominio (DNS) con un conjunto de alias y un conjunto de direcciones IP coincidentes. Esta clase se usa generalmente junto con la clase Dns

  • Propiedad AddressList: obtenga o establezca la lista de direcciones IP asociadas con el host (incluidos IPv4 e IPv6)

  • Atributo HostName: contiene el nombre de host del host especificado

clase DNS

  • Método estático GetHostEntry: se utiliza para consultar la lista de direcciones IP asociadas con un determinado nombre de host o dirección IP en el servidor DNS:IPAddress[] ips = Dns.GetHostEntry(“news.sohu.com”).AddressList;

  • Método GetHostAddresses: Obtenga la dirección IP del host especificado, este método devuelve una matriz de tipo IPAddress: IPAddress[] ips = Dns.GetHostAddresses("www.cctv.com");(si la dirección IP está entre corchetes, se devolverá esta dirección; si está vacía, todas las direcciones ipv4 e ipv6 de la máquina Será devuelto)

  • Método GetHostName: se utiliza para obtener el nombre del host local:string hostname = Dns.GetHostName( );

Clases relacionadas con la detección de información de tarjetas de red

  • Clase NetworkInterface: proporciona configuración y estadísticas para adaptadores de red. Puede usar esta clase para detectar cuántos adaptadores de red tiene la máquina, el modelo del adaptador de red y la velocidad del adaptador de red, etc.:NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();

     

  • Clase IPInterfaceProperties: detecta varias direcciones admitidas por todos los adaptadores de red de la máquina.La clase IPInterfaceProperties es una clase abstracta y no se puede instanciar. Su instancia se puede obtener a través de GetIPProperties() del objeto NetworkInterface

     

Clases relacionadas con la detección de tráfico de red

  • Clase IPGlobalProperties: proporciona información sobre las conexiones de la red informática local y las estadísticas de comunicación:IPGlobalProperties properties =IPGlobalPropeties.GetIPGlobalProperties( );

     

  • Clase TcpConnectionInformation: proporciona información sobre las conexiones nativas del Protocolo de control de transmisión (TCP):TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();

Capítulo 3 Subprocesos de proceso y dominios de aplicación

proceso

  • Un proceso es un concepto básico a nivel del sistema operativo, que puede entenderse simplemente como un "programa en ejecución".

  • El proceso es la unidad básica de programación y asignación de recursos.

  • Los procesos son independientes entre sí.

  • En la gestión del nivel del sistema operativo, la clase Proceso se puede utilizar para iniciar y detener el proceso local o remoto.

hilo

  • Divida un proceso en varios flujos de ejecución independientes, cada flujo de ejecución se denomina hilo

  • El subproceso es la unidad básica de programación y asignación de CPU.

  • Un proceso puede contener solo un subproceso o varios subprocesos al mismo tiempo.

  • Los subprocesos comparten recursos de proceso

Ejecución concurrente de subprocesos: los subprocesos son paralelos en un nivel macro y en serie en un nivel micro

Ejecución asincrónica de subprocesos: cada subproceso se ejecuta de forma independiente al ejecutarse, sin contexto, sin esperarse el uno al otro, y la secuencia de ejecución es desconocida

número de núcleos lógicos

Use la propiedad estática ProcessorCount proporcionada por la clase System.Environment para obtener la cantidad de núcleos lógicos disponibles en la máquina.

Gestión de procesos (clase de proceso)

proceso de inicio

  1. Cree una instancia del componente Process, por ejemplo: Process p = new Process();

  2. Especifique el nombre de la aplicación para ejecutar y los parámetros para pasar:

    p.StartInfo.FileName = "文件名";

    p.StartInfo.Arguments = "参数";

    p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

  3. Llame al método Start de la instancia para iniciar el proceso: myProcess.Start();

o:Process.Start(“Notpad.exe”);

detener el proceso

  1. Método Kill y método CloseMainWindow: el primero se usa para terminar el proceso por la fuerza, y el segundo es solo una "solicitud" para terminar el proceso.

  2. Atributo HasExited: el atributo HasExited se utiliza para determinar si el proceso iniciado ha dejado de ejecutarse.

  3. Método WaitForInputIdle: solo aplicable a procesos con una interfaz de usuario, puede hacer que el proceso espere a que el proceso asociado entre en estado inactivo.

  4. Método WaitForExit: establezca el tiempo de espera para que el proceso asociado finalice

  5. Atributo ExitCode y atributo ExitTime: El atributo ExitCode se utiliza para obtener el valor especificado cuando finaliza el proceso asociado (0 éxito, distinto de cero error) El atributo ExitTime se utiliza para obtener la hora en que finaliza el proceso asociado. Estas dos propiedades solo se pueden detectar cuando la propiedad HasExited es verdadera.

  6. Propiedad EnableRaisingEvents La propiedad EnableRaisingEvents se usa para obtener o establecer si el evento Exited debe generarse cuando finaliza el proceso. verdadero si el evento Exited se genera cuando finaliza el proceso asociado; de lo contrario, falso

Obtenga toda la información del proceso

El método estático GetProcesses de la clase Process se usa para crear una nueva matriz de procesos y asociar la matriz con todos los recursos de proceso en la computadora local.

  • Obtenga todos los procesos de la computadora local:Process[] myProcesses = Process.GetProcesses();

  • Obtenga todos los procesos de una computadora remota:

    Process[] myProcesses =Process.GetProcesses (remoteMachineName);

Obtener la información del proceso especificado

  • El método estático GetProcessById de Process creará automáticamente un objeto Process, lo asociará con el proceso en la computadora local y pasará la identificación del proceso al objeto Process.Process p = Process.GetProcessesById(5152);

  • El método estático GetProcessesByName devuelve una matriz que contiene todos los procesos asociados.

    Obtenga el proceso con el nombre especificado en la computadora local:

    Process[] myProcesses = Process.GetProcessesByName("进程名称");

Obtenga el proceso con el nombre especificado en la computadora remota: ​Process[] myProcesses =Process.GetProcessesByName( "远程进程名称",remoteMachineName);

gestión de hilos

hilo principal y hilo secundario

  • Independientemente del tipo de programa de aplicación, cuando estos programas se ejecutan como un proceso, el sistema creará un subproceso predeterminado para el proceso, que se denomina subproceso principal.

  • El subproceso principal se usa para ejecutar el código en el método Main, y cuando el método Main regresa, el subproceso principal finaliza automáticamente.

  • En un proceso, los subprocesos que no sean el principal se denominan subprocesos auxiliares.

Hilos de primer plano e hilos de fondo

  • Un subproceso es un subproceso de primer plano o un subproceso de fondo.

  • Los subprocesos de fondo no afectan la terminación del proceso, mientras que los subprocesos de primer plano sí lo hacen.

  • Usando la propiedad IsBackground del objeto Thread, puede establecer o juzgar si un hilo es un hilo de fondo o un hilo de primer plano.

  • Establezca la propiedad IsBackground de un subproceso en verdadero para convertirlo en un subproceso de fondo.

  • De forma predeterminada, los subprocesos que pertenecen al grupo de subprocesos administrados son todos subprocesos en segundo plano (es decir, su propiedad IsThreadPoolThread es verdadera), y los subprocesos generados al crear e iniciar un nuevo objeto Thread son todos subprocesos en primer plano.

Crear e iniciar hilos

  • Cree un hilo separado a través de Thread, la forma común es:Thread t=new Thread(<方法名>);

  • Los subprocesos se implementan a través de la delegación, que depende de si el método definido tiene parámetros. El método sin parámetros usa el delegado ThreadStart: Thread t3 = new Thread(new ThreadStart(MethodC));el método con parámetros usa el delegado ParameterizedThreadStart:Thread t3 = new Thread(new ParameterizedThreadStart(MethodC));

  • El subproceso creado por Thread es el subproceso de primer plano de forma predeterminada.

  • El hilo comienza llamando al método Start de la instancia t.Start();// llamando al método sin parámetros t.Start(“abc”);// llamando al método con parámetros

Terminación y cancelación de subprocesos

  • El primer método es establecer primero un campo booleano con un modificador de volatile para indicar si el subproceso debe terminarse normalmente, lo que se denomina terminación del subproceso. (El compilador ya no optimizará el campo. Esto garantiza que el campo tome el valor más reciente en todo momento).

  • El segundo método es llamar al método Abort de la instancia Thread en otros hilos para terminar el hilo actual.El efecto final de este método es terminar por la fuerza la ejecución del hilo, que pertenece al caso de terminación anormal, que se llama cancelando la ejecución del hilo.

proceso de sueño

Llame al método Sleep estático proporcionado por la clase Thread para suspender el hilo actual por un período de tiempo: Thread.Sleep(1000);(El método Sleep suspende el hilo donde se encuentra la declaración, no otros hilos; y no es posible suspender otros hilos de un hilo .

Obtener o establecer la prioridad de un hilo

Al crear un hilo, la prioridad predeterminada es Normal

Use los siguientes métodos para asignar una prioridad más alta a un hilo:Thread t1 = new Thread(MethodName); t1.priority = ThreadPriority.AboveNormal

Grupo de subprocesos

  1. Los subprocesos en el grupo de subprocesos administrados son todos subprocesos en segundo plano.

  2. Las tareas agregadas al grupo de subprocesos no necesariamente se ejecutan de inmediato.

  3. El grupo de subprocesos puede reutilizar automáticamente los subprocesos creados. Una vez que un subproceso en el grupo completa su tarea, regresa a la cola de subprocesos en espera, esperando ser utilizado nuevamente, en lugar de destruirlo directamente.

  4. Los desarrolladores pueden establecer la cantidad máxima de subprocesos en el grupo de subprocesos.

  5. A partir de .NET Framework 4.0, el tamaño predeterminado del grupo de subprocesos está determinado por varios factores; los subprocesos en el grupo de subprocesos se implementan mediante tecnología de procesamiento multinúcleo.

  6. En el modelo de programación tradicional, los desarrolladores generalmente agregan elementos de trabajo al grupo de subprocesos directamente mediante el método ThreadPool.QueueUserWorkItem.ThreadPool.QueueUserWorkItem(new WaitCallback(Method1)); ThreadPool.QueueUserWorkItem(new WaitCallback(Method2));

  7. ThreadPool solo proporciona algunos métodos estáticos y el grupo de subprocesos no se puede usar creando una instancia de esta clase.

Sincronización de recursos en la programación multiproceso del grupo de subprocesos

  • Ejecución sincrónica: cuando se ejecuta una instrucción, el código subyacente no se ejecutará hasta que se complete la instrucción.Este método de ejecución se denomina ejecución sincrónica.

  • Ejecución asíncrona: Cuando se ejecuta una sentencia, independientemente de si la sentencia está completa o no, se seguirá ejecutando la siguiente sentencia, a este método de ejecución se le llama ejecución asíncrona.

  • Después de que un subproceso inicia otro o más subprocesos, estos subprocesos se ejecutarán al mismo tiempo, lo que se denomina paralelismo (concurrencia para ser precisos).

  • Cuando varios subprocesos que se ejecutan en paralelo acceden a ciertos recursos al mismo tiempo, debe considerar cómo mantener sincronizados varios subprocesos.

  • Un ejemplo clásico de interbloqueo es cuando dos subprocesos dejan de responder y ambos esperan que el otro se complete, lo que impide que cualquiera de los subprocesos continúe ejecutándose.

  • Una carrera es un error en el que el resultado de un programa depende de cuál de dos o más subprocesos llega primero a un bloque de código en particular.

Cómo lograr la sincronización de recursos

  • Bloquee campos públicos o privados con el modificador volátil. Utilice este modificador para acceder directamente a un campo en la memoria, en lugar de almacenar en caché el campo en un registro del procesador. La ventaja de esto es que todos los procesadores tienen acceso al último valor del campo.

  • Bloquee las variables locales con el método estático proporcionado por la clase Interlocked. La clase System.Threading.Interlocked proporciona métodos de operación estática de nivel atómico a través de bloqueo y desbloqueo. Cuando se opera en una variable local en el proceso de ejecución en paralelo, este método se puede usar para lograr la sincronización.

  • Use la declaración de bloqueo para bloquear el bloque de código. Use directamente la declaración de bloqueo proporcionada por C# para bloquear el bloque de código que contiene variables locales. Después de salir del bloque de código bloqueado, se desbloqueará automáticamente.

Modelo de programación multiproceso en WPF

De forma predeterminada, el marco .NET no permite que un subproceso acceda directamente a los controles en otro subproceso

Para resolver interbloqueos y problemas de sincronización durante la ejecución asíncrona, cada elemento en WPF (incluido el elemento raíz) tiene una propiedad Dispatcher

Para interactuar con la interfaz de usuario en un subproceso en segundo plano, esto se puede hacer registrando un elemento de trabajo con el Dispatcher del control WPF. Hay dos métodos comunes: el método Invoke y el método InvokeAsync.

  1. El método Invoke es una llamada síncrona, es decir, no regresa hasta que el delegado se ejecuta realmente en el grupo de subprocesos.

  2. InvokeAsync es una llamada asíncrona.

dominio de aplicación

Definición: un proceso principal puede contener uno o más "subprocesos", y el rango de memoria (o límite) ocupado por cada "subproceso" se denomina dominio de aplicación.

Relación entre el dominio de la aplicación y el subproceso

  1. Los dominios de aplicación forman límites de aislamiento para la seguridad, el control de versiones, la confiabilidad y la descarga de código administrado. Cuando se ejecuta una aplicación, todo el código administrado se carga en un dominio de aplicación y lo ejecutan uno o más subprocesos administrados.

  2. No existe una correlación uno a uno entre los dominios de aplicación y los subprocesos.

  3. Los dominios de aplicación están aislados entre sí y un dominio de aplicación no puede acceder directamente a los recursos de otro dominio de aplicación.

Relación entre dominios de aplicación y procesos

  1. Cada dominio de aplicación dentro de un proceso de aplicación se puede considerar como un "proceso secundario".

  2. Un proceso puede contener solo un dominio de aplicación o puede contener varios dominios de aplicación aislados al mismo tiempo.

  3. El multiproceso es una función que se usa a nivel del sistema operativo, que consume muchos recursos y es complicado controlar los detalles; el dominio de la aplicación es una función que se usa a nivel de la aplicación, que es más rápida, consume menos recursos y es más segura que directamente Uso de procesos múltiples para realizar la gestión de procesos. Es un gestor de procesos ligero para desarrolladores de aplicaciones.

asamblea

Un bloque de compilación para aplicaciones de .NET Framework que proporciona a CLR la información que necesita para reconocer e implementar tipos. el ensamblaje contiene el módulo, el módulo contiene el tipo, el tipo contiene el miembro

reflexión

Proporciona objetos que encapsulan ensamblados, módulos y tipos.

  1. Con la reflexión, puede crear dinámicamente instancias de clases, vincular clases a objetos u obtener clases de objetos existentes y llamar a métodos de clases o acceder a sus campos y propiedades.

  2. La información de metadatos se puede encontrar a partir de un ensamblaje mediante la reflexión.

Capítulo 4 Cifrado y descifrado de flujo de datos y datos

Codificación y decodificación de datos

Codificación: El proceso de convertir una secuencia de caracteres en una secuencia de bytes. Decodificación: El proceso de convertir una secuencia de bytes en una secuencia de caracteres.

Métodos comunes de codificación de juegos de caracteres:

  • ASCII

  • Unicode

  • UTF-8

  • GB2312 y GB18030

Clase de codificación

 

Obtenga todos los nombres de codificación y su información de descripción: use el método estático GetEncodings de la clase Encoding para obtener una matriz de tipos EncodingInfo que contengan todas las codificaciones.

foreach ( EncodingInfo ei in Encoding.GetEncodings( )) { Encoding en = ei.GetEncoding( );

}

Use el método Convert de la clase Encoding para convertir la matriz de bytes de una codificación a otra codificación, y el resultado de la conversión es una matriz de tipo byte

byte[] b = Encoding.Convert(unicode, utf8, unicode.GetBytes(s));

flujo de datos

  1. clase FileStream, clase MemoryStream, clase NetworkStream, clase CryptoStream

  2. Clases StreamReader y StreamWriter para leer y escribir texto

  3. Clases BinaryReader y BinaryWriter para lectura y escritura binaria, etc.

1. Use el constructor para crear un objeto FileStream:

FileStream (string path, FileMode mode, FileAccess access)

  • Valores opcionales de la enumeración FileMode: CreateNew, Create, Open, OpenOrCreate, Truncate, Append

  • Los valores opcionales de la enumeración FileAccess son: Read, Write, ReadWrite

2. Use la clase File para crear un objeto FileStream:

  • Cree una secuencia de archivos de solo lectura con el método OpenRead;FileStream fs= File.OpenRead(@"D:\ls\File1.txt");

  • Cree una secuencia de archivos de solo escritura con el método OpenWrite.FileStream fs= File.OpenWrite(@"D:\ls\File1.txt");

flujo de memoria

Usando la clase MemoryStream bajo el espacio de nombres System.IO, puede operar en matrices de bytes almacenadas en la memoria como flujos de memoria:

  • Use el método Write para escribir la matriz de bytes en el flujo de memoria

  • Use el método Read para leer los datos en el flujo de memoria en una matriz de bytes

El uso de MemoryStream es similar al uso del flujo de archivos, que admite la búsqueda y el acceso aleatorio al flujo de datos:

  • El valor predeterminado del atributo CanSeek es verdadero

  • Obtenga la posición actual del flujo de memoria a través de la propiedad Position.

Utilice ocasiones de MemoryStream:

  • En cifrado de datos y almacenamiento en caché de datos con longitud variable, etc. La capacidad del flujo de memoria se puede aumentar automáticamente

  • Cuando los datos de tipo foto se leen de la base de datos y se muestran en el control gráfico. Matriz de bytes -> Flujo de memoria -> ImageSource

flujo de red

Se puede considerar que NetworkStream establece un canal de datos entre la fuente de datos y el extremo receptor, y se puede realizar la lectura y escritura de datos para este canal.

Nota: La clase NetworkStream solo admite sockets orientados a conexión.

 

El proceso de envío y recepción de datos TCP mediante flujos de red:

  1. El método de escritura es responsable de enviar la matriz de bytes desde el búfer de proceso al búfer de envío TCP nativo.

  2. Luego, la pila de protocolos TCP/IP envía los datos a la red a través del adaptador de red.

  3. Finalmente, llega al búfer de recepción TCP del receptor.

Obtener el objeto NetworkStream

  1. Utilice el método GetStream del objeto TcpClient para obtener el objeto de flujo de red.TcpClient tcpClient=new TcpClient( );tcpClient.Connect("www.abcd.com", 51888);          NetworkStream networkStream = tcpClient.GetStream( );

  2. Use Socket para obtener el objeto de flujo de red.NetworkStream myNetworkStream = new NetworkStream(mySocket);

enviar datos

El método de escritura es un método síncrono. Antes de escribir datos en el flujo de red, el método de escritura se bloqueará hasta que el envío sea exitoso o se devuelva una excepción.

byte[] writeBuffer = Encoding.UTF8.GetBytes("Hello"); myNetworkStream.Write(writeBuffer, 0, writeBuffer.Length);

Recibir datos

Llame al método Read para leer datos del búfer de recepción al búfer de proceso para completar la operación de lectura

numberOfBytesRead = myNetworkStream.Read(readBuffer, 0,readBuffer.Length);

Clases StreamReader y StreamWriter

1. Crear instancias de StreamReader y StreamWriter

  • Si la fuente de datos es un flujo de archivos, un flujo de memoria o un flujo de red, puede usar los constructores de los objetos StreamReader y StreamWriter para obtener los flujos de lectura y escritura.NetworkStream networkStream = client.GetStream( );

    StremReader sr = new StremReader (networkStream); StreamWriter sw = new StreamWriter (networkStream);

  • Si necesita procesar transmisiones de archivos, también puede usar directamente la ruta del archivo para crear un objeto StreamWriter.StreamWriter sw= new StreamWriter ("C:\\file1.txt");

  • Equivalente a este método es el método CreateText proporcionado por las clases File y FileInfo.StreamWriter sw = File.CreateText ("C:\\file1.txt");

2. Leer y escribir datos de texto

  • Escriba datos de texto usando los métodos Write y WriteLine de la clase StreamWriter

  • Utilice el método ReadLine de la clase StreamReader para leer datos de texto.

Nota: no olvide cerrar la secuencia con el método Cerrar o dejar que el sistema la cierre automáticamente con la declaración de uso.

Clases BinaryReader y BinaryWriter

El espacio de nombres System.IO también proporciona las clases BinaryReader y BinaryWriter para leer y escribir secuencias en modo binario, lo que facilita la operación con datos binarios, como archivos de imágenes y archivos comprimidos.

Para cada método de lectura en BinaryReader, hay un método de escritura correspondiente en BinaryWriter.

Capítulo 5 Programación asíncrona

expresión lambda

Una expresión lambda es una función anónima que se puede usar para crear tipos de árboles delegados o de expresión.

Definición de uso básico

(lista de parámetros de entrada) => {bloque de expresión o declaración}

x => x * x

Uso de expresiones lambda en LINQ to Objects

var q2 = fromi en numberListwhere i < 4select i;

Delegación de acciones y funciones

  • Acción<[T1,T2,...,T16]>: Encapsular un método sin valor de retorno, es decir, el valor de retorno es nulo

 

 

  • Func<[T1,T2,...,T16,] TResult>: Encapsula un método con un valor devuelto, y el tipo de valor devuelto es Tresult

Tupla (clase Tupla)

Una tupla es una estructura de datos en la que los elementos tienen un número y una secuencia fijos.

Proporciona fácil acceso y manipulación de conjuntos de datos.

En el marco .NET, las tuplas con 1 a 7 elementos se pueden crear directamente a través del método Tuple.Create, y los objetos con más elementos también se pueden crear a través de tuplas anidadas. Los elementos de la tupla se pueden obtener a través del atributo ItemN (N=1,2,3,...,7) del objeto Tupla.

Ventaja: se pueden pasar múltiples valores a un método con un parámetro

Implementación de programación asíncrona

Modelo de programación asincrónica tradicional (APM)

La operación asíncrona que utiliza el patrón de diseño Item se implementa a través de dos métodos denominados Begin--- y End---, que se refieren al inicio y al final de la operación asíncrona, respectivamente. Por ejemplo: los métodos Begin Read y End Read del objeto de flujo de red

El control asíncrono es complicado y esta tecnología se ha eliminado en la actualidad.

Patrón de diseño de programación asíncrona basada en eventos (EAP)

Este patrón implementa métodos asincrónicos con un modelo controlado por eventos.

Por lo general, hay uno o varios --- Métodos asíncronos y un correspondiente evento ---Completado.

Por ejemplo: componente Trabajador de fondo, control Picture Box, etc.

Esta tecnología actualmente está obsoleta.

Patrón asíncrono basado en tareas (TAP)

.NET 4.0 framework, programación asíncrona técnicas de programación asíncrona sugeridas

Patrones asincrónicos basados ​​en tareas mejorados (async, await, Task.Run y ​​TAP)

La combinación de palabras clave TAP y C# es actualmente la técnica de programación asíncrona recomendada.

Tarea

Task (Tarea) representa una operación asíncrona. Los subprocesos son necesarios cuando se ejecuta una tarea, y Common Language Runtime (CLR) creará los subprocesos necesarios para admitir la ejecución de la tarea.

Clase de tarea

Representa una operación asíncrona que no devuelve ningún valor:Task t = Task. Run( () => { Console.WriteLine(“this is a task“); } );

Tarea<Resultado>类

Representa una operación asíncrona que devuelve un valor:var t = Task<int>.Run( () => { int num=5; num=DateTime.Now.Year+5; return num; });

Método Task.delay

  • Delay(Int32) //Retrasa el número especificado de milisegundos

  • Delay(Timespan) //Retrasa el tiempo especificado (año, mes, día, hora, minuto, segundo, milisegundo, etc.)

  • Retraso (Int32, Token de cancelación) // Cancele la operación de la tarea después de retrasar el número especificado de milisegundos

  • Delay(Timespan, Cancellation Token) //Retrasa la operación de la tarea después del tiempo especificado

palabra clave de operación asíncrona

Un método decorado con async se denomina método asíncrono. Los controladores de eventos decorados con async se denominan controladores de eventos asíncronos. Ambos también pueden denominarse colectivamente métodos asíncronos.

Convención de nomenclatura para métodos asincrónicos: los métodos tienen el sufijo "Async"

modificador asíncrono

Para métodos normales:

  • Si el método no devuelve un valor, se firma conjuntamente con async y Task.

  • Si el método tiene un valor de retorno, se firma conjuntamente con async y Task<T>.

Para controladores de eventos:

  • Firmar conjuntamente con async y void.

esperar operador

  • El operador await significa esperar el resultado de una ejecución asíncrona. Esencialmente operar en el valor de retorno del método.

  • Cuando se usa await para esperar de forma asíncrona la finalización de la tarea, el código subyacente no se ejecutará, pero no afectará la operación del usuario en la interfaz de usuario.

  • El operador de espera debe colocarse dentro de un método asíncrono.

crear tarea

Definir el método de ejecución de la tarea.

  • Definir tareas de forma normal

     

    Los métodos ordinarios deben llamarse con el método Task.Run, o usar los constructores de las clases Task y Task<Result> para crear explícitamente una instancia de Task y luego iniciarla.

  • Definir tareas con métodos asíncronos

     

  • Definir tareas con métodos anónimos

     

Crear y ejecutar tareas implícitamente usando el método Task.Run

El método Task.Run es una función proporcionada por .NET Framework 4.5, que ejecuta una tarea en un subproceso separado en el grupo de subprocesos.

Varias formas del método Run:

  • Run(Funk<Task>) ejecuta una tarea sin valor de retorno en el grupo de subprocesos utilizando el programador predeterminado

  • Run<Result>(Funk<Task<Result>>) ejecuta una tarea con un valor de retorno en el grupo de subprocesos utilizando el programador predeterminado

  • Run(Funk<Task>, Cancellation Token) Puede escuchar las notificaciones de cancelación durante la ejecución de la tarea

  • Run<Result>(Funk<Task<Result>>, Cancellation Token) Puede escuchar las notificaciones de cancelación durante la ejecución de la tarea

Cree implícitamente tareas asincrónicas usando las palabras clave async y await

Las palabras clave async y await son funciones proporcionadas por C# 5.0. Un método asíncrono que solo contiene las palabras clave async y await no crea un nuevo hilo, solo significa que la tarea especificada se ejecuta de forma asíncrona en el hilo actual.

Crear y ejecutar tareas implícitamente usando el programador de controles WPF

Solo se puede usar en aplicaciones WPF, y la sincronización entre procesos asíncronos es más complicada.

Cree una tarea llamando explícitamente al constructor de Task o Task<Result>

Uso: primero cree una tarea y luego llame al método Start para iniciar la tarea. Similar al uso de Thread.

  • Constructor de la clase Task.

     

  • Constructor de la clase Task<Result>

     

Cancelar o terminar la ejecución de una tarea

La clase Cancellation TokenSource y la estructura Cancellation Token introducidas por .NET framework se utilizan para coordinar la cancelación de varios subprocesos, elementos de trabajo de grupos de subprocesos u objetos Task.

Clase TokenSource de cancelación y estructura de token de cancelación

  • Cancellation TokenSource se utiliza para crear notificaciones de cancelación, conocidas como fuentes de cancelación .

    CancellationTokenSource cts = new CancellationTokenSource();

  • La estructura del token de cancelación se utiliza para propagar la notificación de que se debe cancelar una operación, lo que se conoce como token de cancelación .

    Cancellation Token ct=cts.Token;

El método Cancelar del objeto CancellationTokenSource emite una notificación de cancelación y luego establece la propiedad IsCancellationRequested del objeto Cancellation Token en true.

Después de recibir la notificación de cancelación, el método que ejecuta la tarea puede finalizar la operación de una de las siguientes maneras

  • En el código de la tarea, simplemente regrese del delegado, el valor del estado de la tarea es RanToCompletion (finalización normal).

    El estado de la tarea se puede obtener a través de la propiedad Estado de la tarea. Similar al método de variable booleana establecido cuando el hilo termina

  • En el código de la tarea, se lanza una excepción OperationCanceledException y se pasa al token en el que se solicitó la cancelación.

    Llame al método ThrowIfCancellationRequested del objeto Token de cancelación

Tareas frías y estados calientes

Una tarea creada explícitamente con el constructor de la clase Task o la clase Task<Result> se denomina tarea fría.

Las tareas en frío deben iniciarse mediante el método Inicio.

La ejecución de una tarea durante su vida se denomina estado activo.

Propiedad de estado y enumeración TaskStatus

Utilice la propiedad Estado de la instancia de la tarea para obtener el estado de ejecución de la tarea. El estado de ejecución de la tarea está representado por la enumeración TaskStatus.

Los valores de enumeración de TaskStatus son:

  • Creado: la tarea se ha inicializado, pero aún no ha entrado en la programación.

  • WaitingForActivation: la tarea ha ingresado al plan de programación y está esperando a que el programador la active.

  • WaitingToRun: el programador ha activado la tarea, pero la ejecución aún no ha comenzado.

  • En ejecución: la tarea se está ejecutando, pero aún no se ha completado.

  • RanToCompletion: la tarea se completó correctamente.

  • Cancelado: la tarea se completó porque se canceló (la tarea en sí generó una OperationCanceledException o la persona que llamó señaló el token de cancelación de la tarea antes de que se ejecutara la tarea).

  • Defectuoso: la tarea se completó debido a una excepción no controlada.

  • WaitingForChildrenToComplete: la tarea en sí se completó y está esperando que se completen tareas secundarias adicionales.

Atributos relacionados con la finalización de tareas

  • Atributo IsCompleted: Indica si la tarea está completa. Cuando el estado de la tarea es RanToCompletion, la tarea se completó correctamente.

  • Atributo IsCanceled: Indica si la tarea se completó debido a la cancelación.

  • Propiedad IsFaulted: indica si la tarea se completó debido a una excepción no controlada.

  • La relación entre cancelación y finalización: La cancelación es una señal para la tarea de que se espera que termine lo antes posible.

    La finalización es el final de la ejecución de la tarea.

Informar el progreso de la ejecución de la tarea

El progreso de la ejecución de una tarea se puede informar utilizando la clase Progress<T>. La clase Progress<T> se implementa a través de la interfaz IProgress<T>.La declaración de esta clase es la siguiente:

 

Capítulo 6 Programación en paralelo

Estrategias paralelas desde la perspectiva de la implementación empresarial: Los modelos de programación paralela se dividen en paralelismo de datos y paralelismo de tareas .

Mirando las estrategias paralelas desde la perspectiva de la implementación de hardware: el paralelismo se puede dividir en paralelismo de múltiples núcleos de una sola máquina y paralelismo de múltiples núcleos de varias máquinas .

Task Parallel Library (TPL) y su taxonomía

Clasificación TPL:

  • Paralelismo de datos: realiza la misma operación en los elementos de la colección o matriz de origen al mismo tiempo. Con la ayuda del método For o Foreach de la clase Parallel para lograr.

  • Paralelismo de tareas: realice el paralelismo de tareas con la ayuda del método estático Invoke proporcionado por la clase Parallel.

  • Consulta paralela: implementación paralela de la consulta LINQ to Objects, es decir, PLINQ.

Ventajas de TPL sobre los modelos tradicionales de programación multiproceso

  • El modelo de programación TPL utiliza el grupo de subprocesos CLR para realizar múltiples tareas y maneja automáticamente la partición del trabajo, la programación y cancelación de subprocesos, la gestión de estado y otros detalles de bajo nivel.

  • El TPL también escala dinámicamente el grado de concurrencia para hacer el uso más eficiente de todos los procesadores disponibles.

  • TPL es más inteligente que Thread.Cuando utiliza heurística para predecir que el conjunto de tareas no obtendrá beneficios de rendimiento de la operación en paralelo, elegirá automáticamente ejecutarse secuencialmente.

clase paralela

  • El método Parallel.For se usa para ejecutar el bucle for en paralelo.

  • El método Parallel.Foreach se usa para ejecutar el bucle foreach en paralelo.

  • El método Parallel.Invoke se utiliza para el paralelismo de tareas.

Clase auxiliar paralela

  • Clase ParallelOptions: proporciona opciones de operación para métodos paralelos. CancellationToken: obtenga o establezca el token de cancelación TaskScheduler: el valor predeterminado es nulo

  • Clase ParallelLoopState: interactúa iteraciones de un bucle Parallel con otras iteraciones.

    Método de interrupción: le dice al ciclo paralelo que deje de ejecutar iteraciones que no sean la iteración actual lo antes posible. ​Método de detención: Dígale al bucle paralelo que detenga la ejecución lo antes posible.

  • ParallelLoopResult: proporciona el estado de finalización del bucle paralelo.

    IsCompleted: Obtiene si el ciclo se ha completado.

paralelismo de datos

Realiza la misma operación en los elementos de la colección o matriz de origen simultáneamente. Método de implementación: método Parallel.For o Parallel.Foreach

Parallel.For método

El método Parallel.For se usa para ejecutar el bucle for en paralelo

Paralelo simple. Bucle For:Parallel.For(<开始索引>,<结束索引>,<每次迭代执行的委托>)

Parallel.For loop con opción paralela:Parallel.For(<开始索引>,<结束索引>,<并行选项>,<每次迭代执行的委托>)

Parallel.For bucle con estado de bucle paralelo:

 

Parallel.For bucle con variables locales de subprocesos, las variables locales de subprocesos se refieren a variables locales en un subproceso, otros subprocesos no pueden acceder. Los datos almacenados en variables locales de subprocesos se denominan datos locales de subprocesos:

 

Uso del método Parallel.ForEach para realizar el paralelismo de datos

Bucle Parallel.ForEach simple:ForEach<TSource>(IEnumerable<TSource>, Action<TSource>)

paralelismo de tareas

El paralelismo de tareas se refiere a ejecutar una o más tareas independientes al mismo tiempo, y las tareas paralelas se ejecutan de forma asíncrona.

Método Parallel.Invoke

El método Parallel.Invoke se utiliza para el paralelismo de tareas. Las formas sobrecargadas son:

  • public static void Invoke(Action[] actions )

  • public static void Invoke(ParallelOptions parallelOptions, Action[] actions )

Ambos métodos realizan las operaciones proporcionadas en paralelo tanto como sea posible, y la segunda sobrecarga también puede cancelar la operación.

Capítulo 7 Primeros pasos con WCF

XML

XML (Lenguaje de marcado extensible, Extensible Markup Language) es un lenguaje de metamarcado que utiliza texto para definir etiquetas semánticas. Tiene las ventajas de ser independiente de la plataforma, flexible para definir datos e información estructural y conveniente para la transmisión de red.

Características:

  • XML es una codificación de texto y se puede transmitir normalmente en cualquier red.

  • Independiente del sistema operativo, modelo de objeto y lenguaje de programación elegido

  • Todas las etiquetas en XML son autodefinidas y, a través de estas etiquetas personalizadas, se pueden describir diferentes partes de ciertos datos y su estructura jerárquica anidada.

  • XML estipula que todas las etiquetas deben tener etiquetas de inicio y finalización.

Servicio web

El servicio web también se llama servicio web

De acuerdo con los diferentes formatos de intercambio de datos, el servicio web se divide XML Web ServiceenJSON Web Service

La arquitectura de los servicios web se basa en los tres roles de proveedor de servicios, solicitante de servicios y registro de servicios , y se construye utilizando tres operaciones de publicación, descubrimiento y vinculación.

 

SOAP (Protocolo simple de acceso a objetos): un protocolo de intercambio de mensajes basado en XML con HTTP como protocolo de transporte básico, que define el formato para el intercambio de datos entre el cliente y el servicio web.

WSDL (lenguaje de descripción de servicios web): describe los métodos proporcionados por los servicios web y varias formas de llamar a estos métodos.

El proceso de comunicación entre el cliente y el servicio Web

  1. Fase 1: Serialización:

    (1) La aplicación cliente crea una instancia de la clase de proxy del servicio web.

    (2) La aplicación cliente llama al método de la clase proxy.

    (3) La infraestructura del cliente serializa los parámetros requeridos por el servicio web en mensajes SOAP y los envía al servidor web a través de la red.

  2. Fase 2: Deserialización:

    (4) El servidor web recibe el mensaje SOAP y deserializa el XML, crea una instancia del servicio web al mismo tiempo, llama al método proporcionado por el servicio web y pasa el XML deserializado como parámetro al método.

    (5) El servidor web ejecuta el método proporcionado por el servicio web y obtiene el valor de retorno y varios parámetros de salida.

  3. Fase 3: Serialización:

    (6) El servidor web serializa el valor de retorno y los parámetros de salida en un mensaje SOAP y lo devuelve a la infraestructura del cliente a través de la red.

  4. Fase 4: Deserialización:

    (7) La infraestructura del cliente recibe el mensaje SOAP devuelto, deserializa el XML en el valor de retorno y los parámetros de salida, y lo pasa a la instancia de la clase de proxy.

    (8) La aplicación cliente recibe el valor de retorno y los parámetros de salida.

     

Cola de mensajes (MSMQ)

MQ (Message Queue) es un modo de transmisión asíncrono basado en el procesamiento de colas y transacciones para realizar la comunicación mutua entre múltiples aplicaciones diferentes. El principio de realización es: el remitente del mensaje coloca la información a enviar en un contenedor (llamado Mensaje), y luego la guarda en una cola pública de mensajes del sistema (Message Queue); el programa receptor de mensajes local o remoto y los Mensajes dirigidos a él son tomado de la cola para su procesamiento.

Arquitectura Orientada a Servicios (SOA)

La idea básica es usar un modelo unificado, centrado en "servicios" para integrar varias tecnologías, no solo limitado a los servicios web. Para los desarrolladores de .NET, esta implementación concreta basada en SOA es WCF.

WCF

Características:

  • Centrado en el servicio

  • Admite múltiples modos de intercambio de mensajes

  • Admite múltiples protocolos de transmisión y métodos de codificación

  • Admite flujo de trabajo, transacciones y procesamiento de mensajes persistentes

  • Uniformidad, Seguridad y Escalabilidad

Punto final (Punto final)

El punto final (EndPoint) se utiliza para determinar el destino de la comunicación de red, que se realiza mediante la clase EndPoint y se especifica en la sección de configuración <endpoint> del archivo de configuración. Para WCF, un extremo consta de una dirección, un contrato y un enlace, todos los cuales son indispensables. Entre ellos, la dirección (Dirección) se usa para revelar la ubicación del servicio, y el acuerdo (Contrato) se usa para revelar qué servicio específico se proporciona.

DIRECCIÓN

Las direcciones en WCF se usan para determinar la ubicación de un punto de conexión. La dirección puede ser una URL, un FTP, una ruta de red o una ruta local. El formato de dirección especificado por WCF es:[传输协议]://[位置][:端口][/服务路径]

Por ejemplo:http://www.mytest.com:50001/MyService

Los servicios WCF se pueden transportar entre una variedad de diferentes protocolos de red subyacentes (como TCP, UDP, HTTP, etc.).

Por ejemplo:net.tcp://localhost:50001/MyService

Vinculante

WCF usa enlaces para definir cómo los clientes de WCF se comunican con los servicios de WCF. WCF proporciona una variedad de métodos de enlace:

BasicHttpBinding、WSHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetMsmqBinding

Contrato

Un contrato representa las reglas para el intercambio de información entre un cliente y un servidor. Sin especificar un contrato, no hay forma de comunicarse entre el cliente y el servidor. Por ejemplo: contrato de servicio, contrato de datos, contrato de mensajes, etc.

Acuerdo de servicio: se refiere a los servicios que WCF expone a los clientes. Incluyendo las características de ServiceContract (definición de contrato de servicio) y las características de OperationContract (definición de contrato de operación).

Contrato de datos: Un contrato de datos es un acuerdo de intercambio de datos entre el servidor y el cliente, es decir, describir los datos a intercambiar de forma abstracta y transmitirlos al cliente. Use la función DataContract (que define qué clases se pueden serializar) y la declaración de la función DataMember (que declara qué miembros de la clase se pueden serializar)

Contratos de mensaje: en algunos casos, se requiere un solo tipo para representar un mensaje completo. Utilice contratos de mensajes para evitar envoltorios innecesarios durante la serialización XML. Atributo MessageHeader y atributo MessageBodyMember. Dentro del acuerdo del mensaje, el encabezado del mensaje se especifica a través del atributo MessageHeader (clase MessageHeaderAttribute) y el cuerpo del mensaje se especifica a través del atributo MessageBodyMember (clase MessageBodyMemberAttribute). Y puede aplicar el atributo MessageHeader y el atributo MessageBodyMember a todos los campos, propiedades y eventos

Si el tipo contiene tanto un contrato de mensaje como un contrato de datos, solo se procesa el contrato de mensaje.

WCF estipula que la interfaz que implementa el servicio solo puede contener declaraciones de métodos y no está permitido declarar propiedades y campos en la interfaz. En otras palabras, las propiedades y los campos se exponen a través de contratos de datos en clases que implementan la interfaz.

Formas de alojar WCF

  • Use IIS o WAS para hospedar servicios WCF (las aplicaciones de servicio WCF usan este modo)

  • Utilizar el servicio de Windows para alojar el servicio WCF (biblioteca de servicios WCF)

  • Modo de alojamiento propio (escriba su propio código para implementar WCF de alojamiento)

Hay 4 pasos principales para escribir un programa de servidor WCF: seleccionar el método de hospedaje, diseñar e implementar el acuerdo, configurar el servicio y hospedar el servicio.

Método de vinculación de punto final

basicHttpBinding, wsHttpBinding, , wsDualHttpBinding, netTcpBinding, udpBinding, netNamedPipeBindingynetMsmqBindingnetPeerTcpBinding

Capítulo 8 Programación de aplicaciones WCF y HTTP

Introducción a HTTP

HTTP (Protocolo de transferencia de hipertexto, Protocolo de transferencia de hipertexto) En la arquitectura TCP/IP, HTTP pertenece al protocolo de capa de aplicación y se encuentra en la capa superior de TCP/IP.

HTTP funciona en modo TCP: el cliente HTTP primero establece una conexión TCP con el servidor, luego el cliente envía una solicitud HTTP a través del socket y recibe la respuesta HTTP a través del socket.

HTTP no tiene estado: "sin estado" significa que después de que el cliente envía una solicitud, el servidor no almacena ninguna información de estado sobre el cliente. Incluso si el cliente vuelve a solicitar el mismo objeto, el servidor seguirá reenviando el objeto, independientemente de si el objeto se envió originalmente al cliente.

HTTP utiliza la metainformación como encabezado: HTTP proporciona al servidor información sobre esta solicitud HTTP agregando un encabezado (Header), es decir, agregando una parte de información antes de los datos principales, llamada metainformación (Metainformation). Por ejemplo, qué tipo de objeto se transfiere, qué codificación se usa, etc.

Solicitud HTTP

Solicitud GET: la solicitud GET es la solicitud más común, lo que significa que el cliente le dice al servidor qué recursos obtener. Una solicitud GET es seguida por la ubicación de una página web. Además de la ubicación de la página como parámetro, esta solicitud también puede seguir la versión del protocolo, como HTTP/1.0, como parámetro para enviar más información al servidor.

Solicitud POST: una solicitud POST requiere que el servidor reciba una gran cantidad de información. En comparación con las solicitudes GET, las solicitudes POST no agregan parámetros de solicitud a la URL, pero brindan información adicional al servidor en el cuerpo de la solicitud. Generalmente se utiliza para que el cliente rellene el contenido contenido en el formulario Web (Formulario), y luego envíe los datos rellenados al servidor en forma de solicitud POST.

Solicitud HEAD: La solicitud HEAD se comunica entre el programa cliente y el servidor sin devolver documentos específicos. Por lo tanto, el método HEAD generalmente no se usa solo, sino que juega un papel auxiliar junto con otros métodos de solicitud.

Clases relacionadas con la programación HTTP (entender)

WebRequest y HttpWebRequest

  • WebRequest: la clase base abstracta para el modelo de solicitud/respuesta. Se utiliza para acceder a datos de Internet. Permite que las aplicaciones que utilizan el modelo de solicitud/respuesta soliciten datos de Internet de manera independiente del protocolo.

  • HttpWebRequest: es una implementación específica para HTTP. Esta clase interactúa con el servidor a través del protocolo HTTP. Use el método Create para inicializar una nueva instancia de WebRequestHttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriString);

Clase HttpWebResponse

Se crea llamando al método GetResponse de la instancia de WebRequest y no crea una instancia de HttpWebResponse a través del constructor.

HttpWebResponse response=(HttpWebResponse)request.GetResponse();

Enlace HTTP básico (clase BasicHttpBinding)

El enlace HTTP básico se implementa con la clase BasicHttpBinding, que se configura con el elemento basicHttpBinding en el archivo de configuración.

Enlace HTTP seguro (clase WSHttpBinding)

WSHttpBinding define un enlace seguro, confiable e interoperable adecuado para servicios no dúplex. El enlace implementa la especificación WS-ReliableMessaging (garantiza la confiabilidad) y la especificación WS-Security (garantiza la seguridad y autenticación del mensaje).

Enlace HTTP seguro dúplex (clase WSDualHttpBinding)

La clase WSDualHttpBinding también usa HTTP como protocolo de transporte básico y se configura con el elemento wsDualHttpBinding en los archivos de configuración del servidor y del cliente. Este enlace también utiliza "texto/XML" como codificación de mensajes predeterminada. Sin embargo, solo admite el modelo de seguridad SOAP y requiere mensajería confiable.

Patrón de intercambio de mensajes entre el cliente y el servidor WCF

Solicitud de modo de respuesta (Acción/Respuesta)

Después de que el cliente envía una solicitud al servidor WCF, el servidor ejecuta la operación de servicio y devuelve el resultado de la operación al cliente. Si no se invoca al cliente a través de una operación asíncrona, el código del cliente se bloqueará hasta que el servidor devuelva el resultado de la operación del servicio.

Modo unidireccional (IsOneWay)

Cuando un cliente invoca una operación de servicio WCF, el servidor no devuelve el resultado de la operación al cliente. Incluso si ocurre un error de ejecución en el lado del servidor, no devolverá un resultado al cliente.

comunicacion sogo

Dúplex significa que tanto el cliente como el servidor pueden llamarse activamente entre sí. En este modo de comunicación, WCF usa un enlace bidireccional para darse cuenta de que el servidor y el cliente divulgan la información del punto de conexión entre sí.

Capítulo 9 Programación de aplicaciones WCF y TCP

Características de TCP

TCP es la abreviatura de Transmission Control Protocol (Protocolo de Control de Transmisión) Es un protocolo de capa de transporte orientado a la conexión en el sistema TCP/IP y proporciona servicios dúplex y confiables en la red.

Características:

  • Comunicación uno a uno.

  • Transferencia secuencial segura.

  • Enviar y recibir datos a través de flujos de bytes.

  • Transferencia de datos sin límites de mensajes

La solución al problema del límite TCP sin mensajes

  • Envíe mensajes de longitud fija, este método es adecuado para ocasiones en las que la longitud del mensaje es fija.

  • Envíe la longitud del mensaje junto con el mensaje. Generalmente, se utilizan 4 bytes delante de cada mensaje enviado para indicar la longitud del mensaje, y luego se envía a la otra parte junto con el mensaje. Obtenga la longitud real del mensaje y luego recibe los datos enviados por el remitente en secuencia de acuerdo con el valor de longitud del mensaje. Este enfoque es adecuado para cualquier ocasión.

  • Utilice tokens especiales para separar mensajes y delimitadores especiales para separar mensajes. Este método se usa principalmente cuando el mensaje en sí no contiene etiquetas especiales.

Selección de tecnología de programación de aplicaciones TCP

  1. El uso de la clase Socket para realizar todos los detalles en el proceso de comunicación TCP está controlado por el programa escrito por uno mismo. Características: el método es flexible, pero requiere que los programadores escriban mucho código. Sugerencia: use esta técnica cuando defina algunos protocolos nuevos o tenga un control más flexible sobre los detalles subyacentes.

  2. El uso de TcpClient y TcpListener y subprocesos múltiples para realizar la clase TcpClient y TcpListener encapsula aún más la clase Socket, lo que simplifica la dificultad de escribir programas TCP con Socket hasta cierto punto, pero la flexibilidad también es limitada. Características: Los detalles del monitoreo y la comunicación durante la transmisión de datos TCP (como los problemas de límites de mensajes) aún deben ser resueltos por los propios programadores a través del código.

  3. Al escribir aplicaciones TCP con TcpClient y TcpListener y la implementación de múltiples tareas, los desarrolladores no necesitan considerar los detalles de implementación, como la creación, administración y balanceo de carga de subprocesos múltiples, solo necesitan realizar subprocesos múltiples como tareas múltiples.

  4. Los problemas como la supervisión con WCF y los límites sin mensajes se completan automáticamente dentro de WCF. Los programadores solo necesitan considerar la lógica comercial en el proceso de transmisión. Además, el uso de WCF también puede implementar un protocolo personalizado.

enchufe

Hay tres pasos en la programación de sockets orientada a la conexión:

  1. El servidor establece una conexión con el cliente (fase de establecimiento de la conexión)

  2. Enviar y recibir mensajes entre el servidor y el cliente (fase de envío y recepción de mensajes)

  3. Desconecte, cierre el enchufe (fase de desconexión)

     

1. Establecer una conexión (servidor)

IPHostEntry local=Dns.GetHostByName(Dns.GetHostName()); 
IPEndPoint iep = new IPEndPoint(local.AddressList[0], 1180); //创建套接字 
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定 
serverSocket.Bind(iep); serverSocket.Listen(10); //监听 
Socket clientSocket = serverSocket .Accept();

1. Establecer una conexión (cliente)

IPAddress remoteHost = IPAddress.Parse("192.168.0.1"); 
IPEndPoint iep = new IPEndPoint(remoteHost, 1180); 
Socket localSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
localSocket.Connect(iep); //连接

2. Envío y recepción de información (servidor)

Socket clientSocket = serverSocket .Accept(); //建立连接后,利用Send方法向客户端发送信息 clientSocket.Send(Encoding.ASCII.GetBytes("server send Hello")); //接收客户端信息 
byte[] myresult = new Byte[1024]; 
int receiveNum = clientSocket.Receive(myresult); 
Console.WriteLine("接收客户端消息:{0}", Encoding.ASCII.GetString(myresult));

2. Envío y recepción de información (cliente)

//建立连接成功后,向服务器发送信息 
string sendMessage = "client send Message Hello"+DateTime.Now; localSocket.Send(Encoding.ASCII.GetBytes(sendMessage)); 
Console.WriteLine("向服务器发送消息:{0}", sendMessage); //接收服务器信息 
byte[] result = new Byte[1024]; localSocket.Receive(result); 
Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result));

3. Desconectar

serverSocket.Shutdown(SocketShutdown.Both); serverSocket.Close();

Utilización de tecnología tradicional para realizar la programación de aplicaciones TCP

Clase TcpClient y clase TcpListener

Para simplificar la complejidad de la programación de redes, .NET encapsula el socket y las clases encapsuladas son la clase TcpListener y la clase TcpClient bajo el espacio de nombres System.Net.Sockets

  • La clase TcpListener se usa para monitorear las solicitudes de conexión del cliente.

  • La clase TcpClient se utiliza para proporcionar información de conexión entre hosts locales y hosts remotos.TcpClient tcpClient = new TcpClient("www.abcd.com", 51888);

Flujo de programación de TCPListener y TCPClient

 

Enlaces relacionados con WCF y TCP

Al usar WCF para escribir aplicaciones TCP, solo necesita establecer los enlaces relevantes en el archivo de configuración del servidor, y puede realizar fácilmente las funciones correspondientes, y no es fácil cometer errores.

NetTcpBinding

La clase NetTcpBinding se usa para unir WCF y TCP y proporcionar comunicación entre el servidor TCP y el cliente en forma de servicio. En el archivo de configuración del servidor, use el elemento <netTcpBinding> para configurar

La configuración por defecto del elemento <netTcpBinding> es la siguiente:

  • Modo de seguridad: Transporte (garantizar la seguridad de la transmisión).

  • Método de codificación de mensajes: Binario (usando un codificador de mensajes binarios).

  • Protocolo de transporte: TCP.

  • Sesiones: proporciona sesiones de transporte (también se pueden configurar como conversaciones confiables).

  • Transacciones: sin capacidad de procesamiento de transacciones (también se puede configurar para admitir el procesamiento de transacciones).

  • Dúplex: Soporte.

Capítulo 10 Programación de aplicaciones WCF y UDP

Conocimientos básicos de UDP

UDP (Protocolo de datagramas de usuario, Protocolo de datagramas de usuario) es un protocolo sencillo sin conexión orientado a datagramas que proporciona servicios de transmisión rápidos pero no necesariamente fiables. La función principal de UDP es comprimir el tráfico de datos de la red en forma de datagramas. Cada datagrama usa 8 bytes para describir la información del encabezado, y los bytes restantes contienen datos de transmisión específicos. Características UDP:

  • UDP se puede transmitir de uno a muchos, y UDP no solo admite la comunicación de uno a uno, sino que también admite la comunicación de uno a muchos. En otras palabras, UDP puede usar la tecnología de multidifusión para enviar información a múltiples destinatarios al mismo tiempo.

  • La velocidad de transmisión de UDP es más rápida que la de TCP. Debido a que UDP no necesita establecer una conexión con la otra parte primero y no necesita confirmación de transmisión, su velocidad de transmisión de datos es mucho más rápida que la de TCP.

  • UDP tiene límites de mensajes y no es necesario tener en cuenta los límites de mensajes cuando se utiliza UDP.

  • UDP no garantiza una transmisión ordenada y UDP no garantiza que el orden en que se envían los datos sea coherente con el orden en que se reciben. Para datagramas en ráfagas, puede estar fuera de servicio. Sin embargo, este tipo de trastorno básicamente rara vez ocurre y, por lo general, solo ocurre cuando la red está muy congestionada.

  • UDP no es tan confiable como TCP y UDP no proporciona un mecanismo de garantía para la transmisión de datos.

Unidifusión, difusión y multidifusión

Unicast se refiere al envío de información solo a un host remoto específico, que es esencialmente una comunicación uno a uno.

La transmisión se refiere al envío de mensajes a varias computadoras en la subred al mismo tiempo, que se divide en transmisión local y transmisión global. La difusión local consiste en enviar mensajes de difusión a todas las computadoras de la subred, y otras redes no se verán afectadas por la difusión local. La transmisión global se refiere al uso de una dirección IP con todos los bits establecidos en 1 (255.255.255.255 para Ipv4).Sin embargo, dado que los enrutadores filtran automáticamente la transmisión global de forma predeterminada, no tiene sentido usar esta dirección.

La multidifusión también se denomina multidifusión. Dado que la multidifusión está agrupada, también se denomina multidifusión. Para IPv4, la multidifusión se refiere a la transmisión dentro del rango de direcciones IP de clase D de 224.0.0.0 a 239.255.255.255 (el primer byte está entre 224 y 239). En otras palabras, el programa emisor envía datos a través de una dirección en estos rangos y el programa receptor también escucha y recibe datos de estos rangos de direcciones.

Selección de tecnología de programación de aplicaciones UDP

Implementado con la clase Socket

Use directamente la clase Socket en el espacio de nombres System.Net.Sockets para implementar. Al usar este método, el programador necesita escribir la mayor cantidad de código y todos los detalles del procesamiento subyacente deben ser considerados por el programador.

Implementado con UdpClient y multiproceso

Use la clase UdpClient y la clase Thread en el espacio de nombres System.Net.Sockets para implementar. La clase UdpClient encapsula el Socket básico. Al enviar y recibir datos, no es necesario considerar los detalles que deben tratarse al enviar y recibir sockets. Hasta cierto punto, reduce la dificultad de escribir aplicaciones UDP con Socket y mejora eficiencia de programación.

Implementación con UdpClient y multitarea

Se implementa con la clase UdpClient y el modelo de programación basado en tareas (Task class). Implementar con multitarea tiene más ventajas que implementar directamente con multithreading

Implementado con WCF

Utilice WCF para lograr. Eso es unir WCF y UDP a través de la configuración, que es otra forma de encapsulación de Socket

Enviar y recibir datos usando la clase UdpClient

TCP tiene la clase TcpListener y la clase TcpClient, mientras que UDP solo tiene la clase UdpClient Esto se debe a que UDP es un protocolo sin conexión, por lo que solo se necesita un Socket.

Dado que UDP no requiere que el remitente y el receptor establezcan una conexión primero, el remitente puede enviar datagramas UDP directamente al host remoto especificado en cualquier momento. En este modo, el remitente es el cliente y el receptor con función de monitoreo es el servidor

La clase UdpClient proporciona varios constructores sobrecargados, que se utilizan para enviar y recibir datos de IPv4 e IPv6, respectivamente. Entre estos constructores, la forma de sobrecarga más utilizada es el constructor con parámetros de punto final local, la sintaxis es la siguiente.public UdpClient(IPEndPoint localEp)

Los objetos UdpClient creados con este constructor se vinculan automáticamente al extremo local especificado en los parámetros. El propósito del enlace es escuchar datagramas de otros hosts remotos. Por ejemplo:IPEndPoint localEndPoint = new IPEndPoint(localAddress, 51666); UdpClient client =new UdpClient(localEndPoint);

enviar datos:

  • Cuando se utiliza el método Enviar del objeto UdpClient para enviar datos de forma síncrona, este método devuelve la cantidad de bytes enviados.

  • Hay muchas formas sobrecargadas del método Enviar, y aquí solo se presentan las formas sobrecargadas más utilizadas, y la sintaxis es la siguiente:

    public int Send(byte[] data, int length, IPEndPoint remoteEndPoint)

Recibir datos:

  • El método Receive del objeto UdpClient se utiliza para obtener el datagrama UDP del host remoto, la sintaxis es la siguiente.

    public byte[] Receive(ref IPEndPoint remoteEndPoint)

Enviar y recibir datos de forma asíncrona

Para las tareas que pueden tardar mucho tiempo en ejecutarse o las tareas que no se pueden predecir cuánto tardarán, es mejor usar la programación asíncrona basada en tareas (llame al método SendAsync y al método ReceiveAsync del objeto UdpClient). La ventaja de utilizar este método es que la interfaz de usuario no se detendrá al enviar y recibir datos. Enviar datos de forma asíncrona, por ejemplo:await client.SendAsync(bytes, bytes.Length, remoteEndPoint);

Recibir datos de forma asíncrona, por ejemplo:

 

Use UdpClient para realizar la función de envío grupal

Unirse y salir de grupos de multidifusión

Los grupos de multidifusión pueden ser permanentes o temporales. En aplicaciones prácticas, la mayoría de los grupos de multidifusión son temporales, es decir, solo existen cuando hay miembros en el grupo de multidifusión. Cualquier extremo receptor que se una al grupo de multidifusión puede recibir los datos enviados desde el extremo emisor de multidifusión. Sin embargo, si no se une a un grupo de multidifusión, no podrá recibir datos de multidifusión.

Al enviar datos a un grupo de multidifusión, primero debe crear un objeto UdpClient:UdpClient udpclient = new UdpClient("224.0.0.1", 8001);

Cuando utilice multidifusión, debe prestar atención a la configuración del valor TTL del objeto. Use la propiedad Ttl del objeto UdpClient para modificar el valor predeterminado de TTL, por ejemplo

udpClient.Ttl = 50;

Utilice el método JoinMulticastGroup del objeto UdpClient para unirse al grupo de multidifusión especificado:udpClient.JoinMulticastGroup(IPAddress.Parse("224.0.0.1"));

Utilice el método DropMulticastGroup de UdpClient para salir del grupo de multidifusión. El parámetro indica el objeto IPAddress para salir del grupo multicast:udpClient.DropMulticastGroup(IPAddress.Parse("224.100.0.1"));

Ya sea para permitir la recepción de multidifusión

Utilice el atributo MulticastLoopback del objeto UdpClient para controlar si se permite recibir información de multidifusión. Esta propiedad por defecto es verdadera, lo que permite recibir multidifusión

Uso de WCF para realizar la programación de aplicaciones UDP

El enlace relacionado con UDP en WCF es solo <udpBinding> y la clase correspondiente es la clase UdpBinding

Al implementar la multidifusión con WCF, solo se requiere un proyecto. Este proyecto es a la vez un servidor y un cliente, y solo se puede implementar de forma autohospedada

Supongo que te gusta

Origin blog.csdn.net/weixin_52357218/article/details/127703315
Recomendado
Clasificación