加人引流加人网站怎么做,百度收录提交申请网站,建设网站建站公司,服装定制店名怎么取项目介绍#xff1a;本实例主要是接收安检金属门的数据解析并显示到界面上#xff0c;只做功能实现#xff0c;不做界面美化硬件#xff1a;金属门一个、网线一根、电脑主机#xff0c;金属门网线可以直接接到电脑主机上开发环境#xff1a;vs2017 系统#xff1a;win10… 项目介绍本实例主要是接收安检金属门的数据解析并显示到界面上只做功能实现不做界面美化硬件金属门一个、网线一根、电脑主机金属门网线可以直接接到电脑主机上开发环境vs2017 系统win10涵盖知识点tcp通讯、文件写入、多线程委托、类型转换等软件操作流程点击开始监听按钮9082要是未被占用则开启监听然后人通过金属门就可以接收到数据金属门数据协议截图知识点介绍 1. socket.Listen(10); 官方给出的解释挂起连接队列的最大长度。 连接队列即连接池也就是要保证挂起的连接池中至少要有10个连接 我解释一下为什么要提前准备10个挂起的连接原因就是每当一个新用户接入进来时就需要立即创建一个socket创建也需要时间和消耗系统资源这样就会影响高并发的性能 用不用先放那用的时候直接取即2. Socket clientSocket socket.Accept();AcceptSocket是同步的你可以用异步通讯的BeginAcceptSocket或者用多线程。没有请求到达就会“卡”住术语叫程序阻塞socket同步通讯就是这个步骤执行到AcceptSocket就会阻塞等待请求直到有请求到达时才执行后面的语句并且处理这个请求3. while (true) 因为组要一直监听所以得死循环4. 开启一个后来线程不然主界面会假死 new Thread(delegate () {主体代码;}) { IsBackground true }.Start();
5.从其它线程访问主线程控件需要委托不然界面不会有数据的 this.Invoke((EventHandler)delegate { richTextBox1.Text “” }); 不完善的地方金属门每通过一次会发送三条数据三条数据间有时间间隔所以为了接收到完整数据我 Thread.Sleep(1000);睡了1秒钟所以几个人同时通过金属门会有数据丢包暂时没做相应处理。完整代码如下using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Windows.Forms;
using System.IO;
using System.Threading;namespace TcpRecive
{public partial class mainForm : Form{public mainForm(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){textBox1.Text 9082; }public void tcpRecive(int port){if (PortIsUse(port)){label1.Text 端口 port.ToString() 被占用; return;}else label1.Text 端口 port.ToString() 没有占用,监听已开启;new Thread(delegate (){int recv;//定义接收数据长度变量IPAddress ip IPAddress.Parse(192.168.1.119);//接收端所在IP 192.168.1.119换成127.0.0.1不可以为什么IPEndPoint ipEnd new IPEndPoint(ip, port);//接收端所监听的接口,ip也可以用IPAddress.AnySocket socket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化一个Socket对象socket.Bind(ipEnd);//绑定套接字到一个IP地址和一个端口上(bind())//官方给出的解释挂起连接队列的最大长度。//连接队列即连接池也就是要保证挂起的连接池中至少要有10个连接//我解释一下为什么要提前准备10个挂起的连接原因就是每当一个新用户接入进来时就需要立即创建一个socket创建也需要时间和消耗系统资源这样就会影响高并发的性能//用不用先放那用的时候直接取即可socket.Listen(10);while (true){try{byte[] data new byte[1024];//对data清零//for (int i 0; i data.Length; i) { data[i] 0; }Socket clientSocket socket.Accept(); //一旦接受连接创建一个客户端Thread.Sleep(1000);//不延时收不到完整数据可能是三组数据间有时间间隔recv clientSocket.Receive(data);// 或者clientSocket.Receive(data, data.Length, SocketFlags.None);获取收到的数据的长度if (recv 0) //如果收到的数据长度小于0则退出break;//string stringData Encoding.UTF8.GetString(data);//string stringData byteToHexStr(data);//MessageBox.Show( dataDecode(data).ToString());//dataDecode(data);string stringData 0xBitConverter.ToString(data, recv-32,32).Replace(-, 0x).ToLower();//只取最后32个字节的数据//string stringData Encoding.ASCII.GetString(data);this.Invoke((EventHandler)delegate{richTextBox1.Text DateTime.Now.ToString(yy-MM-dd hh:mm:ss) 安检人数: dataDecode(data, 0, recv) 报警人数: dataDecode(data, 1, recv) 报警信息 alarmPosition(data, recv) \n stringData \n;});fileWrite(DateTime.Now.ToString(yy-MM-dd hh:mm:ss) \n stringData);}catch { };}}){ IsBackground true }.Start();}/// summary/// 字节数组转16进制字符串/// /summary/// param namebytes/param/// returns/returnspublic static string byteToHexStr(byte[] bytes){string returnStr ;if (bytes ! null){for (int i 0; i bytes.Length; i){returnStr bytes[i].ToString(X2);}}return returnStr;}public int dataDecode(byte[] data, int type,int dataLength){int personNum 0;switch (type){case 0:personNum Convert.ToInt32(BitConverter.ToString(data, dataLength-27, 4).Replace(-, ), 16); break; //取出对应位置连续四个字节并转换为通过人数case 1:personNum Convert.ToInt32(BitConverter.ToString(data, dataLength-23, 4).Replace(-, ), 16); break; //取出对应位置连续四个字节并转换为报警人数 default:; break;}return personNum;}public string alarmPosition(byte[] bytes, int dataLength){string alarmStr ;for(int i0;i10;i){if (bytes[dataLength i - 19] 0x00)continue;//0x00则退出本次循环switch (bytes[dataLengthi-19]){case 0x01: alarmStr 区位 (i 1).ToString() 工具刀枪; break;case 0x02: alarmStr 区位 (i 1).ToString() 马口铁罐体; break;case 0x03: alarmStr 区位 (i 1).ToString() 铝制易拉罐; break;case 0x04: alarmStr 区位 (i 1).ToString() 违禁品混合; break;case 0x05: alarmStr 区位 (i 1).ToString() 铜制铝制管体; break;case 0x09: alarmStr 区位 (i 1).ToString() 手机手表; break;case 0x0a: alarmStr 区位 (i 1).ToString() 全金属报警; break;case 0X30: alarmStr 区位 (i 1).ToString() 非磁性枪支; break;default: alarmStr ; break;}}if (alarmStr )return 无报警;else return alarmStr;}public void fileWrite(string str){if (!File.Exists(info.txt))File.Create(info.txt).Close();//创建文件并关闭StreamWriter sw new StreamWriter(info.txt,true);//向文件追加数据sw.WriteLine(str);sw.Close();}//通过 IPGlobalProperties来获取本机的网络连接的信息并通过GetActiveTcpListeners找到已用端口进而可以知道所需的端口是否已被占用public static bool PortIsUse(int port){bool isUse false;IPGlobalProperties ipProperties IPGlobalProperties.GetIPGlobalProperties();IPEndPoint[] ipEndPoints ipProperties.GetActiveTcpListeners();//找到已用端口foreach (IPEndPoint endPoint in ipEndPoints){if (endPoint.Port port)//判断是否存在{isUse true;break;}}return isUse;}private void button1_Click(object sender, EventArgs e){tcpRecive(int.Parse(textBox1.Text));}}
}运行结果以上代码完全纯手工打造如果有疑问欢迎留言喜欢的小伙伴们可以多多分享让更多志同道合的伙伴们加入我们的微信交流群一起学习、进步