数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...
近期剛做的一個項目。關于 Socket TCP 通信。
需求方提供了一個 ARM 機器,及數據採集器,須要我做一個服務端與數據採集器進行交互。
目的:
數據採集器:定時將讀取到的數據發送到服務端。
服務端:將數據採集器發送過來的數據保存在本地。
要求:
1、通信以 TCP 方式進行交互,port可配置。
2、自己實現握手、心跳包機制。
3、TCP 包結構包含:包頭、有效數據總長度、有效數據、CRC 校驗、包尾,當中有效數據包含指令序號和指令內容,為經過 AES 128位加密的 XML 數據。
4、加密算法:AES 128位。加密模式:CBC。填充模式:NoPadding。
5、握手過程:(下面過程均以 TCP 包結構加密形式傳輸,并僅僅提主要內容數據。省略 CRC 校驗說明)
(1)數據採集器發送請求包到服務端,服務端解析包結構后取出數據段進行 AES 解密。
(2)服務端推斷該包為請求包后回復一個包括一個隨機序列的包到數據採集器。
(3)數據採集器接收到包后將隨機序列與 MD5 密鑰組合后進行 MD5 加密。并回發給服務端。
(4)服務端接收到加密后的內容,并與本地加密后的內容進行比較,通過則回復 pass,否則回復 fail。
(5)數據採集器收到 pass 則握手成功并建立連接,否則握手失敗并斷開連接。
6、心跳包:握手建立后。採集器每隔一定時間會往服務端發送一個心跳包。服務端收到心跳包后應馬上應答。回復server當前時間信息供採集器校時。
7、數據包:採集器在握手建立后。會定時向服務端發送斷點數據包和實時數據包,服務端接收到以后將數據保存在本地 PC 并回復 pass。
1、創建服務端Socket
(C#)
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 36829); //本機預使用的IP和portSocket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);newsock.Bind(ipep); //綁定newsock.Listen(10); //監聽(Node.js)
var server = net.createServer(function(socket) { //'connection' listenerconsole.log('client connected'); }); server.listen(36829, function() { //'listening' listenerconsole.log('server bound'); });2、創建client對象并監聽
(C#)
(Node.js) var server = net.createServer(function(socket) { //'connection' listenerconsole.log('client connected');socket.on('end', function() {console.log('client disconnected');});socket.on('data', function(data){console.log(data.length);console.log(data);}); }); server.listen(36829, function() { //'listening' listenerconsole.log('server bound'); });
由于其它內容涉及到保密性,所以以下僅僅貼一下 AES 加解密過程
// AES 解密 public static string AESDecrypt(byte[] data) {SymmetricAlgorithm aes = Rijndael.Create();aes.Key = keyArray; // 密鑰aes.IV = keyArray; // 向量aes.Mode = CipherMode.CBC;aes.Padding = PaddingMode.None;byte[] decryptBytes = new byte[data.Length];using (MemoryStream ms = new MemoryStream(data)){using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read)){cs.Read(decryptBytes, 0, decryptBytes.Length);cs.Close();ms.Close();}}aes.Clear();return System.Text.Encoding.Default.GetString(decryptBytes).Replace("\0", " "); }// AES 加密 public static byte[] AESEncrypt(byte[] data) {SymmetricAlgorithm aes = Rijndael.Create();aes.Key = keyArray;aes.IV = keyArray;aes.Mode = CipherMode.CBC;aes.Padding = PaddingMode.None;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)){cs.Write(data, 0, data.Length);cs.FlushFinalBlock();byte[] cipherBytes = ms.ToArray(); // 得到加密后的字節數組cs.Close();ms.Close();aes.Clear();return cipherBytes;}} }
總結
以上是生活随笔為你收集整理的数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 3 递归调用与二分法
- 下一篇: java自学之路-day17