C#實現TCP通訊協議


本人小白一個,初次使用C#,希望各位大神對小白不足之處能指點一下,O(∩_∩)O謝謝

項目需求:公司錫膏室有四台冰箱,需要對該四台冰箱的溫濕度實時采集同時以曲線圖方式Show到一塊看板上

思路:1,需要將設備發送的數據實時存儲至數據庫(使用TCP通訊協議實時抓取數據)

         2,將數據以曲線圖方式Show至看板上(需要使用到AJAX以及強大的JS庫【ECharts】})

一,實現數據抓取並存儲至數據庫

代碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Data.SqlClient;
  6 using System.Drawing;
  7 using System.IO;
  8 
  9 using System.Net;
 10 using System.Net.Sockets;
 11 using System.Text;
 12 using System.Threading;
 13 
 14 using System.Windows.Forms;
 15 
 16 namespace WindowsFormsApplication1
 17 {
 18     public partial class Form1 : Form
 19     {
 20         public Form1()
 21         {
 22             InitializeComponent();
 23             TextBox.CheckForIllegalCrossThreadCalls = false;
 24         }
 25         Thread threadWatch = null; // 負責監聽客戶端連接請求的 線程;
 26         Socket socketWatch = null;
 27 
 28         Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
 29         Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();
 30 
 31         /// <summary>
 32         /// 啟動監控服務
 33         /// </summary>
 34         /// <param name="sender"></param>
 35         /// <param name="e"></param>
 36         private void button1_Click(object sender, EventArgs e)
 37         {
 38             // 創建負責監聽的套接字,注意其中的參數;
 39             socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 40             // 獲得文本框中的IP對象;
 41             IPAddress address = IPAddress.Parse(textBox1.Text.Trim());
 42             // 創建包含ip和端口號的網絡節點對象;
 43             IPEndPoint endPoint = new IPEndPoint(address, int.Parse(textBox2.Text.Trim()));
 44             try
 45             {
 46                 // 將負責監聽的套接字綁定到唯一的ip和端口上;
 47                 socketWatch.Bind(endPoint);
 48             }
 49             catch (SocketException se)
 50             {
 51                 MessageBox.Show("異常:" + se.Message);
 52                 return;
 53             }
 54             // 設置監聽隊列的長度;
 55             socketWatch.Listen(10);
 56             // 創建負責監聽的線程;
 57             threadWatch = new Thread(WatchConnecting);
 58             threadWatch.IsBackground = true;
 59             threadWatch.Start();
 60             ShowMsg("服務器啟動監聽成功!");
 61         }
 62 
 63         /// <summary>
 64         /// 監聽客戶端請求的方法;
 65         /// </summary>
 66         void WatchConnecting()
 67         {
 68             while (true)  // 持續不斷的監聽客戶端的連接請求;
 69             {
 70                 // 開始監聽客戶端連接請求,Accept方法會阻斷當前的線程;
 71                 Socket sokConnection = socketWatch.Accept(); // 一旦監聽到一個客戶端的請求,就返回一個與該客戶端通信的 套接字;
 72                 // 想列表控件中添加客戶端的IP信息;
 73                 listBox1.Items.Add(sokConnection.RemoteEndPoint.ToString());
 74                 // 將與客戶端連接的 套接字 對象添加到集合中;
 75                 dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
 76                 ShowMsg("客戶端連接成功!");
 77                 Thread thr = new Thread(RecMsg);
 78                 thr.IsBackground = true;
 79                 thr.Start(sokConnection);
 80                 dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr);  //  將新建的線程 添加 到線程的集合中去。
 81             }
 82         }
 83 
 84 
 85         void RecMsg(object sokConnectionparn)
 86         {
 87             Socket sokClient = sokConnectionparn as Socket;
 88             while (true)
 89             {
 90                 // 定義一個2M的緩存區;
 91                 byte[] arrMsgRec = new byte[1024 * 1024 * 2];
 92                 // 將接受到的數據存入到輸入  arrMsgRec中;
 93                 int length = -1;
 94                 try
 95                 {
 96                     length = sokClient.Receive(arrMsgRec); // 接收數據,並返回數據的長度;
 97                 }
 98                 catch (SocketException se)
 99                 {
100                     ShowMsg("異常:" + se.Message);
101                     // 從 通信套接字 集合中刪除被中斷連接的通信套接字;
102                     dict.Remove(sokClient.RemoteEndPoint.ToString());
103                     // 從通信線程集合中刪除被中斷連接的通信線程對象;
104                     dictThread.Remove(sokClient.RemoteEndPoint.ToString());
105                     // 從列表中移除被中斷的連接IP
106                     listBox1.Items.Remove(sokClient.RemoteEndPoint.ToString());
107                     break;
108                 }
109                 catch (Exception e)
110                 {
111                     ShowMsg("異常:" + e.Message);
112                     // 從 通信套接字 集合中刪除被中斷連接的通信套接字;
113                     dict.Remove(sokClient.RemoteEndPoint.ToString());
114                     // 從通信線程集合中刪除被中斷連接的通信線程對象;
115                     dictThread.Remove(sokClient.RemoteEndPoint.ToString());
116                     // 從列表中移除被中斷的連接IP
117                     listBox1.Items.Remove(sokClient.RemoteEndPoint.ToString());
118                     break;
119                 }
120                 
121                 ///--------------------------------------接收客戶端發送過來的信息----------------------------------------------
122                     string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1);// 將接受到的字節數據轉化成字符串;
123                     ShowMsg(strMsg);
124 
125 
126                     ///------------------------------------向客戶端發送回執信息--------------------------------------
127                     string WD = strMsg.Substring(42, 4);
128                     string SD = strMsg.Substring(47, 4);
129                     string Mdl = strMsg.Substring(21, 10);
130                     string ZOOM = strMsg.Substring(32, 1);
131                     string SendTime = "20" + strMsg.Substring(3, 17) + ":000";
132                     if (Mdl == "0072916200") { Mdl = "冰箱-01"; }
133                     else if (Mdl == "0072915200") { Mdl = "冰箱-03"; }
134                     else if (Mdl == "0072914500") { Mdl = "冰箱-04"; }
135                     else if (Mdl == "0072912300") { Mdl = "冰箱-02"; }
136                     SqlConnection sqlcon = new SqlConnection("Data Source=10.99.106.***;Initial Catalog=PCA_REPORT;User ID=***;pwd=***");
137                     string addx = "INSERT INTO PCA_REPORT..Temperature VALUES ('" + Mdl + "','" + WD + "','" + SD + "','" + SendTime + "',getdate(),'" + ZOOM + "')";
138                     DataSet ds = new DataSet();
139                     SqlDataAdapter adapter = new SqlDataAdapter(addx, sqlcon);
140                     adapter.Fill(ds);
141                    
142                     string send = "*RR," + strMsg.Substring(3, 17) + "," + strMsg.Substring(21, 10) + "#";
143                    
144 
145 
146                     byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(send); // 將要發送的字符串轉換成Utf-8字節數組;
147                     byte[] arrSendMsg = new byte[arrMsg.Length + 1];
148                     arrSendMsg[0] = 0; // 表示發送的是消息數據
149                     Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length);    
150                     for (int i = 0; i < listBox1.Items.Count; i++)
151                     {
152                         string strKey = listBox1.Items[i].ToString();
153                        
154                             dict[strKey].Send(arrSendMsg);// 解決了 sokConnection是局部變量,不能再本函數中引用的問題;
155                             //ShowMsg(send);
156 
157                       
158                     }
159                   
160             }
161         }
162 
163 
164 
165         void ShowMsg(string str)
166         {
167             textBox5.AppendText(str + "\r\n");
168         }
169 
170         private void label2_Click(object sender, EventArgs e)
171         {
172 
173         }
174        
175     }
176 }

1,將設備與該程式設置為同一網段IP

2,將設備IP指向與當前程式運行的IP(以上程式表明設備指向的IP是:192.168.1.130,指向端口是:9438)

設置以上后,程式就可以接受設備傳輸的數據了

運行之后如下圖:

 

二,實現將數據以曲線圖方式實時Show至看板上

可跳轉至:https://download.csdn.net/download/bibabu135766/10274321

看板效果如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM