WinForm(十五)窗体间通信

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinForm(十五)窗体间通信相关的知识,希望对你有一定的参考价值。

在很多WinForm的程序中,会有客户端之间相互通信的需求,或服务端与客户端通信的需求,这时就要用到TCP/IP的功能。在.NET中,主要是通过Socket来完成的,下面的例子是通过一个TcpListerner作为监听,等待TcpClient的连接,连接成功后就可以利用NetStream进行信息互通了。

在互相通信过程中,发送和接收分别在不同的线程中处理,并且还要处理UI更新。

using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;


namespace WinFormsDemo15

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        
        /// <summary>
        /// 创建连接后的网络流
        /// </summary>
        NetworkStream _stream;
        private void ConnectionButton_Click(object sender, EventArgs e)
        
            if (IsServer.Checked)
            
                AcceptTcpClient();
            
            else
            
                var tcpClient = new TcpClient(IPTextBox.Text, int.Parse(PortTextBox.Text));
                _stream = tcpClient.GetStream();
                ReciveMessage(_stream);
            
        
        /// <summary>
        /// 在一个新线程中接收TcpClient连接
        /// </summary>
        void AcceptTcpClient()
        
            Task.Run(() =>
            
                var listener = new TcpListener(IPAddress.Any, int.Parse(PortTextBox.Text));
                listener.Start();
                var tcpClient = listener.AcceptTcpClient();
                this.Invoke(() =>
                
                    YouTextBox.Text += $"DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") \\r\\n收到客户端连接。\\r\\n";
                );
                _stream = tcpClient.GetStream();
                ReciveMessage(_stream);
            );
        
        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="stream">网络流</param>
        void ReciveMessage(NetworkStream stream)
        
            Task.Run(() =>
            
                while (true)
                
                    var messageArr = new byte[1024];
                    stream.Read(messageArr, 0, messageArr.Length);
                    this.Invoke(() =>
                    
                        var message = System.Text.Encoding.UTF8.GetString(messageArr).Trim('\\0');
                        YouTextBox.Text += $"DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 对方说:\\r\\nmessage\\r\\n";
                    );
                
            );
        
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SendButton_Click(object sender, EventArgs e)
        
            var messageArr = System.Text.Encoding.UTF8.GetBytes(MyTextBox.Text);
            _stream.Write(messageArr, 0, messageArr.Length);
            _stream.Flush();
            YouTextBox.Text += $"DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 我说:\\r\\nMyTextBox.Text\\r\\n";
            MyTextBox.Clear();
        
    

下面是演示结果:

以上是关于WinForm(十五)窗体间通信的主要内容,如果未能解决你的问题,请参考以下文章

winform窗体间传值

winform窗体间传值

WinForm窗体间传值的方法

WPF C#怎么窗体间传值

winform 窗体间传值

C# Winform多个窗体界面间的切换