首页 > 其他分享 >WinForm(十五)窗体间通信

WinForm(十五)窗体间通信

时间:2023-02-07 21:46:55浏览次数:30  
标签:stream messageArr Text System 间通信 窗体 var using 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\n{message}\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\n{MyTextBox.Text}\r\n";
            MyTextBox.Clear();
        }
    }
}

下面是演示结果:

  想要更快更方便的了解相关知识,可以关注微信公众号 

 

 

标签:stream,messageArr,Text,System,间通信,窗体,var,using,WinForm
From: https://www.cnblogs.com/axzxs2001/p/17099897.html

相关文章

  • WinForm(十五)窗体间通信
    在很多WinForm的程序中,会有客户端之间相互通信的需求,或服务端与客户端通信的需求,这时就要用到TCP/IP的功能。在.NET中,主要是通过Socket来完成的,下面的例子是通过一个Tc......
  • WinForm(十三)WebView2
    WebView是WinForm框架中一个控件,用来对网页信息交互,有时Web自己开发的,有时Web是三方的。下面通过一个例子来看看WebView2的使用。首先看Web的逻辑,是一个商品......
  • WinForm(十三)WebView2
    WebView是WinForm框架中一个控件,用来对网页信息交互,有时Web自己开发的,有时Web是三方的。下面通过一个例子来看看WebView2的使用。首先看Web的逻辑,是一个商品......
  • WinForm(十四)窗体滚动日志
    在桌面程序里,一般日志记录到文件里就可以了,但有的时间,也需要在窗体上动态滚动显示,这时,就需要引入日志框架了。这里引入的依旧是NLog(在我的MiniAPI系统里,用的也是......
  • WinForm(十四)窗体滚动日志
    在桌面程序里,一般日志记录到文件里就可以了,但有的时间,也需要在窗体上动态滚动显示,这时,就需要引入日志框架了。这里引入的依旧是NLog(在我的MiniAPI系统里,用的也是......
  • WinForm(十一)用户控件
    winform+api是一种对接数据模式,在本例中,为了方便,开发两个天生具有与后台api对接的用例控件,并且把他们封闭成单独控件,以供多次使用。提示:此实例不是生产使用,仅作演......
  • WinForm(十一)用户控件
    winform+api是一种对接数据模式,在本例中,为了方便,开发两个天生具有与后台api对接的用例控件,并且把他们封闭成单独控件,以供多次使用。提示:此实例不是生产使用,仅作演......
  • WinForm(十二)画图
    在.NET中,画图主要是通过Graphics类实现的,这个类主要通过两类方法完成画图,一类是DrawXXX,画各种线条图形;另一类是FillXXX,用各种形状,填充各种图形。Graphics是画板,Draw各......
  • WinForm(十二)画图
    在.NET中,画图主要是通过Graphics类实现的,这个类主要通过两类方法完成画图,一类是DrawXXX,画各种线条图形;另一类是FillXXX,用各种形状,填充各种图形。Graphics是画板,Draw各......
  • QT-窗体背景图片设置
                  this->setWindowFlags(Qt::Window|Qt::FramelessWindowHint);//设置无框窗体样式  QToolBar可以直接删除......