Csharp实例:武汉智能安检闸机数据接收和解析

项目介绍:
本实例主要是接收安检闸机的数据解析并显示到界面上,只做功能实现,不做界面美化
硬件:闸机一个、网线一根、电脑主机
开发环境:vs2017 系统:win10
涵盖知识点:tcp通讯、文件写入、多线程,委托、类型转换等

软件操作流程:

点击开始监听按钮,8999要是未被占用则开启监听,然后人刷身份证通过安检闸机就可以接收到数据

数据格式截图:

安检闸机图片:

知识点介绍: 
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 += “”;                        });

完整代码如下:

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Text;
using System.Drawing;namespace TcpRecive
{public partial class mainForm : Form{public mainForm(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){textBox1.Text = "8999"; }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(IPAddress.Any, 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[70000];//对data清零Socket clientSocket = socket.Accept(); //一旦接受连接,创建一个客户端recv = clientSocket.Receive(data);// 或者clientSocket.Receive(data, data.Length, SocketFlags.None);获取收到的数据的长度if (recv == 0) //如果收到的数据长度小于0,则退出break;//string stringData = Encoding.ASCII.GetString(data);string stringData = Encoding.UTF8.GetString(data);dataDecode(data);fileWrite(DateTime.Now.ToString("yy-MM-dd hh:mm:ss") + "\n" + stringData);}catch(Exception ex){MessageBox.Show(ex.ToString());}}}){ 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 void dataDecode(byte[] data){int dataL = 0, isPass = 0, nameL = 0, ethnicL = 0, sexL = 0, birthdayL = 0, adressL = 0, cardNoL = 0, startTimeL = 0, endTimeL = 0, cardImageL = 0, captureImageL = 0;string item = "", name = "", ethnic = "", sex = "", birthday = "", adress = "", cardNo = "", startTime = "", endTime = "";dataL = BitConverter.ToInt32(data, 0);//数据包大小,低字节在前面,高字节在后面isPass = BitConverter.ToInt32(data, 4);//人证核验结果nameL = BitConverter.ToInt32(data, 8);//姓名长度name = Encoding.UTF8.GetString(data, 12, nameL);//姓名ethnicL = BitConverter.ToInt32(data, 12 + nameL);//民族长度ethnic = Encoding.UTF8.GetString(data, 16 + nameL, ethnicL);//民族sexL = BitConverter.ToInt32(data, 16 + nameL + ethnicL);//性别长度sex = Encoding.UTF8.GetString(data, 20 + nameL+ ethnicL,sexL);//性别birthdayL = BitConverter.ToInt32(data, 20 + nameL + ethnicL + sexL);birthday = Encoding.UTF8.GetString(data, 24 + nameL + ethnicL+sexL,birthdayL);//出生日期adressL = BitConverter.ToInt32(data, 24 + nameL + ethnicL + sexL + birthdayL);adress = Encoding.UTF8.GetString(data, 28 + nameL + ethnicL + sexL+birthdayL, adressL);//地址cardNoL = BitConverter.ToInt32(data, 28 + nameL + ethnicL + sexL + birthdayL + adressL);cardNo = Encoding.UTF8.GetString(data, 32 + nameL + ethnicL + sexL + birthdayL+adressL, cardNoL);//身份证号码startTimeL = BitConverter.ToInt32(data, 32 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL);startTime = Encoding.UTF8.GetString(data, 36 + nameL + ethnicL + sexL + birthdayL + adressL+ cardNoL, startTimeL);//身份证起始时间endTimeL = BitConverter.ToInt32(data, 36 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL);endTime = Encoding.UTF8.GetString(data, 40 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL+ startTimeL, endTimeL);//身份证终止时间if (isPass == 1)item = "人证核验:成功" + "\n姓名:" + name + "\n民族:" + ethnic + "\n性别:" + sex + "\n出生日期:" + birthday +"\n地址:" + adress + "\n身份证号码:" + cardNo + "\n身份证起始时间:" + startTime + "\n身份证终止时间:" + endTime;elseitem = "人证核验:失败" + "\n姓名:" + name + "\n民族:" + ethnic + "\n性别:" + sex + "\n出生日期:" + birthday +"\n地址:" + adress + "\n身份证号码:" + cardNo + "\n身份证起始时间:" + startTime + "\n身份证终止时间:" + endTime;cardImageL = BitConverter.ToInt32(data, 40 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL);MemoryStream ms1 = new MemoryStream(data, 44 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL, cardImageL);captureImageL = BitConverter.ToInt32(data, 44 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL + cardImageL);MemoryStream ms2 = new MemoryStream(data, 48 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL+cardImageL, captureImageL);//ms.Write(data, 44 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL, cardImageL);Image img1 = Image.FromStream(ms1);Image img2 = Image.FromStream(ms2);this.Invoke((EventHandler)delegate{richTextBox1.Text = item;pictureBox1.Image = img1; //更新在窗体控件上          pictureBox2.Image = img2;});ms1.Flush(); ms2.Flush();ms1.Close(); ms2.Close();ms1.Dispose(); ms2.Dispose();}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/301529.shtml

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

相关文章

墨迹天气android,墨迹天气Android产品分析

墨迹天气官网宣传图一、产品概况1、产品简介墨迹天气是一款免费天气预报工具&#xff0c;提供日出日落信息&#xff0c;六小时天气预报2、主要竞品天气通、最美天气、91黄历天气、知趣天气、懒人天气、琥珀天气二、体验环境手机&#xff1a;华为A199操作系统&#xff1a;Androi…

可编程的智能小车,100种玩法,让孩子玩出理科编程思维

▲数据汪特别推荐点击上图进入玩酷屋毫无疑问&#xff0c;数学、科学和计算机科学是解决21世纪现代问题的三大支柱。当现在各式各样的兴趣班和教育辅导班快要呈现饱和状态时&#xff0c;一种新兴的教育活动正如火如荼地进行着那就是少儿编程。少儿编程奇迹般的红火&#xff0c;…

我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能&#xff0c;在Android的界面上&#xff0c;Music和Video两个应用程序都是调用MediaPlayer实现的。 首先来看看MediaPlayer的生命周期&#xff…

AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

AgileConfig 当初是设计给我自己用的一个工具&#xff0c;所以只设置了一道管理员密码&#xff0c;没有用户的概念。但是很多同学在使用过后都提出了需要多用户支持的建议。整个团队或者整个公司都使用同一个密码来管理非常的不方便。今天 AgileConfig 1.3.0 版本终于支持了多用…

每日一笑 | 马冬梅当上了百度投资董事???

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

批处理解决局域网共享打印机问题

随着公司规模的扩大&#xff0c;人员流动性也越来越大。特别是业务这块&#xff0c;隔三差五的就来几个业务人员&#xff0c;一入职各种后勤工作都要给他们安排好。网络这块除了基本的网线&#xff0c;电话要通以外。最最后面的当然就是打印机的共享了。 先说说公司的网络环境。…

.NET MAUI 预览版 6 发布

原文&#xff1a;bit.ly/2SKad9g作者&#xff1a;.NET Blog - David译者&#xff1a;精致码农 - 王亮当我们还在从微软 Build 大会和 .NET 6 预览版 4 中缓过来的时候&#xff0c;我们在这里就开始分享我们在 .NET 6 预览版 5 中对 .NET 多平台应用程序开发框架(.NET MAUI)的持…

德国布线牛到不行?今天带你看看咱们中国的!

全世界只有3.14 % 的人关注了数据与算法之美相信不少人都有看过德国的布线&#xff0c;那整齐的感觉让人舒服。这是由BuzzFeed网站刊登的照片&#xff0c;从图片可以看出&#xff0c;德国工程师严谨的态度却是表现的淋漓尽致&#xff0c;让人大饱眼福&#xff0c;简直就是洁癖症…

Java进阶02 异常处理

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; 程序很难做到完美&#xff0c;不免有各种各样的异常。比如程序本身有bug&#xff0c;比如程序打印时打印机没有纸了&#xff0c;比如内存不足。…

每日一笑 | 对不起,我还没下班...

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

差异分析定位Ring 3保护模块

差异分析定位Ring 3保护模块 由于保护模块通常会Hook操作系统的原生DLL接口来进行保护&#xff0c;所以可以采用差异比较原生DLL文件和加载到内存中的原生DLL直接的差别来定位Ring 3模块。 在分析的过程中&#xff0c;为了防止被Ring 3保护模块发现&#xff0c;暂时可以先把除了…

html 输入框自动缩短 一行内显示,JQuery UI组合框自动补全功能改进版(即时全部显示+input内容保存)...

JQuery UI Autocomplete(自动补全)功能在input前端设计中非常有用&#xff0c;最近一个项目正好用到&#xff0c;仔细研究了下组合框(combobox)的自动补全部分&#xff0c;官方地址是&#xff1a;https://jqueryui.com/autocomplete/#combobox。官方的功能需要一个额外下拉按钮…

Magicodes.IE 2.5.4.2发布

Magicode.IE&#xff0c;导入导出通用库&#xff0c;支持Dto导入导出、模板导出、花式导出以及动态导出&#xff0c;支持Excel、Csv、Word、Pdf和Html。Github&#xff1a;https://github.com/dotnetcore/Magicodes.IE码云&#xff08;手动同步&#xff0c;不维护&#xff09;&…

耗时6年的DK博物科普巨著,全面提升孩子的认知高度

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;小木每次带侄子去郊游时&#xff0c;侄子总是会不断地提问&#xff0c;“这是…

android fragmentstatepageradapter框架,安卓爬坑指南之FragmentStatePagerAdapter

一次开发中&#xff0c;用到了viewpager嵌套viewpager&#xff0c;结果就踩到了这么一个坑。先上图&#xff1a;image.png图片中显示的界面布局和遇到的问题是这样的&#xff1a;首页发现版块是一个fragment&#xff0c;这个fragment中放了一个viewpager&#xff0c;这个viewpa…

每日一笑 | 一个男人逐渐变心的过程

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

html 表格 左侧表头,左侧是表头的JS表格控件(自写,网上没有的)

今天&#xff0c;项目中要用到该表格&#xff0c;找了一遍&#xff0c;发现没有合适的&#xff0c;于是自己动手丰衣足食。最终呈现效果如上图&#xff0c;1、左侧是表头的表格数据展现&#xff0c;2、支持多行&#xff0c;多表头3、固定表头的功能4、能够支持标题5、获取表格中…

一个人的夜晚,让这些公众号来温暖你。

“外表的美只能取悦于人的眼睛&#xff0c;而内在的美却能感染人的灵魂”。阅读的内容决定了你的视野&#xff0c;转发的内容展现了你的底蕴。这些优质内容&#xff0c;你值得拥有&#xff0c;看下去你就知道。【关注方式&#xff1a;长按二维码&#xff0c;选择“识别图中二维…

grub参数介绍。

为什么80%的码农都做不了架构师&#xff1f;>>> grub的配置文件在/boot/grub/grub.conf。/etc/grub.conf和/boot/grub/menu.lst都是指向这个文件的软连接。 grub启动时&#xff0c;会寻找menu.lst文件&#xff0c;如果找不到&#xff0c;则进入grub>交互界面。…

又一次Task.Wait引起的教训

最近一用户在使用BeetleX.HttpClient组件并发访问延时比较高的https服务时引起了卡死现像。由于组件更多使用场景是内部服务和非https&#xff0c;一直没有这情况出现;但用户提供测试场景下这情况必现&#xff0c;所以翻查了一些相关代码。protected virtual void OnSslAuthent…