[Programación de red de sockets] Edición avanzada: Uso de subprocesos múltiples

introducción:

En la programación de computadoras , un concepto básico es controlar múltiples tareas al mismo tiempo. Muchos problemas de programación requieren que el programa detenga lo que está haciendo, maneje algún otro problema y luego regrese al proceso principal . Esto se puede lograr de varias maneras. La sincronización asíncrona de la red Unity es inseparable del uso de hilos.

Tabla de contenido

❤ Definición de hilo:

Du Niang definido

 yo definí

❤ Prueba interactiva

❤Uso práctico del enchufe:

Servidor

 1. Encapsule el socket del servidor interactivo.

 2. Utilice subprocesos para implementar mensajes de difusión.

cliente 

¡extraño! 

❤Compartir código fuente (apesta, échale un vistazo si no te disgusta)


❤ Definición de hilo:

Du Niang definido

1. Cada programa que se ejecuta en el sistema es un proceso . Cada proceso contiene uno o más subprocesos. Un proceso también puede ser la ejecución dinámica de un programa completo o parte de un programa. Un hilo es una colección de instrucciones , o secciones especiales de un programa, que se pueden ejecutar de forma independiente dentro del programa. También puede entenderse como el contexto en el que se ejecuta el código . Entonces, los hilos son básicamente procesos livianos que son responsables de realizar múltiples tareas dentro de un solo programa. Por lo general, el sistema operativo es responsable de la programación y ejecución de múltiples subprocesos. Cargando...Volver a cargar Cancelar subprocesamiento múltiple

2. Un hilo es un único flujo secuencial de control en un programa. Ejecutar múltiples subprocesos simultáneamente en un solo programa para realizar diferentes tareas se denomina multiproceso.

3. La diferencia entre un subproceso y un proceso es que el proceso secundario y el proceso principal tienen códigos y espacios de datos diferentes, mientras que varios subprocesos comparten el espacio de datos, y cada subproceso tiene su propia pila de ejecución y contador de programa como contexto de ejecución. Multithreading principalmente Es para ahorrar tiempo de CPU y aprovecharlo al máximo, según la situación específica. La ejecución del subproceso necesita usar los recursos de memoria y CPU de la computadora .

 yo definí

De hecho, un hilo es una clase con sus propias ideas.Después de que el programa se ejecuta, no hay necesidad de "esperar a que termine antes de ejecutar la siguiente línea de declaración" , y la siguiente línea de declaración se puede procesar directamente . Caso especial: cuando la declaración ejecutada por el subproceso y la declaración en la línea siguiente son ambas declaraciones de bucle, habrá una situación de ejecución alternativa, denominada "ganar-ganar", y solo se puede decir que el subproceso es un buen chico". 

❤ Prueba interactiva

❤Uso práctico del enchufe:

PD: ¡Después de completar el marco simple de servidor y cliente, puede actualizar el "equipo"! 

Antes de eso, repasemos que en el método Socket, bind(), accept(), receive(), etc. son todos métodos de bloqueo, es decir, no seguirán ejecutando la siguiente sentencia hasta que no se ejecuten o se ejecuten con éxito. (¿No es egoísta! dux).

Servidor

 1. Encapsule el socket del servidor interactivo.

Primero mejoramos la encapsulación de recibir y enviar mensajes en el lado del servidor, y creamos una clase especial para ello: vipServer

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace ServerPRO
{
    class vipServer
    {
        byte[] vs = new byte[4096];

        public Socket socket;
        public vipServer(Socket newSocket)
        {
            this.socket = newSocket;
            

        }
       
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="massage"></param>
        public void sendMassage(string massage)
        {           
                byte[] size = UTF8Encoding.UTF8.GetBytes(massage);
                socket.Send(size);
        }
        /// <summary>
        /// 接收消息
        /// </summary>
        public string receiveMassage()
        {

            while (true)
            {
                int size2 = socket.Receive(vs);
                string massage = Encoding.UTF8.GetString(vs, 0, size2);
                Console.WriteLine("有客户端:" + massage);
                return massage;
            }
        }
        
    }
}

 2. Utilice subprocesos para implementar mensajes de difusión.

Para evitar que el método accept() en el ciclo while bloquee el progreso del mensaje de transmisión, encapsulamos el método del mensaje de transmisión y luego lo confiamos al subproceso como una función de entrada , y luego podemos iniciar el subproceso para transmitir el mensaje sin obstáculos a todos los clientes.

PD: La función de entrada de Threadstart solo puede ser de tipo nulo

            
//用一个队列存储vipServer对象池

          List<vipServer> listvipServer=new List<vipServer>();

//运用子线程形成专属交互socket

            Socket newSocket = null;
            Thread thread = new Thread(new ThreadStart(broadcast));
            thread.Start();
            while (true)
            {
                newSocket = Server.Accept();


                if (newSocket != null)
                {
                    Console.WriteLine("{0}用户连接", newSocket);
                    vipServer withServer = new vipServer(newSocket);
                    listvipSocket.Add(withServer);
                    newSocket = null;

                }
                
                

            }
        //广播消息      
        void broadcast()
        {
                
                string massage = null;
                while (true)
                {
                    if (massage == null)
                    {
                        for (int i = 0; i < listvipSocket.Count; i++)
                        {
                            if (listvipSocket[i].socket != null)
                                massage = listvipSocket[i].receiveMassage();
                        }
                    }
                    if (massage != null)
                    {
                        for (int i = 0; i < listvipSocket.Count; i++)
                        {
                            listvipSocket[i].sendMassage(massage);
                            massage = null;

                        }
                    }
                }

            }

        }

cliente 

¡extraño! 

La perfección del cliente es en realidad similar a la del servidor, y solo acepto mensajes del cliente sin afectar el envío de mensajes.Aquí no he enhebrado el envío de mensajes, ¡y la ejecución es rara! Inténtalo tú mismo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Client
{
    class Program
    {
        static void Main()
        {
            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(IPAddress.Parse("127.0.0.1"), 6060);
            Console.WriteLine("连接服务器成功...");

            byte[] sizeClient = new byte[4096];

            //接收消息的子线程
            Thread thread = new Thread(new ThreadStart(receiveMassage));
            thread.Start();
            

            string a = Console.ReadLine();
                //发送一次消息实验
            sendMassage(clientSocket, a);

            void receiveMassage()
            {
                while (true)
                {
                    int count = clientSocket.Receive(sizeClient);
                    string massage = Encoding.UTF8.GetString(sizeClient, 0, count);
                    Console.WriteLine("消息:" + massage);
                }
                
            }

        }

        /// <summary>
        /// 客户端的发送方法
        /// </summary>
        /// <param name="client"></param>
        /// <param name="abc"></param>
        public static void sendMassage(Socket client,string abc)
        {

            byte[] massageByte = Encoding.UTF8.GetBytes(abc);
            client.Send(massageByte);
        }
    }
}

❤Compartir código fuente (apesta, échale un vistazo si no te disgusta)

 Github: https://github.com/PangZaiPeiZhu/ServerPRO.git

Supongo que te gusta

Origin blog.csdn.net/m0_64810555/article/details/126064910
Recomendado
Clasificación