C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据

news2024/10/1 1:20:05

本示例使用设备介绍:液显WIFI无线网络HTTP协议RFID云读卡器可编程实时可控开关TTS语-淘宝网 (taobao.com) 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
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 WindowsFormsApplication1
{
    public partial class Form13 : Form
    {
        public Form13()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        Thread listenThread = null; //负责监听客户端的线程
        Socket listenSocket = null; //负责监听客户端的套接字                                   
        Socket interactSocket = null;//创建一个负责和客户端通信的套接字 

        Dictionary<string, Socket> dicSockets = new Dictionary<string, Socket>(); //套接字集合
        Dictionary<string, Thread> dicThreads = new Dictionary<string, Thread>();  //线程集合
        List<string> list_SealedClients = new List<string>();//被屏蔽用户的名单

        private void Form13_Load(object sender, EventArgs e)
        {
            GetIp();
        }

        private void GetIp()
        {
            Form1 f1;
            f1 = (Form1)this.Owner;
            f1.Refresh();

            for (int i = 0; i < f1.comboBox4.Items.Count; i++)
            {
                comboBox4.Items.Add(f1.comboBox4.Items[i]);
            }
            if (comboBox4.Items.Count > 0)
            {
                comboBox4.SelectedIndex = 0;
                btn_conn.PerformClick();
            }
        }

        private void btn_conn_Click(object sender, EventArgs e)
        {            
            try
            {
                if (btn_conn.Text == "开启服务器")
                {
                    //(IPv4协议,双向,TCP协议)
                    listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                    //网络结点endpoint需要IP和端口号
                    //port是 与 address 关联的端口号,或为 0 以指定任何可用端口。port 以主机顺序排列。
                    //IPEndPoint m_Endpoint = new IPEndPoint(IPAddress.Parse(txb_ip.Text.Trim()), int.Parse(txb_port.Text.Trim()));
                    string ipadd = comboBox4.Text.Trim();
                    IPEndPoint m_Endpoint = new IPEndPoint(IPAddress.Parse(ipadd), int.Parse(txb_port.Text.Trim()));

                    //绑定网络结点
                    listenSocket.Bind(m_Endpoint);

                    //将监听Socket置于侦听状态,(backlog):挂起连接队列的最大长度。
                    listenSocket.Listen(10);

                    //创建一个线程执行的委托,无返回值
                    ThreadStart threadFun = new ThreadStart(ListenConnectingRequest);

                    //创建一个监听线程 
                    listenThread = new Thread(threadFun);

                    //线程设置为后台运行
                    listenThread.IsBackground = true;

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

                    AddLog("开始监听客户端传来的信息!");
                    btn_conn.Text = "关闭服务器";
                }
                else
                {
                    //关闭监听
                    listenSocket.Close();//关闭监听套接字,并释放
                    listenThread.Abort();//强行中断
                    AddLog("结束监听客户端传来的信息!");
                    AddLog("关闭服务器,断开所有客户端用户的连接!");

                    //切断所有客户端的连接
                    for (int i = 0; i < listBox1.Items.Count; i++)
                    {
                        string str = listBox1.Items[i].ToString();
                        Socket m_socket = dicSockets[str];
                        m_socket.Close();
                    }
                    btn_conn.Text = "开启服务器";
                }
            }
            catch (Exception f)
            {
                MessageBox.Show("错误:" + f.ToString(), "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                AddLog("服务端启动服务失败!");
            }
        }

        public void AddLog(string str)
        {
            if (listBox2.Items.Count > 50)
            {
                listBox2.Items.Clear();
            }
            listBox2.Items.Add(str);
            listBox2.SelectedIndex = listBox2.Items.Count - 1;
        }


        /// <summary>
        /// 监听客户端发来的请求
        /// </summary>
        private void ListenConnectingRequest()
        {
            while (true)  //持续不断监听客户端发来的请求
            {
                try
                {
                    interactSocket = listenSocket.Accept();//阻塞,直到接收到客户端连接请求

                    // 向列表控件中添加客户端的IP信息;
                    listBox1.Items.Add(interactSocket.RemoteEndPoint.ToString());

                    // 将与客户端连接的套接字对象添加到集合中;
                    dicSockets.Add(interactSocket.RemoteEndPoint.ToString(), interactSocket);
                    AddLog(DateTime.Now.ToString("hh:mm:ss.fff") + " 客户端" + interactSocket.RemoteEndPoint.ToString() + "连接服务器成功! "); //客户端IP

                    //创建一个通信线程 
                    Thread threadRecvMsg = new Thread(new ParameterizedThreadStart(ServerRecvMsg));
                    threadRecvMsg.IsBackground = true;
                    //启动线程
                    threadRecvMsg.Start(interactSocket);
                    dicThreads.Add(interactSocket.RemoteEndPoint.ToString(), threadRecvMsg); // 将新建的线程 添加 到线程的集合中去。
                }
                catch (Exception)
                {
                }
            }
        }

        private void ServerRecvMsg(object m_InteractSocket)
        {
            Socket serverSocket = (Socket)m_InteractSocket; //类型转换 objec->Socket
            string str = interactSocket.RemoteEndPoint.ToString();
            while (true)
            {
                //创建一个内存缓冲区 其大小为1024*1024字节  即1M
                byte[] arrServerRecMsg = new byte[1024 * 1024];
                try
                {
                    //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
                    int length = serverSocket.Receive(arrServerRecMsg);
                    //如果屏蔽名单中有这个用户,屏蔽信息接收
                    if (!list_SealedClients.Contains(str))
                    {
                        //将机器接受到的字节数组转换为人可以读懂的字符串
                        string strSRecMsg = "";        //   Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
                        for (int i = 0; i < length; i++)
                        {
                            strSRecMsg = strSRecMsg + arrServerRecMsg[i].ToString("X2") + " ";
                        }
                        if (strSRecMsg.Length != 0)
                        {
                            //显示接收的信息
                            string dispstr = DateTime.Now.ToString("hh:mm:ss.fff") + " FromIP " + interactSocket.RemoteEndPoint.ToString() + " :" + strSRecMsg;
                            AddLog(dispstr);
                            //this.BeginInvoke(new Update1(EditUi1), dispstr, arrServerRecMsg, length);        //显示接收到的数据包,并根据情况回应设备
                            AnalyticGetData(arrServerRecMsg, length, str);
                        }
                    }

                }
                catch (Exception)
                {
                    AddLog(DateTime.Now.ToString("hh:mm:ss.fff") + " 客户端" + str + "已断开服务器!");
                    // 从通信套接字 集合中删除被中断连接的通信套接字;
                    dicSockets.Remove(str);
                    // 从通信线程集合中删除被中断连接的通信线程对象;
                    dicThreads.Remove(str);
                    // 从列表中移除被中断的连接IP
                    listBox1.Items.Remove(str);
                    // 从屏蔽列表从清除
                    list_SealedClients.Remove(str);
                    break;//结束该线程
                }
            }
        }

        private void ServerSingSenddata(byte[] senddata)
        {
            string strKey = "";
            try
            {
                strKey = listBox1.Text.Trim();
                if (string.IsNullOrEmpty(strKey))   // 判断是不是选择了发送的对象;
                {
                    MessageBox.Show("请选择你要发送的在线客户端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    if (!list_SealedClients.Contains(strKey))
                    {
                        string sendmsg = "";
                        for (int i = 0; i < senddata.Length; i++)
                        {
                            sendmsg = sendmsg + senddata[i].ToString("X2") + " ";
                        }
                        dicSockets[strKey].Send(senddata);                                                         //显示发送的信息
                        AddLog(DateTime.Now.ToString("hh:mm:ss.fff") + " SendTo " + strKey + " :" + sendmsg);
                        AddLog("");
                    }
                    else
                    {
                        MessageBox.Show(strKey + "已经被屏蔽!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("错误:" + ex.ToString(), "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                AddLog(dicSockets[strKey].RemoteEndPoint.ToString() + "客户端已断开连接,无法发送信息!");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            listBox2.Items.Clear(); 
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string copystr;
            copystr = "";
            for (int i = 0; i <= listBox2.Items.Count - 1; i++)
            {
                copystr = copystr + (string)listBox2.Items[i] + "\r\n";
            }
            Clipboard.Clear();
            Clipboard.SetDataObject(copystr);

            MessageBox.Show("显示的数据报文已拷贝到剪切板", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            AddLog("接收线程数量:" + dicThreads.Count.ToString());
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //1.没有选择退出
            if (listBox1.SelectedIndex == -1)
            {
                MessageBox.Show("请选择要断开的客户端!","警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            //2.切断客户端的连接       
            string RemoteEndPointStr = listBox1.SelectedItem.ToString();
            AddLog("强制断开客户端" + RemoteEndPointStr + "的连接!");
            listBox1.SelectedIndex = -1;
            Socket disconnSocket = dicSockets[RemoteEndPointStr];
            disconnSocket.Close();
        }

        //解析接收到的数据信息,并回应驱动读卡器显示文字、蜂鸣响声、播报语音、开关继电器等
        private void AnalyticGetData(byte[] getdata, int length, string IPort)
        {
            string msginf = "";
            uint cardhao;
            string cardnumberstr = "";
            switch (getdata[0])
            {
                case 0xc1:  //接收到IC读卡器读取的卡号
                case 0xcf:  //接收到IC离开读卡器
                    if (getdata[0] == 0xc1)
                    {
                        msginf = "数据解析:IC读卡器刷卡数据";
                    }
                    else { msginf = "数据解析:IC卡离开读卡器"; }
                    msginf = msginf + ",IP[" + getdata[1].ToString() + "." + getdata[2].ToString() + "." + getdata[3].ToString() + "." + getdata[4].ToString();
                    msginf = msginf + ",机号[" + Convert.ToString(getdata[5] + getdata[6] * 256) + "],数据包序号[" + Convert.ToString(getdata[7] + getdata[8] * 256) + "],卡号长度[" + Convert.ToString(getdata[9]) + "],16进制卡号[";
                    for (int i = 10; i < 10 + getdata[9]; i++)
                    {
                        msginf = msginf + getdata[i].ToString("X2");
                    }
                    cardhao = (uint)(getdata[13] * 256 * 256 * 256 + getdata[12] * 256 * 256 + getdata[11] * 256 + getdata[10]);
                    cardnumberstr = "0000000000" + Convert.ToString(cardhao);//卡号
                    cardnumberstr = cardnumberstr.Substring(cardnumberstr.Length - 10, 10);
                    msginf = msginf + "],转10进制卡号[" + cardnumberstr;

                    msginf = msginf +  "],唯一设备序号[";
                    for (int i = 10 + getdata[9]; i < length; i++)
                    {
                        msginf = msginf + getdata[i].ToString("X2");
                    }
                    msginf = msginf + "]";
                    AddLog(msginf);
                    AddLog("");
                    Response(IPort);
                    break;

                case 0xd1: //接收到ID读卡器读取的卡号
                case 0xdf: //接收到ID卡离开读卡器
                    if (getdata[0] == 0xd1)
                    {
                        msginf = "数据解析:ID读卡器刷卡数据";
                    }
                    else { msginf = "数据解析:ID卡离开读卡器"; }
                    msginf = msginf + ",IP[" + getdata[1].ToString() + "." + getdata[2].ToString() + "." + getdata[3].ToString() + "." + getdata[4].ToString();
                    msginf = msginf + ",机号[" + Convert.ToString(getdata[5] + getdata[6] * 256) + "],数据包序号[" + Convert.ToString(getdata[7] + getdata[8] * 256) + "]";

                    cardhao = (uint)(getdata[12] * 256 * 256 * 256 + getdata[11] * 256 * 256 + getdata[10] * 256 + getdata[9]);
                    cardnumberstr = "0000000000" + Convert.ToString(cardhao);//卡号
                    cardnumberstr = cardnumberstr.Substring(cardnumberstr.Length - 10, 10);

                    msginf = msginf + ",16进制卡号[" + getdata[9].ToString("X2") + getdata[10].ToString("X2") + getdata[11].ToString("X2") + getdata[12].ToString("X2") + getdata[13].ToString("X2") + "],转10进制卡号[" + cardnumberstr + "]";

                    msginf = msginf + ",唯一设备序号[";
                    for (int i = 14; i < length; i++)
                    {
                        msginf = msginf + getdata[i].ToString("X2");
                    }
                    msginf = msginf + "]";
                    AddLog(msginf);
                    AddLog("");
                    Response(IPort);
                    break;

                case 0xf3: //接收到读卡器心跳包
                    msginf = "数据解析:读卡器读卡器心跳包,IP[" + getdata[1].ToString() + "." + getdata[2].ToString() + "." + getdata[3].ToString() + "." + getdata[4].ToString();
                    msginf = msginf + ",机号[" + Convert.ToString(getdata[5] + getdata[6] * 256) + "],数据包序号[" + Convert.ToString(getdata[7] + getdata[8] * 256) + "],心跳包类型[" + Convert.ToString(getdata[9]) + "]";
                    msginf = msginf + ",长度[" + Convert.ToString(getdata[10]) + "]";
                    msginf = msginf + ",继电器状态[" + getdata[11].ToString("X2") + "]";
                    msginf = msginf + ",外部输入状态[" + getdata[12].ToString("X2") + "]";
                    msginf = msginf + ",随机动态码[" + getdata[13].ToString("X2") + getdata[14].ToString("X2") + getdata[15].ToString("X2") + getdata[16].ToString("X2") + "]";
                    for (int i = 17; i < length; i++)
                    {
                        msginf = msginf + getdata[i].ToString("X2");
                    }
                    msginf = msginf + "]";
                    AddLog(msginf);
                    AddLog("");
                    break;
            }
        }

        //回应读卡器驱动显示文字、蜂鸣响声、播报语音等
        private void Response(string IPort)
        {
            byte[] databuf = new byte[280];
            int i;
            int dispbytes;    //显示文字节数
            int speakbytes;   //语音播报字节表
            int sendbytes;    //报文数据长度           

            dispbytes = 34;   //双行屏34,四行屏72显示长度,如不显示文字可以为0

            string strls = "[v";
            if (SYDX.Value <= 16)
            {
                strls = strls + (SYDX.Value.ToString()).Trim() + "]";  //设置语音大小,在需要发送的语音字符串中任何位置加入[v10],表示将音量调到10级(范围0~16,0表示静音,16最大,每次重开机后,音量重置为10级)!
            }
            else { strls = strls + "16]"; }

            strls = strls + textBox12.Text.Trim();

            byte[] SpeakArr = System.Text.Encoding.GetEncoding(936).GetBytes(strls);//TTS语音转换为Ansi
            speakbytes = SpeakArr.GetLength(0);             //语音长度
            sendbytes = 11 + dispbytes + speakbytes + 4;    //总计发送数据长度

            databuf[0] = 0x5C;      //表示驱动蜂鸣器+TTS组合语音+显示文字+继电器
            databuf[1] = 0;         //机号低位,
            databuf[2] = 0;         //机号高位,如果高低位都为0表示任意机号,TCP是点对点通讯

            if (checkBox2.Checked)   //可以同时发出声响
            {
                databuf[3] = (byte)(comboBox3.SelectedIndex);
                if (radioButton2.Checked)  //背光灯不变
                {
                    databuf[3] = (byte)(databuf[3] | 0x80);
                }
            }
            else
            {
                databuf[3] = 0xff;//不发出声响
                if (radioButton2.Checked)  //背光灯不变
                {
                    databuf[3] = (byte)(databuf[3] & 0x80);
                }
            }

            switch (comboBox2.SelectedIndex)  //继电器
            {
                case 1:
                    databuf[4] = 0xF1;
                    break;
                case 2:
                    databuf[4] = 0xF2;
                    break;
                case 3:
                    databuf[4] = 0xF3;
                    break;
                case 4:
                    databuf[4] = 0xF4;
                    break;
                case 5:
                    databuf[4] = 0xF5;
                    break;
                case 6:
                    databuf[4] = 0xF6;
                    break;
                case 7:
                    databuf[4] = 0xF7;
                    break;
                case 8:
                    databuf[4] = 0xF8;
                    break;
                default:
                    databuf[4] = 0xF0;
                    break;
            }
            i = Convert.ToInt32(textBox11.Text);      //继电器时长
            databuf[5] = (byte)(i % 256);
            databuf[6] = (byte)(i / 256);

            databuf[7] = (byte)(numericUpDown1.Value);//显示保留时间,单位为秒,为255时表示永久显示
            databuf[8] = 0;                           //在显示屏中的哪个位置开始
            databuf[9] = (byte)dispbytes;             //显示字符串长度 0-34为全屏

            databuf[10] = (byte)speakbytes;           //TTS语音长度

            strls = textBox12.Text + "                                            ";
            byte[] strlsansi = System.Text.Encoding.GetEncoding(936).GetBytes(strls);//显示文字转换为Ansi
            for (i = 0; i < speakbytes; i++)
            {
                databuf[11 + i] = (Byte)strlsansi[i];
            }

            for (i = 0; i < speakbytes; i++)          //连播语音代码
            {
                databuf[11 + databuf[9] + i] = (Byte)SpeakArr[i];
            }

            databuf[10 + databuf[9] + speakbytes + 1] = 0x55;   //防干扰后缀
            databuf[10 + databuf[9] + speakbytes + 2] = 0xAA;
            databuf[10 + databuf[9] + speakbytes + 3] = 0x66;
            databuf[10 + databuf[9] + speakbytes + 4] = 0x99;

            int sendlen = 10 + databuf[9] + speakbytes + 5;
            byte[] sendbuf = new byte[sendlen];
            string dispstr = DateTime.Now.ToString("hh:mm:ss.fff") + " SendTo " + IPort + " :";
            for (i = 0; i < sendlen; i++)          //连播语音代码
            {
                sendbuf[i] = databuf[i];
                dispstr = dispstr + databuf[i].ToString("X2") + " ";
            }

            dicSockets[IPort].Send(sendbuf);
            AddLog(dispstr);
            AddLog(" ");
        }

        private void button6_Click(object sender, EventArgs e)
        {
            byte[] sendbuf = new byte[4];
            sendbuf[0] = 0x96;      //声响指令
            sendbuf[1] = 0;         //机号低位,
            sendbuf[2] = 0;         //机号高位,如果高低位都为0表示任意机号,TCP是点对点通讯
            sendbuf[3] = (byte)(comboBox3.SelectedIndex);

            ServerSingSenddata(sendbuf);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            byte[] sendbuf = new byte[6];
            sendbuf[0] = 0x78;      //继电器指令
            sendbuf[1] = 0;         //机号低位,
            sendbuf[2] = 0;         //机号高位,如果高低位都为0表示任意机号,TCP是点对点通讯

            switch (comboBox2.SelectedIndex)
            {
                case 1:
                    sendbuf[3] = 0xF1;
                    break;
                case 2:
                    sendbuf[3] = 0xF2;
                    break;
                case 3:
                    sendbuf[3] = 0xF3;
                    break;
                case 4:
                    sendbuf[3] = 0xF4;
                    break;
                case 5:
                    sendbuf[3] = 0xF5;
                    break;
                case 6:
                    sendbuf[3] = 0xF6;
                    break;
                case 7:
                    sendbuf[3] = 0xF7;
                    break;
                case 8:
                    sendbuf[3] = 0xF8;
                    break;
                default:
                    sendbuf[3] = 0xF0;
                    break;
            }
            int i = Convert.ToInt32(textBox11.Text);//延时
            sendbuf[4] = (byte)(i % 256);
            sendbuf[5] = (byte)(i / 256);

            ServerSingSenddata(sendbuf);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            byte[] sendbuf = new byte[6];
            sendbuf[0] = 0x78;      //继电器指令
            sendbuf[1] = 0;         //机号低位,
            sendbuf[2] = 0;         //机号高位,如果高低位都为0表示任意机号,TCP是点对点通讯

            switch (comboBox2.SelectedIndex)
            {
                case 1:
                    sendbuf[3] = 0xE1;
                    break;
                case 2:
                    sendbuf[3] = 0xE2;
                    break;
                case 3:
                    sendbuf[3] = 0xE3;
                    break;
                case 4:
                    sendbuf[3] = 0xE4;
                    break;
                case 5:
                    sendbuf[3] = 0xE5;
                    break;
                case 6:
                    sendbuf[3] = 0xE6;
                    break;
                case 7:
                    sendbuf[3] = 0xE7;
                    break;
                case 8:
                    sendbuf[3] = 0xE8;
                    break;
                default:
                    sendbuf[3] = 0xE0;
                    break;
            }
            int i = Convert.ToInt32(textBox11.Text);//延时
            sendbuf[4] = (byte)(i % 256);
            sendbuf[5] = (byte)(i / 256);

            ServerSingSenddata(sendbuf);
        }

        private void button10_Click(object sender, EventArgs e)
        {
            string strls;
            byte[] sendbuf = new byte[39];
            int i;

            sendbuf[0] = 0x5a;      //显示文字的指令
            sendbuf[1] = 0;         //机号低位,
            sendbuf[2] = 0;         //机号高位,如果高低位都为0表示任意机号,TCP是点对点通讯

            if (checkBox2.Checked)   //可以同时发出声响
            {
                sendbuf[3] = (byte)(comboBox3.SelectedIndex);
                if (radioButton2.Checked)  //背光灯不变
                {
                    sendbuf[3] = (byte)(sendbuf[3] | 0x80);
                }
            }
            else
            {
                sendbuf[3] = 0xff;//不发出声响
                if (radioButton2.Checked)  //背光灯不变
                {
                    sendbuf[3] = (byte)(sendbuf[3] & 0x80);
                }
            }

            sendbuf[4] = (byte)(numericUpDown1.Value);//显示保留时间,单位为秒,为255时表示永久显示

            strls = textBox12.Text + "                                        ";
            byte[] strlsansi = System.Text.Encoding.GetEncoding(936).GetBytes(strls);//转换为Ansi //显示文字的ASCII码

            for (i = 0; i < 34; i++)
            {
                sendbuf[5 + i] = (Byte)strlsansi[i];
            }
            ServerSingSenddata(sendbuf);   
        }

        private void button9_Click(object sender, EventArgs e)
        {
            byte[] databuf = new byte[280];
            int i;
            int dispbytes;    //显示文字节数
            int speakbytes;   //语音播报字节表
            int sendbytes;    //报文数据长度           

            dispbytes = 34;   //双行屏34,四行屏72显示长度,如不显示文字可以为0

            string strls = "[v";
            if (SYDX.Value <= 16)
            {
                strls = strls + (SYDX.Value.ToString()).Trim() + "]";  //设置语音大小,在需要发送的语音字符串中任何位置加入[v10],表示将音量调到10级(范围0~16,0表示静音,16最大,每次重开机后,音量重置为10级)!
            }
            else { strls = strls + "16]"; }

            strls = strls + textBox12.Text.Trim();

            byte[] SpeakArr = System.Text.Encoding.GetEncoding(936).GetBytes(strls);//TTS语音转换为Ansi
            speakbytes = SpeakArr.GetLength(0);             //语音长度
            sendbytes = 11 + dispbytes + speakbytes + 4;    //总计发送数据长度

            databuf[0] = 0x5C;      //表示驱动蜂鸣器+TTS组合语音+显示文字+继电器
            databuf[1] = 0;         //机号低位,
            databuf[2] = 0;         //机号高位,如果高低位都为0表示任意机号,TCP是点对点通讯

            if (checkBox2.Checked)   //可以同时发出声响
            {
                databuf[3] = (byte)(comboBox3.SelectedIndex);
                if (radioButton2.Checked)  //背光灯不变
                {
                    databuf[3] = (byte)(databuf[3] | 0x80);
                }
            }
            else
            {
                databuf[3] = 0xff;//不发出声响
                if (radioButton2.Checked)  //背光灯不变
                {
                    databuf[3] = (byte)(databuf[3] & 0x80);
                }
            }

            switch (comboBox2.SelectedIndex)  //继电器
            {
                case 1:
                    databuf[4] = 0xF1;
                    break;
                case 2:
                    databuf[4] = 0xF2;
                    break;
                case 3:
                    databuf[4] = 0xF3;
                    break;
                case 4:
                    databuf[4] = 0xF4;
                    break;
                case 5:
                    databuf[4] = 0xF5;
                    break;
                case 6:
                    databuf[4] = 0xF6;
                    break;
                case 7:
                    databuf[4] = 0xF7;
                    break;
                case 8:
                    databuf[4] = 0xF8;
                    break;
                default:
                    databuf[4] = 0xF0;
                    break;
            }
            i = Convert.ToInt32(textBox11.Text);      //继电器时长
            databuf[5] = (byte)(i % 256);
            databuf[6] = (byte)(i / 256);

            databuf[7] = (byte)(numericUpDown1.Value);//显示保留时间,单位为秒,为255时表示永久显示
            databuf[8] = 0;                           //在显示屏中的哪个位置开始
            databuf[9] = (byte)dispbytes;             //显示字符串长度 0-34为全屏

            databuf[10] = (byte)speakbytes;           //TTS语音长度

            strls = textBox12.Text + "                                            ";
            byte[] strlsansi = System.Text.Encoding.GetEncoding(936).GetBytes(strls);//显示文字转换为Ansi
            for (i = 0; i < speakbytes; i++)
            {
                databuf[11 + i] = (Byte)strlsansi[i];
            }

            for (i = 0; i < speakbytes; i++)          //连播语音代码
            {
                databuf[11 + databuf[9] + i] = (Byte)SpeakArr[i];
            }

            databuf[10 + databuf[9] + speakbytes + 1] = 0x55;   //防干扰后缀
            databuf[10 + databuf[9] + speakbytes + 2] = 0xAA;
            databuf[10 + databuf[9] + speakbytes + 3] = 0x66;
            databuf[10 + databuf[9] + speakbytes + 4] = 0x99;

            int sendlen = 10 + databuf[9] + speakbytes + 5;
            byte[] sendbuf = new byte[sendlen];
            for (i = 0; i < sendlen; i++)          //连播语音代码
            {
                sendbuf[i] = databuf[i];
            }
            ServerSingSenddata(sendbuf);   
        }

        private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {                
                    listenSocket.Close();//关闭监听套接字,并释放
                    listenThread.Abort();//强行中断
                    AddLog("结束监听客户端传来的信息!");
                    AddLog("关闭服务器,断开所有客户端用户的连接!");

                    //切断所有客户端的连接
                    for (int i = 0; i < listBox1.Items.Count; i++)
                    {
                        string str = listBox1.Items[i].ToString();
                        Socket m_socket = dicSockets[str];
                        m_socket.Close();
                    }
                    btn_conn.Text = "开启服务器";    
            }
            catch (Exception f)
            {
                btn_conn.Text = "开启服务器";
            }
        }

        private void Form13_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                listenSocket.Close();//关闭监听套接字,并释放
                listenThread.Abort();//强行中断
                AddLog("结束监听客户端传来的信息!");
                AddLog("关闭服务器,断开所有客户端用户的连接!");

                //切断所有客户端的连接
                for (int i = 0; i < listBox1.Items.Count; i++)
                {
                    string str = listBox1.Items[i].ToString();
                    Socket m_socket = dicSockets[str];
                    m_socket.Close();
                }
                btn_conn.Text = "开启服务器";
            }
            catch (Exception f)
            {
                btn_conn.Text = "开启服务器";
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Sql】sql server数据库提示:执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb,错误:926。

【问题描述】 打开sql server2008r2数据库的时候&#xff0c; 系统提示执行Transact-SQL语句或批处理时发生了异常。 无法打开数据库msdb&#xff0c;错误&#xff1a;926。 【概念理解】 首先MSDB数据库是的作用&#xff1a; 用于给SQL Server代理提供必要的信息来运行调度警…

89㎡现代风格,年轻人都向往的家!福州中宅装饰,福州装修

对于美好家的向往&#xff0c;是每位业主的需求。 大到每一个工艺&#xff0c;小到每一道装修程序&#xff0c;我们都以认真的态度&#xff0c;用专业的服务品质将家装的理念深入到每户业主的内心,赢得了上万千业主的支持和肯定。 怀着最初的一颗匠心,对于每一项工艺都认真钻研…

宽带服务预约小程序的内容

宽带有很高的需求度&#xff0c;无论是企业办公楼还是家庭场景&#xff0c;对网络的需求度都比较高&#xff0c;而宽带安装服务商也往往有不少生意&#xff0c;但在实际发展中也面对着一些痛点&#xff1a; 1、服务传播套餐展示难 宽带业务的需求度不低&#xff0c;但依然有很…

Redis注解式开发结合SSM项目使用与Quartz框架介绍以及击穿、穿透、雪崩问题解决

目录 一、SSM项目整合Redis 1.1 导入pom依赖 1.2 spring-redis.xml 1.3 spring上下文配置 二、Redis注解式开发 2.1 Cacheable 注解 2.2 自定义策略 2.3 CachePut 注解 三、Redis中缓冲、击穿、穿透、雪崩问题解决 3.1 缓冲问题 —— Quartz 框架 3.2 常见的三种问题…

备份扫描工具 god_bak

Part1 前言 不想写东西&#xff0c;或者说换种说法 有些东西还没写完&#xff0c;有些系列也还没整完。就放一个昨天摸鱼写的东西。 如图&#xff0c;每个系列都还是会按照自己的风格来写&#xff0c;代码审计实战等都会结合自己挖掘或审计过的案例进行结合知识点的风格去写&…

为什么一家价值 17 亿美元的政府承包商选择 Liquid UI 而不是 SAP Fiori 来开发和自动化 SAP 质量管理?

背景 L3 Technologies 是一家领先的航空航天和国防技术创新企业&#xff0c;致力于开发端到端解决方案&#xff0c;以满足客户的关键任务需求。L3 在全球 130 个国家/地区拥有 50,000 多名员工&#xff0c;年收入约为 170 亿美元&#xff0c;作为一家灵活的全球技术创新企业&a…

兰台内外杂志兰台内外杂志社兰台内外编辑部2023年第29期目录

数字档案创新研究 现阶段优抚医院档案建设信息化工作探讨 宋萍; 1-3 公立医院党务档案智慧型管理策略研究 陈丽; 4-6 信息化视阈下档案管理工作存在问题及改进措施研讨 石丽静; 7-9 试析数字化建设在医院档案现代化管理中的应用 赵迎红; 10-12《兰台内外》投稿…

拖拽组件推荐 grid-layout,可以做工作台

场景可以做工作台 文档&#xff1a;https://jbaysolutions.github.io/vue-grid-layout/zh/ 效果

香港优才计划人才清单51项2023全网最详细解释!

香港优才计划人才清单51项2023全网最详细解释&#xff01; 目前香港优才计划人才清单已经更新&#xff0c;由原有13项专业增至51项&#xff0c;以满足现阶段香港发展的需要&#xff0c;并即时应用于香港人才引进计划。 当前的人才清单涵盖9个行业的51项专业工种&#xff0c;包括…

禅道项目信息通知到钉钉群配置步骤

禅道是我们常用的项目进度管理工具&#xff0c;禅道集成了webhook功能&#xff0c;可以通过发送 JSON 格式的数据到第三方hook地址&#xff0c;进行消息集成&#xff0c;包括钉钉、企业微信以及飞书。可以考虑将禅道和钉钉两者可以结合起来&#xff0c;将项目信息发送到钉钉群&…

【空调】空调主控板实习记录

空调主控板实习笔记记录1 空调型号 空调kfr35gw什么意思 { 这个表示空调是3500W的&#xff0c;是1.5匹空调。 除了以上所说&#xff0c;空调主要机型的型号标识及其含义&#xff1a; KFR-25GW&#xff0c;简称25机型。KFR-35GW&#xff0c;简称35机型。KFR-50LW&#xff0c…

Vue 传参踩坑之旅——事件总线与 props

Vue 传参踩坑之旅——事件总线与 props 缘由 今天突然发现项目出现了一个 bug&#xff0c;这里简单描述一下。 这里有 A、B、C、D 四个组件&#xff0c;关系为 A - 祖先、B - 父、C - 子、D - 叔&#xff08;实际业务组件关系复杂很多&#xff09;。 A - 祖先 B - 父 C - 子…

Leetcode刷题详解——括号生成

1. 题目链接&#xff1a;22. 括号生成 2. 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()…

Linux学习第35天:Linux LCD 驱动实验(二):星星之火可以燎原

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、LCD驱动程序编写 需要注意的地方&#xff1a; ①、 LCD 所使用的 IO 配置。 ②、 LCD 屏幕节点修改&#xff0c;修改相应的属性值&#xff0c;换成我们所使…

双十一电视盒子哪个牌子最好?老烧分享电视盒子品牌排行榜

在挑选电视盒子时很多人踩雷&#xff0c;我自己买过十来款电视盒子&#xff0c;存在不少问题&#xff0c;双十一这段时间身边买电视盒子的都会问我电视盒子哪个牌子最好&#xff0c;我今天来分享的是业内最专业的电视盒子品牌排行榜&#xff0c;双十一想买电视盒子可以从下面这…

TikTok和创作者经济:成为数字创意产业的一部分

在数字时代&#xff0c;社交媒体已成为了人们日常生活的一部分&#xff0c;不仅改变了我们与世界互动的方式&#xff0c;还催生了全新的产业——创作者经济。 作为这一趋势的一部分&#xff0c;TikTok已经崭露头角&#xff0c;成为数字创意产业的一部分&#xff0c;让创作者有…

ROS服务Service通信机制在无人车中的具体应用

1、引言 我们在通信机制中&#xff0c;前面已有介绍这个Service服务&#xff1a;ROS通信机制之服务(Service)的应用 一般在一些通信处理比较简单的场景比较适合&#xff0c;这里我们在无人车上面来实际操作一些很常见的服务&#xff1a;发布电压数据、点亮与关闭LED灯、开启与…

关于变电站综合自动化系统的案例应用分析-安科瑞 蒋静

摘 要&#xff1a;变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计&#xff0c;利用先进的计算机技术、通信技术、信号处理技术&#xff0c;实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。 …

【Linux】编译安装nginx,手写service配置文件,深度理解systemd控制管理服务底层原理

目录 一、了解服务 1、服务的本质 2、centos7的systemd的服务 3、service unit file配置文件的组成以及掌握常用选项 4、关于systemd管理的命令学习 5、运行级别 二、编译安装nginx&#xff0c;以及手写service配置文件&#xff0c;请看注释 ​编辑 一、了解服务 1、服…

AI+BI行业数字化转型研讨会 - 总结精华回顾

带您一起观看研讨会精彩内容回顾&#xff01; || 导语 AIBI行业数字化转型研讨会—引领未来&#xff0c;智慧转型 德昂信息技术(北京)有限公司于2023年10月26日成功举办了AIBI行业数字化转型研讨会。此次盛会汇聚了产业精英、企业领袖以及技术专家&#xff0c;共同探讨在快速…