ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-30 20:27:02  阅读:216  来源: 互联网

标签:Scoket C# ip private socket new Winform Socket 客户端


之前在网上看到的,关于如何在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)); }));
            }
        }

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

标签:Scoket,C#,ip,private,socket,new,Winform,Socket,客户端
来源: https://blog.csdn.net/TGBTrial/article/details/94354973

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有