TCP客户端
TCP客户端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; using System.IO; namespace TCPPhoto { public partial class CNET_L1 : Form { //创建 1个客户端套接字 和1个负责监听服务端请求的线程 Thread threadclient = null; Socket socketclient = null; List<IPEndPoint> mlist = new List<IPEndPoint>(); FileJPEG fj = new FileJPEG(); SplitPack sp = new SplitPack(); Pack IsPack = new Pack(); public CNET_L1() { Control.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); } //连接 private void Connect_Click(object sender, EventArgs e) { //SocketException exception; //this.tbx_Pic.Enabled = false; //定义一个套接字监听 socketclient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //获取文本框中的IP地址 IPAddress address = IPAddress.Parse(IPAdd.Text.Trim()); //将获取的IP地址和端口号绑定在网络节点上 IPEndPoint point = new IPEndPoint(address, int.Parse(tbxPort.Text.Trim())); try { //客户端套接字连接到网络节点上,用的是Connect socketclient.Connect(point); Messages(tbx_Show, GetCurrentTime() + "连接成功"); threadclient = new Thread(recv); threadclient.IsBackground = true; threadclient.Start(); } catch (Exception ) { Messages(tbx_Show, GetCurrentTime() + "连接失败"); return; } } // 接收服务端发来信息的方法 private void recv() { // f0:aa:aa:aa:aa:aa:aa:f1:0d:00:87:00:03:00:11:00:00:00:00:00:00:00:fe //int x = 0; while (true)//持续监听服务端发来的消息 { try { //定义一个1M的内存缓冲区,用于临时性存储接收到的消息 byte[] arrRecvmsg = new byte[1024 * 1024*2]; //将客户端套接字接收到的数据存入内存缓冲区,并获取长度 int bytesRead = socketclient.Receive(arrRecvmsg, arrRecvmsg.Length, 0); byte[] data = new byte[bytesRead]; for (int j = 0; j < bytesRead; j++) { data[j] = arrRecvmsg[j]; } //int length = socketclient.Receive(arrRecvmsg); if (bytesRead >= 0) { DefaultReceived(data); } //将套接字获取到的字符数组转换为人可以看懂的字符串 //string strRevMsg = BitConverter.ToString(data).Replace("-",""); //if (x == 1) //{ // DataMsg(tbx_Data, GetCurrentTime() + "服务器:" + " " + strRevMsg + "\r\n"); //} //else //{ // DataMsg(tbx_Data, GetCurrentTime() + "服务器:" +" "+ strRevMsg + "\r\n"); // x = 1; //} } catch (Exception) { Messages(tbx_Show, GetCurrentTime() + "远程服务器已经断开连接" + "\r\n"); break; } } } public void DefaultReceived(object s) { byte[] CompareByte = (byte[])s; string i = CompareByte[10].ToString("X"); //拍照命令F0AAAAAAAAAAAAF10D00870002001100000000000000FE if (CompareByte.Length == 23 && CompareByte[10].ToString("X") == "87" && CompareByte[11] == 0) { Messages(tbx_Show, GetCurrentTime() + "服务端发送拍照命令"); DataMsg(tbx_Data, GetCurrentTime() + "服务端发送拍照命令:" + " " + BitConverter.ToString(CompareByte) + "\r\n"); //确认帧 byte[] Confirm = BytesConvert.bytesConvert(StrToBytes.StringToBytes(OrderControl.OrderAddOne(CompareByte).ToString().Replace(" ", ""), 2)); byte[] DataBytes = new byte[] { 0xF0, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xF1, 0x09, 0x00, 0x41, 0x00, Confirm[0], Confirm[1], CompareByte[12], CompareByte[13], 0x00, 0x00, 0xFE }; socketclient.Send(DataBytes); Messages(tbx_Show, GetCurrentTime() + "服务端发送确认帧"); DataMsg(tbx_Data, GetCurrentTime() + "客户端发送确认帧:" + " " + BitConverter.ToString(DataBytes) + "\r\n"); } //读取集中器信息 else if (CompareByte.Length == 18 && CompareByte[10].ToString("X") == "82" && CompareByte[11] == 0 && CompareByte[14] == 0) { Messages(tbx_Show, GetCurrentTime() + "服务端读取集中器信息"); DataMsg(tbx_Data, GetCurrentTime() + "服务端读取集中器信息:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); int Order = OrderControl.OrderAddOne(CompareByte);//帧序号+1 byte[] DataBytes = IsPack.ReponseFocusPacks(1, cbx_FocusAddr.Text.ToString().Replace(" ", ""), GetCurrentTime(), Order); socketclient.Send(DataBytes);///F0AAAAAAAAAAAAF1080082001100010000FE Messages(tbx_Show, GetCurrentTime() + "客户端集中器信息"); DataMsg(tbx_Data, GetCurrentTime() + "客户端发送集中器信息:" + " " + BitConverter.ToString(DataBytes).Replace("-", "") + "\r\n"); } //读取照相机信息F0AAAAAAAAAAAAF1080082001B00010000FE else if (CompareByte.Length == 18 && CompareByte[10].ToString("X") == "82" && CompareByte[11] == 0 && CompareByte[14] == 1) { Messages(tbx_Show, GetCurrentTime() + "服务端读取照相机信息"); int Order = OrderControl.OrderAddOne(CompareByte);//帧序号+1 DataMsg(tbx_Data, GetCurrentTime() + "服务端读取照相机信息:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); byte[] SendDataBytes = IsPack.ReponsePhotoPacks(Convert.ToInt16(cbx_PNum.Text.ToString()), cbx_PAddr, Order); socketclient.Send(SendDataBytes);/// Messages(tbx_Show, GetCurrentTime() + "客户端应答照相机信息");//F0AAAAAAAAAAAA F111004300020001010B000000000003195E6AFE DataMsg(tbx_Data, GetCurrentTime() + "客户端应答照相机信息:" + " " + BitConverter.ToString(SendDataBytes).Replace("-", "") + "\r\n"); } //读取新照片信息 else if (CompareByte.Length == 23 && CompareByte[10].ToString("X") == "88" && CompareByte[11] == 0) { Messages(tbx_Show, GetCurrentTime() + "服务端开始读取新照片信息"); DataMsg(tbx_Data, GetCurrentTime() + "服务端读取新照片信息:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); //DataMsg(tbx_Data, "客户端" + ": " + GetCurrentTime() + " " + "发送命令" + "\r\n\n" + BitConverter.ToString(DataBytes) + "\r\n"); //发送有新照片信息 FileInfo fi = new FileInfo(Application.StartupPath + @"\20171227132710065_010000000000_11.jpeg"); //读取拍照时间 DateTime dt = fi.CreationTime; long logosize = fi.Length;//读取照片文件的大小 int Order = OrderControl.OrderAddOne(CompareByte);//帧序号+1 byte[] SendDataBytes = IsPack.ReponseNewPhotoPacks(cbx_PAddr, 1, 11, dt, logosize, Order); socketclient.Send(SendDataBytes); // byte[] picSend = fj.Read(Application.StartupPath + @"\20171227132710065_010000000000_11.jpeg");//读取照片的数据量大小 Messages(tbx_Show, GetCurrentTime() + "客户端发送响应有新照片信息"); DataMsg(tbx_Data, GetCurrentTime() + "客户端应答新照片信息:" + " " + BitConverter.ToString(SendDataBytes) + "\r\n"); } //服务端读整张照片的数据 else if (CompareByte.Length == 25 && CompareByte[10].ToString("X") == "8D" && CompareByte[11] == 0) { Messages(tbx_Show, GetCurrentTime() + "服务端读取整张照片数据"); DataMsg(tbx_Data, GetCurrentTime() + "服务端读取整张照片数据:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); byte[] picSend = fj.Read(Application.StartupPath + @"\20171227132710065_010000000000_11.jpeg"); string test = BitConverter.ToString(picSend).Replace("-",""); //Image picImage = fj.BytesToImage(picSend);//将照片数据转化为图片 //pic_Image.Image = picImage;//将照片放到PictureBox中 int Order = OrderControl.OrderAddOne(CompareByte);//帧序号+1 sp.Sends(socketclient, cbx_PAddr, tbx_Data, 4096, picSend, Order); Messages(tbx_Show, GetCurrentTime() + "客户端成功发送整张照片" + "\r\n"); DataMsg(tbx_Data, GetCurrentTime() + "服务端读取整张照片数据完成" + "\r\n"); } //服务端重传照片申请数据 else if (CompareByte.Length == 25 && CompareByte[10].ToString("X") == "8F" && CompareByte[11] == 0) { Messages(tbx_Show, GetCurrentTime() + "服务端申请重传照片"); DataMsg(tbx_Data, GetCurrentTime() + "服务端申请重传照片:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); byte[] picSend = fj.Read(Application.StartupPath + @"\20171227132710065_010000000000_11.jpeg"); //Image picImage = fj.BytesToImage(picSend);//将照片数据转化为图片 //pic_Image.Image = picImage;//将照片放到PictureBox中 int Order = OrderControl.OrderAddOne(CompareByte);//帧序号+1 sp.Sends(socketclient, cbx_PAddr, tbx_Data, 4096, picSend, Order); Messages(tbx_Show, GetCurrentTime() + "客户端成功发送整张照片" + "\r\n"); DataMsg(tbx_Data, GetCurrentTime() + "服务端读取整张照片数据完成" + "\r\n"); } //传输升级文件 else if (CompareByte[10].ToString("X") == "83" && CompareByte[11] == 0 && CompareByte[CompareByte.Length-1].ToString("X") == "FE") { Messages(tbx_Show, GetCurrentTime() + "服务端传输升级文件"); DataMsg(tbx_Data, GetCurrentTime() + "服务端传输升级文件:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); Messages(tbx_Show, GetCurrentTime() + "客户端成功发送整张照片" + "\r\n"); DataMsg(tbx_Data, GetCurrentTime() + "服务端读取整张照片数据完成" + "\r\n"); } //删除命令F0 AAAAAAAAAAAA F1 0F00 8A00 1000 110000000000 0B00 0000 FE else if (CompareByte.Length == 25 && CompareByte[10].ToString("X") == "8A" && CompareByte[11] == 0) { //F0-AA-AA-AA-AA-AA-AA-F1-09-00-41-00-01-00-00-00-00-00-FE Messages(tbx_Show, GetCurrentTime() + "服务端发送删除新照片"); DataMsg(tbx_Data, GetCurrentTime() + "服务端发送删除新照片:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); //确认帧 Thread.Sleep(2000); byte[] Confirm = BytesConvert.bytesConvert(StrToBytes.StringToBytes(OrderControl.OrderAddOne(CompareByte).ToString().Replace(" ", ""), 2)); byte[] DataBytes = new byte[] { 0xF0, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xF1, 0x09, 0x00, 0x41, 0x00, Confirm[0], Confirm[1], CompareByte[12], CompareByte[13], 0x00, 0x00, 0xFE }; socketclient.Send(DataBytes); Messages(tbx_Show, GetCurrentTime() + "客户端应答删除命令"); DataMsg(tbx_Data, GetCurrentTime() + "客户端发送确认帧:" + " " + BitConverter.ToString(DataBytes).Replace("-", "") + "\r\n"); } //读取一包照片数据 else if (CompareByte.Length == 31 && CompareByte[10].ToString("X") == "8B" && CompareByte[11] == 0) { Messages(tbx_Show, GetCurrentTime() + "服务端发送读取一包照片数据"); DataMsg(tbx_Data, GetCurrentTime() + "服务端发送读取一包照片数据:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); //byte[] picSend = fj.Read(Application.StartupPath + @"\20171227132710065_010000000000_11.jpeg"); ////Image picImage = fj.BytesToImage(picSend);//将照片数据转化为图片 ////pic_Image.Image = picImage;//将照片放到PictureBox中 //int Order = OrderControl.OrderAddOne(CompareByte);//帧序号+1 //sp.Sends(socketclient, cbx_PAddr, tbx_Data, 4096, picSend, Order); Messages(tbx_Show, GetCurrentTime() + "客户端传输一包照片数据"); //DataMsg(tbx_Data, GetCurrentTime() + "客户端传输一包照片数据:" + " " + BitConverter.ToString(DataBytes).Replace("-", "") + "\r\n"); } else { DataMsg(tbx_Data, GetCurrentTime() + "无效命令:" + " " + BitConverter.ToString(CompareByte).Replace("-", "") + "\r\n"); Messages(tbx_Show, GetCurrentTime() + "无效命令"); } } //获取当前系统时间 private DateTime GetCurrentTime() { DateTime currentTime = new DateTime(); currentTime = DateTime.Now; return currentTime; } //断开 private void DisConnect_Click(object sender, EventArgs e) { if (socketclient.Connected && socketclient != null) { socketclient.Shutdown(SocketShutdown.Both); socketclient.Close(); } } public delegate void MessageDelegate(TextBox txtbox, string Messages);//委托文本框 //文本框Invoke方法需要创建一个委托。你可以事先写好函数和与之对应的委托 private void Messages(TextBox txtbox, string message) { if (txtbox.InvokeRequired)//示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 { MessageDelegate showMessageDelegate = Messages; txtbox.Invoke(showMessageDelegate, new object[] { txtbox, message }); } else { tbx_Show.Text += message + "\r\n"; } } //文本框Invoke方法需要创建一个委托。你可以事先写好函数和与之对应的委托 private void DataMsg(TextBox txtbox, string message) { if (txtbox.InvokeRequired)//示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 { MessageDelegate showMessageDelegate = DataMsg; txtbox.Invoke(showMessageDelegate, new object[] { txtbox, message }); } else { tbx_Data.Text += message + "\r\n"; } } } } namespace TCPPhoto { partial class CNET_L1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.tbxPort = new System.Windows.Forms.TextBox(); this.IPAdd = new System.Windows.Forms.TextBox(); this.label225 = new System.Windows.Forms.Label(); this.label226 = new System.Windows.Forms.Label(); this.DisConnect = new System.Windows.Forms.Button(); this.Connect = new System.Windows.Forms.Button(); this.tbx_Show = new System.Windows.Forms.TextBox(); this.tbx_Data = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.cbx_PAddr = new System.Windows.Forms.ComboBox(); this.cbx_FocusAddr = new System.Windows.Forms.ComboBox(); this.label3 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.cbx_PNum = new System.Windows.Forms.ComboBox(); this.comboBox2 = new System.Windows.Forms.ComboBox(); this.SuspendLayout(); // // tbxPort // this.tbxPort.Location = new System.Drawing.Point(255, 17); this.tbxPort.Name = "tbxPort"; this.tbxPort.Size = new System.Drawing.Size(100, 21); this.tbxPort.TabIndex = 17; this.tbxPort.Text = "1235"; // // IPAdd // this.IPAdd.Location = new System.Drawing.Point(61, 17); this.IPAdd.Name = "IPAdd"; this.IPAdd.Size = new System.Drawing.Size(130, 21); this.IPAdd.TabIndex = 16; this.IPAdd.Text = "192.168.20.160"; // // label225 // this.label225.AutoSize = true; this.label225.Location = new System.Drawing.Point(208, 21); this.label225.Name = "label225"; this.label225.Size = new System.Drawing.Size(47, 12); this.label225.TabIndex = 15; this.label225.Text = "端口号:"; // // label226 // this.label226.AutoSize = true; this.label226.Location = new System.Drawing.Point(8, 21); this.label226.Name = "label226"; this.label226.Size = new System.Drawing.Size(47, 12); this.label226.TabIndex = 14; this.label226.Text = "IP地址:"; // // DisConnect // this.DisConnect.Location = new System.Drawing.Point(442, 16); this.DisConnect.Name = "DisConnect"; this.DisConnect.Size = new System.Drawing.Size(75, 23); this.DisConnect.TabIndex = 13; this.DisConnect.Text = "断开"; this.DisConnect.UseVisualStyleBackColor = true; this.DisConnect.Click += new System.EventHandler(this.DisConnect_Click); // // Connect // this.Connect.Location = new System.Drawing.Point(361, 16); this.Connect.Name = "Connect"; this.Connect.Size = new System.Drawing.Size(75, 23); this.Connect.TabIndex = 12; this.Connect.Text = "连接"; this.Connect.UseVisualStyleBackColor = true; this.Connect.Click += new System.EventHandler(this.Connect_Click); // // tbx_Show // this.tbx_Show.Location = new System.Drawing.Point(451, 57); this.tbx_Show.Multiline = true; this.tbx_Show.Name = "tbx_Show"; this.tbx_Show.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.tbx_Show.Size = new System.Drawing.Size(436, 351); this.tbx_Show.TabIndex = 19; // // tbx_Data // this.tbx_Data.Dock = System.Windows.Forms.DockStyle.Bottom; this.tbx_Data.Location = new System.Drawing.Point(0, 414); this.tbx_Data.Multiline = true; this.tbx_Data.Name = "tbx_Data"; this.tbx_Data.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.tbx_Data.Size = new System.Drawing.Size(887, 114); this.tbx_Data.TabIndex = 24; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(8, 58); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(65, 12); this.label1.TabIndex = 26; this.label1.Text = "摄像头地址"; // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(8, 138); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(65, 12); this.label2.TabIndex = 28; this.label2.Text = "集中器地址"; // // cbx_PAddr // this.cbx_PAddr.FormattingEnabled = true; this.cbx_PAddr.Items.AddRange(new object[] { "130000000000"}); this.cbx_PAddr.Location = new System.Drawing.Point(77, 56); this.cbx_PAddr.Name = "cbx_PAddr"; this.cbx_PAddr.Size = new System.Drawing.Size(103, 20); this.cbx_PAddr.TabIndex = 29; this.cbx_PAddr.Text = "130000000000"; // // cbx_FocusAddr // this.cbx_FocusAddr.FormattingEnabled = true; this.cbx_FocusAddr.Items.AddRange(new object[] { "010203040506"}); this.cbx_FocusAddr.Location = new System.Drawing.Point(77, 137); this.cbx_FocusAddr.Name = "cbx_FocusAddr"; this.cbx_FocusAddr.Size = new System.Drawing.Size(103, 20); this.cbx_FocusAddr.TabIndex = 30; this.cbx_FocusAddr.Text = "010203040506"; // // label3 // this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(8, 98); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(65, 12); this.label3.TabIndex = 31; this.label3.Text = "摄像头个数"; // // label4 // this.label4.AutoSize = true; this.label4.Location = new System.Drawing.Point(8, 178); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(65, 12); this.label4.TabIndex = 33; this.label4.Text = "集中器个数"; this.label4.Visible = false; // // cbx_PNum // this.cbx_PNum.FormattingEnabled = true; this.cbx_PNum.Items.AddRange(new object[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "1", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30"}); this.cbx_PNum.Location = new System.Drawing.Point(77, 95); this.cbx_PNum.Name = "cbx_PNum"; this.cbx_PNum.Size = new System.Drawing.Size(103, 20); this.cbx_PNum.TabIndex = 34; this.cbx_PNum.Text = "1"; // // comboBox2 // this.comboBox2.FormattingEnabled = true; this.comboBox2.Items.AddRange(new object[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "1", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34"}); this.comboBox2.Location = new System.Drawing.Point(77, 175); this.comboBox2.Name = "comboBox2"; this.comboBox2.Size = new System.Drawing.Size(103, 20); this.comboBox2.TabIndex = 35; this.comboBox2.Text = "1"; this.comboBox2.Visible = false; // // CNET_L1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(887, 528); this.Controls.Add(this.comboBox2); this.Controls.Add(this.cbx_PNum); this.Controls.Add(this.label4); this.Controls.Add(this.label3); this.Controls.Add(this.cbx_FocusAddr); this.Controls.Add(this.cbx_PAddr); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.tbx_Data); this.Controls.Add(this.tbx_Show); this.Controls.Add(this.tbxPort); this.Controls.Add(this.IPAdd); this.Controls.Add(this.label225); this.Controls.Add(this.label226); this.Controls.Add(this.DisConnect); this.Controls.Add(this.Connect); this.Name = "CNET_L1"; this.Text = "CNET--L1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox tbxPort; private System.Windows.Forms.TextBox IPAdd; private System.Windows.Forms.Label label225; private System.Windows.Forms.Label label226; private System.Windows.Forms.Button DisConnect; private System.Windows.Forms.Button Connect; private System.Windows.Forms.TextBox tbx_Show; private System.Windows.Forms.TextBox tbx_Data; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.ComboBox cbx_PAddr; private System.Windows.Forms.ComboBox cbx_FocusAddr; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.ComboBox cbx_PNum; private System.Windows.Forms.ComboBox comboBox2; } } 其他的类文件: Pack。cs using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Windows.Forms; namespace TCPPhoto { public class Pack { /// <summary> /// /// 打包 /// </summary> /// <param name="message">图片信息</param> /// <param name="cbx">照相机地址</param> /// <param name="count">照片总包数</param> /// <param name="i">当前数据包序号</param> /// <param name="datalength">当前数据包长度</param> /// <returns></returns> public byte[] PhotoDataPacks(byte[] message,ComboBox cbx,int count,int i,int datalength,int order) { List<byte> data = new List<byte>(); data.Add(0xf0); data.AddRange(new byte[]{0xAA,0xAA,0xAA,0xAA,0xAA,0xAA});//010000000000//集中器的地址 data.Add(0xf1);//起始标识 data.AddRange(new byte[] { 0x00, 0x00 });//帧长度【后面再修改为正确的长度】 data.AddRange(new byte[] { 0x4E,0x00});//控制字 //byte[] serial = BitConverter.GetBytes(message.Serial); data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(order.ToString().Replace(" ", ""), 2)));//帧序号 //读取整张照片数据 data.AddRange(BytesConvert.bytesConvert(StrToBytes.StrConvertToBytes(cbx.Text.ToString())));//照相机地址 data.AddRange(new byte[]{0x0B,0x00});//照片序号 data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(count.ToString(),2)));//照片总包数 data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(i.ToString(), 2)));//当前数据包序号 data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(datalength.ToString(), 2)));//当前数据包长度 data.AddRange(message); byte[] length = BitConverter.GetBytes(data.Count - 10 + 3);//长度【从控制字到结束标志】 data[8] = length[0]; data[9] = length[1]; byte[] temp = new byte[data.Count]; data.CopyTo(temp);//将整个 List <T > 复制到兼容的一维数组中,从目标数组的开头开始放置。 byte[] crc = Common.CRCVerify(temp, 0, temp.Length); data.AddRange(crc);//CRC校验【从0xF0到数据位】 data.Add(0xFE); byte[] result = new byte[data.Count]; data.CopyTo(result); return result; } /// <summary> /// 应答集中器信息 /// </summary> /// <param name="count">照相机个数</param> /// <param name="str">集中器地址</param> /// <param name="datetime">集中器时间</param> /// <returns></returns> public byte[] ReponseFocusPacks(int count,string str,DateTime datetime,int order) { List<byte> data = new List<byte>(); data.Add(0xf0); data.AddRange(new byte[] { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA });//010000000000//集中器的地址 data.Add(0xf1);//起始标识 data.AddRange(new byte[] { 0x00, 0x00 });//帧长度【后面再修改为正确的长度】 data.AddRange(new byte[] { 0x43, 0x00 });//控制字 //byte[] serial = BitConverter.GetBytes(message.Serial); data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(order.ToString().Replace(" ", ""), 2)));//帧序号 //读取集中器信息 data.AddRange(new byte[] {0x00});//集中器信息 data.AddRange(StrToBytes.StrAddToBytes(str));//本机地址 data.AddRange(new byte[] { 0x01,0x00 });//集中器状态 data.AddRange(new byte[] { 0x00 });//频道 data.AddRange(DateTimeStrBytes.DateStrBytes(datetime));//集中器日期 data.AddRange(new byte[] { 0x19 });//集中器温度 data.AddRange(new byte[] { 0x01 });//管辖照相机总数 data.AddRange(new byte[] { 0x01 });//在网照相机总数 data.AddRange(new byte[] { 0x00,0x00 });//管辖电子价签总数 data.AddRange(new byte[] { 0x00,0x00 });//在网电子价签总数 byte[] length = BitConverter.GetBytes(data.Count - 10 + 3);//长度【从控制字到结束标志】 data[8] = length[0]; data[9] = length[1]; byte[] temp = new byte[data.Count]; data.CopyTo(temp);//将整个 List <T > 复制到兼容的一维数组中,从目标数组的开头开始放置。 byte[] crc = Common.CRCVerify(temp, 0, temp.Length); data.AddRange(crc);//CRC校验【从0xF0到数据位】 data.Add(0xFE); byte[] result = new byte[data.Count]; data.CopyTo(result); return result; } /// <summary> /// 应答照相机信息 /// </summary> /// <param name="count">照相机个数</param> /// <param name="str">照相机地址</param> /// <param name="datetime">帧序号+1操作</param> /// <returns></returns> public byte[] ReponsePhotoPacks(int count,ComboBox cbx,int order) { //F0 AAAAAAAAAAAA F1 1100 4300 0200 01 01 0B0000000000 03 19 5E6A FE List<byte> data = new List<byte>(); data.Add(0xf0); data.AddRange(new byte[] { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA });//010000000000//集中器的地址 data.Add(0xf1);//起始标识 data.AddRange(new byte[] { 0x00, 0x00 });//帧长度【后面再修改为正确的长度】 data.AddRange(new byte[] { 0x43, 0x00 });//控制字 //byte[] serial = BitConverter.GetBytes(message.Serial); data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(order.ToString().Replace(" ", ""), 2)));//帧序号 //读取照相机信息 data.AddRange(new byte[] { 0x01 });//信息类型 data.AddRange(StrToBytes.StringToBytes(count.ToString().Replace(" ", ""), 1));//照相机总个数 for (int i = 0; i < count-1; i++) { data.AddRange(BytesConvert.bytesConvert(StrToBytes.StrConvertToBytes(cbx.Items[i].ToString())));//照相机地址 data.AddRange(new byte[] { 0x03 });//照相机状态二进制11 data.AddRange(new byte[] { 0x96 });//照相机电池电压 } byte[] length = BitConverter.GetBytes(data.Count - 10 + 3);//长度【从控制字到结束标志】 data[8] = length[0]; data[9] = length[1]; byte[] temp = new byte[data.Count]; data.CopyTo(temp);//将整个 List <T > 复制到兼容的一维数组中,从目标数组的开头开始放置。 //byte[] crc = Common.CRCVerify(temp, 0, temp.Length); //data.AddRange(crc);//CRC校验【从0xF0到数据位】 data.AddRange(new byte[] { 0x00,0x00 }); data.Add(0xFE); byte[] result = new byte[data.Count]; data.CopyTo(result); return result; } /// <summary> /// 应答新图片信息 /// </summary> /// <param name="cbx">照相机地址</param> /// <param name="count">照片数量</param> /// <param name="orders">序号</param> /// <param name="datetime">时间</param> /// <param name="datasize">数据量大小</param> /// <returns></returns> public byte[] ReponseNewPhotoPacks(ComboBox cbx, int count, int orders, DateTime datetime, long datasize, int order) { List<byte> data = new List<byte>(); data.Add(0xf0); data.AddRange(new byte[] { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA });//010000000000//集中器的地址 data.Add(0xf1);//起始标识 data.AddRange(new byte[] { 0x00, 0x00 });//帧长度【后面再修改为正确的长度】 data.AddRange(new byte[] { 0x49, 0x00 });//控制字 //byte[] serial = BitConverter.GetBytes(message.Serial); data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(order.ToString().Replace(" ", ""), 2)));//帧序号 //读取整张照片信息 data.AddRange(BytesConvert.bytesConvert(StrToBytes.StrConvertToBytes(cbx.Text.ToString())));//照相机地址 data.AddRange(StrToBytes.StringToBytes(count.ToString().Replace(" ", ""), 1));//照片数量 if (count == 1) { data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(orders.ToString().Replace(" ", ""), 2)));//照片序号 byte[] date = DateTimeStrBytes.DateStrBytes(datetime); data.AddRange(date); data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(datasize.ToString().Replace(" ", ""), 4)));//照片数据量大小 } else { data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(orders.ToString().Replace(" ", ""), 2)));//照片序号 byte[] date = DateTimeStrBytes.DateStrBytes(datetime); data.AddRange(date);//日期 data.AddRange(BytesConvert.bytesConvert(StrToBytes.StringToBytes(datasize.ToString().Replace(" ", ""), 4)));//照片数据量大小 } byte[] length = BitConverter.GetBytes(data.Count - 10 + 3);//长度【从控制字到结束标志】 data[8] = length[0]; data[9] = length[1]; byte[] temp = new byte[data.Count]; data.CopyTo(temp);//将整个 List <T > 复制到兼容的一维数组中,从目标数组的开头开始放置。 byte[] crc = Common.CRCVerify(temp, 0, temp.Length); data.AddRange(crc);//CRC校验【从0xF0到数据位】 data.Add(0xFE); byte[] result = new byte[data.Count]; data.CopyTo(result); return result; } /// <summary> /// 控制字+是否应答+上下行 /// </summary> /// <param name="isAnswer"></param> /// <param name="isUp"></param> /// <param name="command"></param> /// <returns></returns> static byte GetCommand(bool isAnswer, bool isUp, EnumCommand command) { byte result; BitArray bitCommand = new BitArray(new byte[] { (byte)command }); bitCommand[7] = isAnswer; bitCommand[6] = isUp; byte[] arrResult = new byte[1]; bitCommand.CopyTo(arrResult, 0); result = arrResult[0]; return result; } } } SplitPack.cs分包 using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Windows.Forms; namespace TCPPhoto { //public delegate void MessageDelegate(TextBox txtbox, string Messages);//委托文本框 class SplitPack { // public event MessageDelegate messageDelegate; Pack IsPack = new Pack(); //private void Messages(TextBox txtbox, string message) //{ // if (txtbox.InvokeRequired)//示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 // { // MessageDelegate showMessageDelegate = Messages; // txtbox.Invoke(showMessageDelegate, new object[] { txtbox, message }); // } // else // { // txtbox.Text += message + "\r\n"; // } //} /// <summary> /// 切割发包 /// </summary> /// <param name="svr">Socket</param> /// <param name="a">照相机地址</param> /// <param name="size">按1024切割</param> /// <param name="bytes">传入的照片数据byte</param> public void Sends(Socket svr, ComboBox cbx_Paddr,TextBox tbx_Data,int size, byte[] bytes,int order) { int len = bytes.Length;//779433 int count = len / size;//761 if (count < 490) { byte[] newByte = new byte[size]; int j = 0; if (count > 0) { if (len % size != 0)//169 { j++; } count = count + j; int endsize = 0;//最后一个包 不一定是完整的1024 需要判断是否是最后一个包。 for (int i = 0; i < count; i++) { if ((count - 1) == i) { endsize = len - (i * size); newByte = new byte[endsize]; } Array.Copy(bytes, i * size, newByte, 0, (count - 1) == i ? endsize : size); byte[] DataBytes = IsPack.PhotoDataPacks(newByte, cbx_Paddr, count - j, i, newByte.Length, order); svr.Send(DataBytes); string str= BitConverter.ToString(DataBytes).Replace("-", ""); int a=str.Length; //Messages(tbx_Data, DateTime.Now + "服务端读取整张照片数据:" + " " + BitConverter.ToString(DataBytes).Replace("-", "") + "\r\n"); } } else { svr.Send(bytes); } } } } } fileJpeg。cs 文件转换 using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Drawing; namespace TCPPhoto { public class FileJPEG { public byte[] Read(string sourcePath) { FileInfo fi = new FileInfo(sourcePath); int fileLength = Convert.ToInt32(fi.Length); FileStream fs = new FileStream(sourcePath, FileMode.Open); BinaryReader br = new BinaryReader(fs, System.Text.Encoding.ASCII); byte[] btReads = br.ReadBytes(fileLength); br.Close(); fs.Close(); return btReads; } /// <summary> /// Convert Byte[] to Image /// </summary> /// <param name="buffer"></param> /// <returns></returns> public Image BytesToImage(byte[] buffer) { MemoryStream ms = new MemoryStream(buffer); Image image = System.Drawing.Image.FromStream(ms); return image; } } } using System; using System.Collections.Generic; using System.Text; namespace TCPPhoto { public class BytesConvert { /// <summary> /// 字节数组逆转 /// </summary> /// <param name="s"></param> /// <returns></returns> public static byte[] bytesConvert(byte[] s) { byte[] byteNew = new byte[s.Length]; for (int i = s.Length - 1; i >= 0; i--) { byteNew[s.Length - i - 1] = s[i]; } //byte[] temp = new byte[2]; //temp[0] = s[1]; //temp[1] = s[0]; return byteNew; } } } using System; using System.Collections.Generic; using System.Text; namespace TCPPhoto { public class Common { #region"CRC校验" /// <summary> /// CRC校验 /// </summary> /// <param name="ptr">校验的BYTE数组</param> /// <param name="beginIndex">校验的起始下标</param> /// <param name="lenth">校验的长度</param> /// <returns></returns> public static byte[] CRCVerify(byte[] ptr, int beginIndex, int lenth) { UInt16 crc; byte da; int endIndex = beginIndex + lenth; // int i = 0; // len = ptr.Length; #region"CRC余式表" UInt16[] crc_ta = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; #endregion; crc = 0;//初始化CRC的值 for (int i = beginIndex; i < endIndex; i++) { da = Convert.ToByte(crc / 256);//获取底8位 crc <<= 8;//获取高8位 crc ^= crc_ta[da ^ ptr[i]];//查询CRC样式表进行异或操作 } byte[] CRC; CRC = BitConverter.GetBytes(crc);//获取所需要的byte数组,使得一个16位的字符变成两个8位的byte数组,高字节在前、低字节在后 return (CRC); } #endregion /// <summary> /// BCD码【字符串->字节】 /// </summary> /// <param name="id"></param> /// <returns></returns> public static byte[] getByteID(string id) { byte[] data = new byte[6]; string substr = ""; for (int i = 0; i < id.Length / 2; i++) { substr = id.Substring(i * 2, 2); data[5 - i] = Convert.ToByte(substr, 16); } return data; } /// <summary> /// BCD码【字节->字符串】 /// </summary> /// <param name="id"></param> /// <returns></returns> public static string getStrID(byte[] id) { string result = ""; for (int i = 0; i < id.Length; i++) { result = result + Convert.ToString(id[5 - i], 16).PadLeft(2, '0'); } return result; } /// <summary> /// 时间【0x17 0x10 0x21 0x05 0x06 0x15】 /// </summary> /// <param name="time"></param> /// <returns></returns> public static byte[] getByteDateTime(string time) { string[] temp = time.Substring(2).Split(new char[] { '/', ' ', ':' }); byte[] data = new byte[temp.Length]; for (int i = 0; i < temp.Length; i++) { data[i] = Convert.ToByte(temp[i]); } return data; } /// <summary> /// 时间【2017/10/21 5:06:15】 /// </summary> /// <param name="time"></param> /// <returns></returns> public static string getStrDateTime(byte[] time) { string result = ""; string[] temp = new string[time.Length]; for (int i = 0; i < time.Length; i++) { temp[i] = Convert.ToString(time[i]).PadLeft(2, '0'); } result = "20" + temp[0] + "/" + temp[1] + "/" + temp[2] + " " + temp[3] + ":" + temp[4] + ":" + temp[5]; return result; } /// <summary> /// 时间【20:01:02】 /// </summary> /// <param name="time"></param> /// <returns></returns> public static byte[] getByteTime(string time) { string[] temp = time.Split(new char[] { ':' }); byte[] data = new byte[temp.Length]; for (int i = 0; i < temp.Length; i++) { data[i] = Convert.ToByte(temp[i]); } return data; } /// <summary> /// 作为文件名称的时间【文件名不能包含字符 \/:*?"<>】 /// </summary> /// <param name="time"></param> /// <returns></returns> public static string getPhotoNameTime(string time) { string result = ""; string[] temp = time.Split('/', ':', ' '); result = temp[0] + temp[1].PadLeft(2, '0') + temp[2].PadLeft(2, '0') + " " + temp[3].PadLeft(2, '0') + temp[4].PadLeft(2, '0') + temp[5].PadLeft(2, '0'); return result; } } } using System; using System.Collections.Generic; using System.Text; namespace TCPPhoto { public class DateTimeStrBytes { /// <summary> /// 日期转换为6字节的字节数组 /// </summary> /// <param name="dt"></param> /// <returns></returns> public static byte[] DateStrBytes(DateTime dt) { byte[] bytes = new byte[6]; if (dt != null) { bytes[0] = Convert.ToByte(dt.Year.ToString().Substring(2, 2), 16); bytes[1] = Convert.ToByte(dt.Month.ToString(), 16); bytes[2] = Convert.ToByte(dt.Day.ToString(), 16); bytes[3] = Convert.ToByte(dt.Hour.ToString(), 16); bytes[4] = Convert.ToByte(dt.Minute.ToString(), 16); bytes[5] = Convert.ToByte(((int)dt.DayOfWeek).ToString(), 16); } return BytesConvert.bytesConvert(bytes); ; } } } using System; using System.Collections.Generic; using System.Text; namespace TCPPhoto { public class OrderControl { /// <summary> /// 帧序号+1 /// </summary> /// <param name="CompareByte">返回的帧号</param> /// <returns></returns> public static int OrderAddOne(byte[] CompareByte) { byte[] data = new byte[] { CompareByte[12], CompareByte[13] };//帧序号 byte[] ConvertOrder = BytesConvert.bytesConvert(data);// string cstr = BitConverter.ToString(ConvertOrder).Replace("-", ""); int Order = Convert.ToInt32(cstr, 16) + 1; return Order; } } } using System; using System.Collections.Generic; using System.Text; namespace TCPPhoto { public class StrToBytes { /// <summary> /// /// </summary> /// <param name="s"></param> /// <param name="pararm">要转换的长度</param> /// <returns></returns> public static byte[] StringToBytes(string s, int pararm) { string str = s; int Data = int.Parse(str); string data = string.Empty; if (pararm == 1) { string len = "1"; data = Data.ToString("X" + len); //byte[] bytes = strToToHexByte(str); while (data.Length < 2) { data = "0" + data; } if (data.Length > 4) { data = data.Substring(data.Length - 2, 2); } string[] str1 = new string[data.Length / 2]; byte[] bytes = new byte[data.Length / 2]; for (int i = 0; i < data.Length / 2; i++) { str1[i] = data.Substring(i * 2, 2); bytes[i] = Convert.ToByte(str1[i], 16); //string str2 = ("0x" + str1[i]); } return bytes; } else { string len = "4"; data = Data.ToString("X" + len); //byte[] bytes = strToToHexByte(str); if (data.Length == 5) { while (data.Length < 8) { data = "0" + data; } } else { while (data.Length < pararm * 2 - 1) { data = "00" + data; } } string[] str1 = new string[data.Length / 2]; byte[] bytes = new byte[data.Length / 2]; for (int i = 0; i < data.Length / 2; i++) { str1[i] = data.Substring(i * 2, 2); bytes[i] = Convert.ToByte(str1[i], 16); //string str2 = ("0x" + str1[i]); } return bytes; } } /// <summary> /// 的集中器地址转换为6字节bytes /// </summary> /// <param name="s"></param> /// <returns></returns> public static byte[] StrAddToBytes(string s) { byte[] data=new byte[s.Length/2]; for (int i = 0; i < s.Length/2; i = i + 2) { data[i] = Convert.ToByte(s.Substring(i * 2, 2), 16); } return BytesConvert.bytesConvert(data); } /// <summary> /// 摄像头转换为6字节bytes /// </summary> /// <param name="s"></param> /// <returns></returns> public static byte[] StrConvertToBytes(string s) { byte[] data = new byte[s.Length / 2]; for (int i = 0; i < s.Length / 2; i = i + 2) { data[i] = Convert.ToByte(s.Substring(i * 2, 2), 16); } return data; } } }
目前还在学习中,希望会对大家有所帮助,觉得不错,就点赞支持一下。
另外,转载时请附带链接。谢谢!

浙公网安备 33010602011771号