C# Winform利用Scoket实现实时更新

之前在网上看到的,关于如何在Winform上实时的更新数据,也看了其他的博客,其中提到了利用Timer去实现,还有就是利用Socket去实现。
关于Socket实现实时更新,他给出的理解是:
有一个Socket服务端,只负责接收多个客户端传过来的讯息,根据讯息内容去判断是否广播。这里每一个winform窗体程序就是一个Socket客户端,如果窗体上对数据库做了更新(例如增,删,改)操作就会调用一个方法,该方法主要是向Socket服务端发送一个字符串"1",当Socket服务端接收到了字符串为"1"时,则广播给所有客户端一个字符串"1",而当客户端接收到服务端传过来一个"1"时,则立即执行数据绑定的方法(重新将界面的DataGridVeiw数据绑定)。这样就实现了一有数据改变就实时刷新的效果。
稍作改善
每个人的方法都是适用于自己的,所以我在这个想法下做了修改。
他的思路用图描述是这样的:
在这里插入图片描述
我的思路:
在这里插入图片描述
他的作用对象是客户端,而我所显示的功能的作用对象是服务器,以下是实现的代码:(之后会加上动图,更易理解)


客户端
public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 客户端的Socket
        /// </summary>
        Socket clinet;
        private void FrmLogin_Load(object sender, EventArgs e)
        {
            //创建socket
            CreateSocket();
        }
        private void CreateSocket()
        {
            //创建socket
            clinet = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //连接
            //获得ip和端口(读取配置文件)
            var app = System.Configuration.ConfigurationManager.AppSettings;
            IPEndPoint point = new IPEndPoint(IPAddress.Parse(app["ip"]), Convert.ToInt32(app["port"]));

            //连接服务器
            try
            {
                clinet.Connect(point);
            }
            catch
            {
                
            } 

注意引用:
在这里插入图片描述


服务器
public partial class FrmNetwork : Form
    {
        public FrmNetwork()
        {
            InitializeComponent();
        }
        //创建数据库对象
        Data get = new okCooperation.Data();
        //已连接上的客户端集合
        List<Socket> clinetSockets;
        //服务器
        Socket socket;
        //设置数据缓冲区
        private byte[] result = new byte[1024];
        private void FrmNetwork_Load(object sender, EventArgs e)
        {
            //初始化
            clinetSockets = new List<Socket>();
            //创建socket对象
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //获取ip地址和端口
            IPAddress ip = IPAddress.Parse(txtIPAddress.Text.Trim());
            int port = Convert.ToInt32(txtPort.Text.Trim());
            IPEndPoint point = new IPEndPoint(ip, port);

            //绑定ip和端口
            socket.Bind(point);
            //设置最大连接数
            socket.Listen(20);

            listBox1.Items.Add("服务器已开启,等待客户端连接中.....");

            //开启新线程监听
            Thread serverThread = new Thread(ListenClientConnect);
            serverThread.IsBackground = true;
            serverThread.Start(socket);
        } 
        
        /// <summary>
        /// 监听传入
        /// </summary>
        /// <param name="ar"></param>
        private void ListenClientConnect(object ar)
        {
            //设置标志
            bool flag = true;
            //获得服务器的Socket
            Socket serverSocket = ar as Socket;
            //轮询
            while (flag)
            {
                //获得连入的客户端socket
                Socket clientSocket = serverSocket.Accept();
                //将新加入的客户端加入列表中
                clinetSockets.Add(clientSocket);

                //向listBox中写入消息
                listBox1.Invoke(new Action(() => { listBox1.Items.Add(string.Format("客户端{0}已成功连接到服务器\r\n", clientSocket.RemoteEndPoint)); }));
                //开启新的线程,进行监听客户端消息
                var mReveiveThread = new Thread(ReceiveClient);
                mReveiveThread.IsBackground = true;
                mReveiveThread.Start(clientSocket);
            }
        }
        
        /// <summary>
        /// 接收客户端传来的数据
        /// </summary>
        /// <param name="obj"></param>
        private void ReceiveClient(object obj)
        {
            //获取当前客户端
            //因为客户端不止一个,所有需要使用var实例化新对象
            var mClientSocket = (Socket)obj;
            //循环标志位
            bool flag = true;
            while (flag)
            {
                //try
                //{
                    //获取数据长度
                    int receiveLength = mClientSocket.Receive(result);
                    //获取客户端消息
                    string clientMessage = Encoding.UTF8.GetString(result, 0, receiveLength);
                    if (clientMessage == "1")
                    {
                        //自身进行更新
                        RefTable();
                    }
                    //向listbox中写入信息
                    listBox1.Invoke(new Action(() => { listBox1.Items.Add(string.Format("客户端{0}发来消息{1}", mClientSocket.RemoteEndPoint, clientMessage)); }));
            }
        }

注意引用:
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值