C sharp实例:华盾武器门数据接收和解析

项目介绍:
本实例主要是接收安检金属门的数据解析并显示到界面上,只做功能实现,不做界面美化
硬件:金属门一个、网线一根、电脑主机,金属门网线可以直接接到电脑主机上
开发环境: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 = "0x"+BitConverter.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 name="bytes"></param>/// <returns></returns>public 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 i=0;i<10;i++){if (bytes[dataLength + i - 19] == 0x00)continue;//0x00则退出本次循环switch (bytes[dataLength+i-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));}}
}

运行结果:

以上代码完全纯手工打造,如果有疑问欢迎留言,喜欢的小伙伴们可以多多分享,让更多志同道合的伙伴们加入我们的微信交流群一起学习、进步!

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

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

相关文章

Nature封面:大团队日趋中庸,小团队更容易出颠覆性创新

全世界只有3.14 % 的人关注了数据与算法之美【导读】现代科学研究团队的规模越来越大&#xff0c;一般认为&#xff0c;大团队往往有着更充足的经费支持和多样化的研究人员&#xff0c;更有利于科学创新。但近日Nature发表封面文章&#xff0c;认为大团队往往因为失败代价太高而…

linux 创建ll,两台linux建立GRE隧道

1.拓扑图&#xff1a; 备注&#xff1a;因为应用原因&#xff0c;需要在linux2上添加一个公网地址&#xff0c;并且在中间路由设备不受控制的情况下&#xff0c;Linux1能访问到linux2上面的公网地址。2.基本接口配置&#xff1a;linux1:192.168.10.1/24linux2:192.168.20.2/24R…

Exchange Server2010系列之十一:部署CAS+HT角色高可用性

Exchange Server 2010使用基于角色的管理模型。多角色服务器的安装及配置&#xff0c;我们在前面的文章中已经做过介绍。本案例中根据高可用性要求&#xff0c;我们需要把服务器角色部署在分开的服务器上面&#xff0c;并且实现CAS、HT、MBX角色的高可用。在此&#xff0c;我的…

用BenchmarkDotNet看Property

属性——Property&#xff0c;由get,set访问器组成&#xff0c;这是C#使用度比较高的类成员。今天分几组对比测试&#xff0c;来看一下使用Property的性能。被测试对象&#xff1a;public class MyClass {private string _myProperty1 DateTime.Now.ToString();public string …

盘点2019年最有钱的爸爸们

全世界只有3.14 % 的人关注了数据与算法之美纽约时间3月5日&#xff0c;又到了一年一度的大佬炫富时间了&#xff0c;福布斯发布第33期2019年度全球亿万富豪榜&#xff0c;全世界最有钱的人都在这了。第33期福布斯全球亿万富豪榜TOP20 ↓据统计&#xff0c;本次评选一共有2153位…

android拖拽 字体变形,字体变形的几种方法与技巧

原标题&#xff1a;字体变形的几种方法与技巧替换法是在统一形态的文字元素加入另类不同的图形元素或文字元素。 其本质是根据文字的内容意思&#xff0c;用某一形象替代字体的某个部分或某一笔画&#xff0c;这些形象或写实或夸张。将文字的局部替换&#xff0c;是文字的内涵外…

每日一笑 | 终于知道为什么胖了之后气质会垮了

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

人工智能时代,学好数学很重要!

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共…

为什么选择ASP.NET Core

什么是.NET有一次小飞去面试&#xff0c;面试官上来就问了一个宏观的问题&#xff1a;“你觉得什么是.NET”&#xff1f;小飞的脑子嗡嗡的&#xff0c;支吾了半天&#xff0c;才吐了一些碎片化的词语&#xff1a;“跨平台、开源、微软…”虽然作为一个.NET人&#xff0c;但是小…

抢不到“猫抓杯”怎么办?这些女神更喜欢

▲数据汪特别推荐点击上图进入玩酷屋不久前才送走了西方情人节&#xff0c;男同胞们的第二个“送礼节”----女神节。这个令所有女生翘首、期待、憧憬、摩拳擦掌的日子&#xff0c;令所有男士小心翼翼、挑礼物到崩溃的日子&#xff0c;就要到了。小木作为妇女之友&#xff0c;听…

程序出Bug,一定是环境的锅!

现象前几天&#xff0c;一个客户反映说&#xff0c;他看到的数据顺序是乱的&#xff0c;不是按照日期倒排。但是在测试环境、预生产环境&#xff0c;都无法重现问题&#xff0c;即使使用相同的程序版本。定位查看代码&#xff0c;出问题的功能使用了第三方ORM框架&#xff0c;无…

AIX逻辑卷管理(LVM)

VG PV PP LV LP关系图 转载于:https://www.cnblogs.com/limt/archive/2013/04/06/4199257.html

鸿蒙操作系统如何打通 Windows 操作系统?

华为&#xff1a;我们选择拥抱 Windows华为给出的解决方案是在微软 Windows 操作系统中部署 HarmonyOS 分布式插件。运行 Windows 操作系统的电脑和运行鸿蒙操作系统的华为手机将形成超级终端&#xff0c;文件资源管理器实现互通。在 Windows 文件资源管理器中&#xff0c;将显…

凯立德导航android历史版本,凯立德导航升级2020版

凯立德导航升级2020版是一款非常专业的手机机车导航软件&#xff0c;它可以为大家提供便捷的导航服务&#xff0c;用户只需要输入自己想去的地方&#xff0c;软件会智能推荐一条最便捷的路线&#xff0c;同时会告知用户目的地附近热门的吃喝玩乐场所&#xff0c;有需要的用户来…

用 Python 实现打飞机

全世界只有3.14 % 的人关注了数据与算法之美所用技术和软件python 2.7pygame 1.9.3pyCharm准备工作安装好 pygame 在第一次使用 pygame 的时候&#xff0c;pyCharm 会自动 install pygame。下载好使用的素材。技术实现初始化 pygame首先要初始化 pygame &#xff0c;之后设定一…

把HttpClient换成IHttpClientFactory之后,放心多了

前言关于HttpClient的使用&#xff0c;个人在很多场景都派上用场了&#xff0c;比如在Winform或后台服务中用其调用接口获取和上传数据、微服务中用其进行各服务之间的数据共享等&#xff0c;到目前来看&#xff0c;似乎还没有出现过什么问题&#xff0c;但当我看到官方文档介绍…

android app银联支付,android app 快速接入银联支付流程(android studio版)

刚接触了下银联支付&#xff0c;在网上搜还是看官方文档银联支付都不是很清晰&#xff0c;所以自己总结一篇&#xff0c;希望可以帮助大家快速集成。一.进入下载官网&#xff0c;选择下载手机控件支付demo&#xff1a;https://open.unionpay.com/ajweb/help/file/techFile?pro…

基础排序算法 – 冒泡排序Bubble sort

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换&#xff0c; 这样一趟过去后,最大或最小的数字被交换到了最后一位&#xff0c; 然后再从头开始进行两两比较交换&#xff0c;直到倒数第二位时结束。 从小到大排序&#xff1a; 原始待排序数组| 6 | 2 | …

这么简单的bug,你改了2天?

大家好&#xff0c;我是Z哥。“这个 bug 的问题不是很明显吗&#xff1f;怎么这么久才搞定&#xff1f;”“就改一行代码&#xff0c;你怎么弄了这么久&#xff1f;”我想上面的言语几乎每个程序员都听到过。特别是面对那些“稍懂技术”的同事的时候。我觉得这篇文章特别适合你…

android最好的3d游戏机,终极盘点:Android必玩十大超猛3D游戏

2010年即将过去&#xff0c;今年是Android平台的发展非常迅猛的一年&#xff0c;系统版本从2.1、2.2一路飙升至2.3&#xff0c;各种手机与平板设备也层出不穷。与此相对的当然就是应用软件的大爆发&#xff0c;根据AndroLib在本周二所公布的数字&#xff0c;Android Market目前…