winform 模拟服务端监听设备回调数据

最近一个项目需要接收设备不定时上传的数据并显示 接受工具是一个winform窗体 由于之前网络编程做的不多 所以花了些时间

废话不多说 上图 因为只是临时做检测用 所以界面很简单  主要是需要输入本机IP地址 和 自己设置一个端口号 例如 8080 8090 不冲突就好 以此来生成套接字用于tcp通信

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FaceToolV2
{
    public partial class FaceToolMainPanel : Form
    {
        public FaceToolMainPanel()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }
     
        /// <summary>
        /// 监听代码段开始!
        /// </summary>

        string RemoteEndPoint;     //客户端的网络结点

        Thread threadwatch = null;//负责监听客户端的线程
        Socket socketwatch = null;//负责监听客户端的套接字
        //创建一个和客户端通信的套接字
        Dictionary<string, Socket> dic = new Dictionary<string, Socket> { };   //定义一个集合,存储客户端信息


        private void button1_Click(object sender, EventArgs e)//点击启用监听
        {
            this.button1.Enabled = false;
            //定义一个套接字用于监听客户端发来的消息,包含三个参数(IP4寻址协议,流式连接,Tcp协议)
            socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //服务端发送信息需要一个IP地址和端口号
            IPAddress address = IPAddress.Parse(tb_IP.Text.Trim());//获取文本框输入的IP地址

            //将IP地址和端口号绑定到网络节点point上
            IPEndPoint point = new IPEndPoint(address, int.Parse(tb_port.Text.Trim()));//获取文本框上输入的端口号
            //此端口专门用来监听的

            //监听绑定的网络节点
            socketwatch.Bind(point);

            //将套接字的监听队列长度限制为20
            socketwatch.Listen(20);

           

            //创建一个监听线程
            threadwatch = new Thread(watchconnecting);

            //将窗体线程设置为与后台同步,随着主线程结束而结束
            threadwatch.IsBackground = true;

            //启动线程   
            threadwatch.Start();

            //启动线程后 textBox3文本框显示相应提示
            richTextBox1.AppendText("开始监听客户端传来的信息!" + "\r\n");
        }

        //void OnlineList_Disp(string Info)
        //{
        //    listBoxOnlineList.Items.Add(Info);   //在线列表中显示连接的客户端套接字
        //}


       // Socket connection = null;
        //监听客户端发来的请求
        private void watchconnecting()
        {
            Socket connection = null;//改动20190313 16:49
            while (true)  //持续不断监听客户端发来的请求   
            {
                try
                {
                    connection = socketwatch.Accept();
                }
                catch (Exception ex)
                {
                    richTextBox1.AppendText("套接字监听异常:" + ex.Message); //提示套接字监听异常   
                    break;
                }
                //获取客户端的IP和端口号
                IPAddress clientIP = (connection.RemoteEndPoint as IPEndPoint).Address;
                int clientPort = (connection.RemoteEndPoint as IPEndPoint).Port;

                //让客户显示"连接成功的"的信息
                string sendmsg = "连接服务端成功!" + "设备IP:" + clientIP + ",设备端口" + clientPort.ToString()+ "\r\n";
                //byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendmsg);
                //connection.Send(arrSendMsg);//关闭回发

                RemoteEndPoint = connection.RemoteEndPoint.ToString(); //客户端网络结点号
                richTextBox1.AppendText("成功与" + RemoteEndPoint + "客户端建立连接!\r\n");     //显示与客户端连接情况
                //dic.Add(RemoteEndPoint, connection);    //添加客户端信息 暂时关闭客户端的记录 20190313 17;04
                // OnlineList_Disp(RemoteEndPoint);    //显示在线客户端
                //IPEndPoint netpoint = new IPEndPoint(clientIP,clientPort);

                IPEndPoint netpoint = connection.RemoteEndPoint as IPEndPoint;

                //创建一个通信线程    
                ParameterizedThreadStart pts = new ParameterizedThreadStart(recv);
                Thread thread = new Thread(pts);
                thread.IsBackground = true;//设置为后台线程,随着主线程退出而退出   
                //启动线程   
                thread.Start(connection);
            }
        }


        ///   
        /// 接收客户端发来的信息    
        ///   
        ///客户端套接字对象  
        private void recv(object socketclientpara)
        {
            //int count = 0;
            Socket socketServer = socketclientpara as Socket;
            while (true)
            {
                //创建一个内存缓冲区 其大小为1024*1024字节  即1M   
                //string arrServerRecMsg = string.Empty;
                byte[] arrServerRecMsg = new byte[1024 * 1024];//修改接受信息方式
                //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度  
                try
                {
                    int length = socketServer.Receive(arrServerRecMsg);
                    //将机器接受到的字节数组转换为人可以读懂的字符串   
                    string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
                    if (strSRecMsg is null || strSRecMsg.Trim() == "")
                    {
                        continue;
                    }
                    
                    //将发送的字符串信息附加到文本框txtMsg上   
                    richTextBox1.AppendText("客户端:" + socketServer.RemoteEndPoint + ",time:" + GetCurrentTime() +"\r\n "+ strSRecMsg + " \r\n");
                }
                catch (Exception ex)
                {
                    richTextBox1.AppendText("客户端" + socketServer.RemoteEndPoint + "已经中断连接 异常:"+ex.Message + "\r\n"); //提示套接字监听异常 
                    //listBoxOnlineList.Items.Remove(socketServer.RemoteEndPoint.ToString());//从listbox中移除断开连接的客户端
                    socketServer.Close();//关闭之前accept出来的和客户端进行通信的套接字
                    break;
                }
            }
        }

        ///    
        /// 获取当前系统时间的方法   
        ///    
        /// 当前时间   
        private DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }

        /// <summary>
        /// 监听代码段结束!
        /// </summary>
  }
}

 !!!!!重点来了 之前测试很久窗体老是收不到设备上传的信息( 同一网段 ) 后来发现是因为windows防火墙原因 把防火墙关闭后测试通过

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值