近期刚做的一个项目。关于 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和port

Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

newsock.Bind(ipep); //绑定

newsock.Listen(10); //监听

(Node.js)

var server = net.createServer(function(socket) { //'connection' listener
console.log('client connected');
});
server.listen(36829, function() { //'listening' listener
console.log('server bound');
});

2、创建client对象并监听

(C#)

Console.WriteLine("waiting for a client");
Socket client = newsock.Accept(); //当有可用的客户端连接尝试时运行,并返回一个新的socket,用于与客户端之间的通信
IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("connect with client: " + clientip.Address + " at port: " + clientip.Port);
while (true)
{
    byte[] buffer = new byte[1024]; //用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组
    int packageLength = client.Receive(buffer); //用于表示客户端发送的信息长度
    if (packageLength == 0)
{
Console.WriteLine("解除循环监听,Disconnected from " + clientip.Address);
break; //当信息长度为0。说明客户端连接断开
}
}

(Node.js)

var server = net.createServer(function(socket) { //'connection' listener
console.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' listener
console.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加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)的更多相关文章

  1. 金蝶盘点机条码数据採集器PDA,WIFI已经连接,可是PDA应用程序还是网络初始化不成功?

    PDA任务栏里显示了小电脑.小电脑也是绿色的,为什么PDA还是网络初始化不成功呢? 1.须要检查下server的[PDA后台服务程序]是否打开?假设没有打开请打开[PDA后台服务程序]. 2.须要检查 ...

  2. 数据採集之Web端上传文件到Hadoop HDFS

    前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...

  3. yispider 开源小说採集器 (来源http://git.oschina.net/yispider/yispider 我的改动版由于他的我无法跑)

    我的git地址  http://git.oschina.net/yangdc/yispider 小说採集器 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/ ...

  4. 《转》ceilometer的数据採集机制入门

    问题导读 1.ceilometer负责什么事情? 2.ceilometer 有哪些概念? 3.ceilometer 怎样採集hardware? 附上openstack 官网API   http://d ...

  5. Matlab---串口操作---数据採集篇

    matlab功能强大,串口操作也非常easy.相信看过下面两个实验你就能掌握咯! 開始吧! 实验1: 从电脑COM2口读取数据.并将数据保存在TXT文件里,方便数据分析,以下是M脚本: %名 称:Ma ...

  6. 用WidgeDuino创建一个SCADA(监控与数据採集)系统

    WidgeDuino – 近期在Kickstarter上亮相 – 是一个智能的易配置的窗体- 基于Microsoft Windows平台和基于像 Atmel-based Arduino board 的 ...

  7. 用DirectShow实现视频採集-流程构建

    DirectShow作为DirectX的一个子集,它为用户提供了强大.方便的多媒体开接口,而且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序.前面一篇文章已经对Dir ...

  8. Android摄像头採集的视频数据流怎样通过Socket实时发送到目标服务端

    分两块: 1.取得摄像头採集的视频流 2.发送到server端 protected MediaRecorder mMediaRecorder; private LocalServerSocket mL ...

  9. centos7 rsync+inotify软件实现集群服务的数据备份(一)

    一.rsync软件的说明: 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达 ...

随机推荐

  1. centos部署Django项目的前提工作

    从安装python到django项目的部署上线.是相当详细了,中间也没有出现什么幺蛾子.很赞!!! https://blog.csdn.net/u011798443/article/details/8 ...

  2. Centos安装Sun的JDK及测试

    查询系统默认的JDK Centos系统(我vm上安装的是Centos6.3)默认会安装OpenJDK,要想使用默认的JDK,也需要你自己配置环境变量. 首先,检查系统是否安装有JDK并且OpenJDK ...

  3. ARM开发板不工作的几个原因

    刚焊了5块ARM(LPC2478)的开发板,上程序测试了一下,发现只有一个板子工作其他四个全部歇菜.努力地找了一会最终发现是板子的来个电阻焊翻了.因为是1206 的封装而且来个电阻在PCB上摆放的位置 ...

  4. Python开发基础-Day5-字符编码、文件处理和函数基础(草稿)

    字符编码 为什么要有字符编码? 字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1". 一个文件用什么编码方式存储 ...

  5. ACM的奇计淫巧_bitset优化

    什么是bitset bitset 是STL库中的二进制容器,根据C++ reference 的说法,bitset可以看作bool数组,但优化了空间复杂度和时间复杂度,并且可以像整形一样按位与或. 使用 ...

  6. bzoj 2286(虚树+树形dp) 虚树模板

    树链求并又不会写,学了一发虚树,再也不虚啦~ 2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 5002  Sol ...

  7. 【树形dp】The more, The Better

    [HDU1561]The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  8. [CODE FESTIVAL 2016]Encyclopedia of Permutations

    题意:给定一个排列,其中有可能有一些未确定的数,求出所有可能的排列的排名之和 首先我们要知道怎么算一个给定排列的排名,设它为$p_{1\cdots n}$ 排名即为比它小的排列数$+1$,对于每一个比 ...

  9. 【线段树】hihocoder 1586 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I. Minimum

    题意:给你一个序列(长度不超过2^17),支持两种操作:单点修改:询问区间中最小的ai*aj是多少(i可以等于j). 只需要线段树维护区间最小值和最大值,如果最小值大于等于0,那答案就是minv*mi ...

  10. 【最大流/费用流】BZOJ1834-[ZJOI2010]network 网络扩容

    [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费 ...