日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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));}} }

運行結果:

以上代碼完全純手工打造,如果有疑問歡迎留言,喜歡的小伙伴們可以多多分享,讓更多志同道合的伙伴們加入我們的微信交流群一起學習、進步!

總結

以上是生活随笔為你收集整理的C sharp实例:华盾武器门数据接收和解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。