C # se da cuenta de la comunicación TCP --- aplicación de formulario de Windows usando VS

1. Configuración de la interfaz de usuario

Inserte la descripción de la imagen aquí
1. Controles de tres botones, utilizando el evento Click ().
2. Tres controles GroupBox pueden mostrar caracteres en un área determinada, como el servidor.
3. Se utilizan dos controles RichTextBox para mostrar la entrada y los datos recibidos.
4. Un control de temporizador, utilizado para recibir procesamiento de datos

En segundo lugar, el código de implementación del servidor

1. Variables relacionadas

//定义的类内变量
        private TcpListener Listener;
        private Socket SocketClient;
        private NetworkStream NetStream;
        private StreamReader ServerReader;
        private StreamWriter ServerWriter;
        private Thread Thread;

2. Código básico

2.1 función de ejecución de hilo

public void TCPListener()
{
   //在这里填入你的ip地址
   this.Listener = new TcpListener(IPAddress.Parse("192.168.31.62"), 8000);
   Listener.Start();
   button1.Enabled = false;
   this.Text = "服务器正在运行中。。。";
   while (true)
   {
       try
       {
           SocketClient = Listener.AcceptSocket();         //等待客户端的socket
           NetStream = new NetworkStream(SocketClient);    //有客户端连接成功后,创建网络流
           ServerReader = new StreamReader(NetStream);     //读数据
           ServerWriter = new StreamWriter(NetStream);     //写数据
           
       }
       catch
       {

       }
   }
}

 Esta función es la función de ejecución del hilo, que espera constantemente la conexión del socket del cliente y recibe datos.
 Esta función asigna un nuevo hilo después de presionar el botón, y el botón se bloquea después de presionarlo, es decir, el servidor solo necesita ejecutar un hilo y el cliente puede tener varios hilos ejecutándose para conectarse al servidor.

2.2 Función de recepción

public void GetMessage()
{
     //网络流不为空并且有可用数据
     if (NetStream != null && NetStream.DataAvailable)
     {
         richTextBox1.AppendText(DateTime.Now.ToString());//显示时间
         richTextBox1.AppendText("  客户端说:\n");
         richTextBox1.AppendText(ServerReader.ReadLine() + "\n");
         //设置下拉框
         richTextBox1.SelectionStart = richTextBox1.Text.Length;
         richTextBox1.Focus();
         richTextBox2.Focus();
     }
 }

 Esta función se ejecuta en la función de activación de interrupciones del temporizador y la imprime en el control del cuadro de recepción cuando hay datos en el flujo de red.

3. Función de activación de teclas

3.1 Conectarse al servidor

private void button1_Click(object sender, EventArgs e)
{
    this.Thread = new Thread(new ThreadStart(TCPListener));
    this.Thread.Start();
}

 Inicie el hilo, configure la función de ejecución del hilo en TCPListener (), la función específica está en 2.1

3.2 Enviar datos

private void button3_Click(object sender, EventArgs e)
{
    try
    {
        if (richTextBox2.Text.Trim() != "")
        {
            //信息写入流
            ServerWriter.WriteLine(richTextBox2.Text);
            ServerWriter.Flush();
            //显示在文本框上。
            richTextBox1.AppendText(DateTime.Now.ToString());
            richTextBox1.AppendText("  服务器说:\n");
            richTextBox1.AppendText(richTextBox2.Text + "\n");
            richTextBox2.Clear();
            //滚动条
            richTextBox1.SelectionStart = richTextBox1.Text.Length;
            richTextBox1.Focus();
            richTextBox2.Focus();
        }
        else
        {
            MessageBox.Show("信息不能为空!", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            richTextBox2.Focus();
            return;
        }
    }
    catch
    {
        MessageBox.Show("客户端连接失败……", "服务器消息", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
}

 Cuando el usuario hace clic en enviar, se enviará al cliente de acuerdo con los datos ingresados ​​en el cuadro de texto y se mostrará en el cuadro de recepción del mensaje.

3.3 Borrar datos

private void button2_Click(object sender, EventArgs e)
{
     richTextBox1.Clear();
 }

 Borre los datos en el cuadro de recepción.

4. Otros módulos

4.1 Constructor

public Form1()
 {
     InitializeComponent();
     CheckForIllegalCrossThreadCalls = false;
 }

4.2 Formular eventos relacionados

private void Form1_Load(object sender, EventArgs e)
 {
     this.richTextBox1.ReadOnly = true;  //只读
     this.timer1.Enabled = true;         //定时器使能
 }

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     DialogResult dr = MessageBox.Show("关闭服务器将无法接收到来自客户端的数据,你确定要关闭吗?", "服务器信息", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
     if (dr == DialogResult.Yes)
     {
         Listener.Stop();
         this.Thread.Abort();
         e.Cancel = false;
     }
     else
     {
         e.Cancel = true;
     }
 }

 En la función de evento del formulario, puede realizar algunas operaciones de inicialización y cerrar el socket y el hilo al cerrar el formulario; de lo contrario, se producirá un error anormal.
Puedes consultar uno de mis blogs para obtener más detalles.

4.3 Eventos del temporizador

private void timer1_Tick(object sender, EventArgs e)
{
     //接收数据,处理数据
     GetMessage();
 }

 Llame a la función de recepción de datos GetMessage () para procesar continuamente los datos recibidos.

En tercer lugar, el código de implementación del cliente.

1. Explica

 La implementación del código del cliente es similar a la del servidor, pero debe seleccionar la IP y el puerto para conectarse al servidor.
** PD: El servidor y el código del cliente se ejecutan bajo la misma LAN, es decir, use el mismo enrutador o punto de acceso, use ipconfig para ver la IP en la consola y complete la ubicación correspondiente.

2. Código básico

public void GetConn()
{
    CheckForIllegalCrossThreadCalls = false;
    while (true)
    {
        try
        {
            TcpClient = new TcpClient(textBox1.Text.Trim(), Convert.ToInt32(textBox2.Text.Trim()));
            Stream = TcpClient.GetStream();
            //创建读写流
            ClientReader = new StreamReader(Stream);
            ClientWriter = new StreamWriter(Stream);
            textBox1.Enabled = false;
            button1.Enabled = false;
            this.Text = "客户端   " + "与" + textBox1.Text.Trim() + "连接成功!";
            return;
        }
        catch (Exception e)
        {
            textBox1.Enabled = true;
            button1.Enabled = true;
            MessageBox.Show(e.ToString());
            return;
            //MessageBox.Show("连接失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

 Esta función es una función de ejecución de subprocesos del cliente, que utiliza la clase TcpClient.
 El resto es más o menos lo mismo que el servidor Después de entender el servidor, escribir el cliente está en el proceso de descubrir la imagen.
 Si aún no lo entiende, puede hacer clic aquí . Estos son los recursos que cargué y el proyecto completo.

¡Les deseo a todos un feliz aprendizaje!

Supongo que te gusta

Origin blog.csdn.net/aruewds/article/details/109262823
Recomendado
Clasificación