private void btnRequestClientUpdate_Click(object sender, EventArgs e) { byte[] frame = FileTransferProtocol.GetFrameWhatIsYourMNandVersion(); foreach (NetworkStream stream in streamList) { try { stream.Write(frame, 0, frame.Length); } catch { } } }
//FileStream fStream = null; private void SetupFrameHandler() { serialPortFrameMgr = new FrameManager((ushort)(serialPort1.ReadBufferSize * 3), serialPort1); serialPortFrameMgr.OnReceiveFrame += new FrameManager.OnReceiveFrameHandler( delegate(/*object own,*/ FileTransferProtocol.CommandType frameType, int parameter, byte[] commandData) { //SerialPort serialPort = (SerialPort)own; switch (frameType) { case FileTransferProtocol.CommandType.FileName: string fileName = System.Text.Encoding.Default.GetString(commandData, 0, commandData.Length); if (fileName != null) { if (fStream != null) { fStream.Close(); fStream = null; } string CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName); string startDir = CurrentPath + @"\update\"; if (!Directory.Exists(startDir)) { Directory.CreateDirectory(startDir); } if (File.Exists(startDir + fileName)) { File.Delete(startDir + fileName); } fStream = File.Open(startDir + fileName, FileMode.CreateNew); SetText(DateTime.Now.ToString() + " 准备接收文件:" + fileName + " 文件总长度:" + parameter); } break; case FileTransferProtocol.CommandType.FileData: if (fStream != null && commandData != null && commandData.Length > 0) { fStream.Write(commandData, 0, commandData.Length); SetText("收到文件数据长度" + commandData.Length); } break; case FileTransferProtocol.CommandType.FileSendFinish: if (fStream != null) { fStream.Close(); fStream = null; SetText(DateTime.Now.ToString() + " 收到文件结束信号"); } break; case FileTransferProtocol.CommandType.WhatIsYourMNandVersion: //byte[] frame = FileTransferProtocol.GetFrameMNAndVersion(1, "456"); byte[] frame = FileTransferProtocol.GetFrameWhatIsYourMNandVersion(); serialPort1.Write(frame, 0, frame.Length); break; case FileTransferProtocol.CommandType.Message: string message = System.Text.Encoding.Default.GetString(commandData, 0, commandData.Length); this.Invoke(new EventHandler(delegate(object s, EventArgs ar) { this.txtData.Text += message + "\r\n"; })); break; } return(true); }); }
private void ConnectOrDisconnect() { var ip = cmbIP.Text; var port = int.Parse(txtPort.Text); if (mThreadConnectToServer == null) { mThreadConnectToServer = new Thread(new ThreadStart(delegate() { try { if (stream != null) { stream.Close(); } tcpclient = new TcpClient(ip, port); //SetButtonState(btnConnect, "断开(&S)"); tcpclient.ReceiveBufferSize = 0xFFFF + 1; tcpclient.SendBufferSize = 0xFFFF + 1; stream = tcpclient.GetStream(); int revFilePartCount = 0; try { stream.Write(System.Text.Encoding.Default.GetBytes("OK"), 0, 2); SetButtonState(btnConnect, "断开(&S)"); } catch (Exception ex) { if (stream != null) { stream.Close(); } if (tcpclient != null) { tcpclient.Close(); } mThreadConnectToServer.Abort(); return; } //创建帧分析对象 fFrameMgr = new FrameManager((ushort)(serialPort1.ReadBufferSize * 3), stream); //实现帧处理函数 fFrameMgr.OnReceiveFrame += new FrameManager.OnReceiveFrameHandler( delegate(/*object _stream,*/ FileTransferProtocol.CommandType frameType, int parameter, byte[] commandData) { //NetworkStream nStream = (NetworkStream)_stream; switch (frameType) { case FileTransferProtocol.CommandType.FileName: string fileName = System.Text.Encoding.Default.GetString(commandData, 0, commandData.Length); if (fileName != null) { if (fStream != null) { fStream.Close(); fStream = null; } revFilePartCount = 0; string CurrentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName); string startDir = CurrentPath + @"\update\"; if (!Directory.Exists(startDir)) { Directory.CreateDirectory(startDir); } if (File.Exists(startDir + fileName)) { File.Delete(startDir + fileName); } fStream = File.Open(startDir + fileName, FileMode.CreateNew); AddItemToList(listBox1, DateTime.Now.ToString() + " 准备接收文件:" + fileName + " 文件总长度:" + parameter); } break; case FileTransferProtocol.CommandType.FileData: if (fStream != null && commandData != null && commandData.Length > 0) { revFilePartCount++; fStream.Write(commandData, 0, commandData.Length); AddItemToList(listBox1, string.Format("收到 第{0}块 数据长度:{1} 服务器端分块号:{2} ", revFilePartCount, commandData.Length, parameter)); } break; case FileTransferProtocol.CommandType.FileSendFinish: if (fStream != null) { fStream.Close(); fStream = null; AddItemToList(listBox1, DateTime.Now.ToString() + " 收到文件结束信号"); } break; case FileTransferProtocol.CommandType.WhatIsYourMNandVersion: byte[] frame = FileTransferProtocol.GetFrameWhatIsYourMNandVersion(); stream.Write(frame, 0, frame.Length); break; case FileTransferProtocol.CommandType.Message: string message = System.Text.Encoding.Default.GetString(commandData, 0, commandData.Length); AddItemToList(listBox1, message); break; } return(true); }); //------------------------------------------------------------------------------------ //方式0数采仪被动更新(只有在更新服务器询问[指定列表的]数采仪时,则数据采仪才更新) //------------------------------------------------------------------------------------ ////把 网络 或 串口 的 数据 传给 帧分析对象的Handler函数做分析 if (receiveThread == null) { receiveThread = new Thread(new ThreadStart(delegate() { int MaxLength = FileTransferProtocol.MaxFrameLength - FileTransferProtocol.FrameStructLength;//64*1024;0xFFFF+1;64K; Byte[] data = new Byte[MaxLength]; try { bool running = true; while (running) { Debug.WriteLine(string.Format("{0}", Thread.CurrentThread.Name)); Int32 bytes = 0; try { bytes = stream.Read(data, 0, data.Length); } catch (System.IO.IOException er) { DisConnect(); } if (bytes > 0) { //这是处理收到帧 running = fFrameMgr.Handler(bytes, data); } else { //远端客户主动断开socket running = false; } } } catch (ThreadAbortException er) { AddItemToList(listBox1, string.Format(DateTime.Now.ToString() + " 连接{0}:{1}未成功或已取消", ip, port)); receiveThread = null; } catch (Exception err) { AddItemToList(listBox1, DateTime.Now.ToString() + " " + err.Message); } })); receiveThread.Start(); } else { if (stream != null) { stream.Close(); } receiveThread.Abort(); receiveThread = null; } //-----------------------------------------方式0-------------------------------------- } catch (ThreadAbortException er) { AddItemToList(listBox1, string.Format(DateTime.Now.ToString() + " 连接{0}:{1}未成功或已取消", ip, port)); mThreadConnectToServer = null; } catch (SocketException er) { AddItemToList(listBox1, DateTime.Now.ToString() + " " + er.Message); DisConnect(); } })); mThreadConnectToServer.Start(); } else { DisConnect(); } }
private void btnTestCOMTCP_Click(object sender, EventArgs e) { CRC.CRC8 crc = new CRC.CRC8(); int dataStartIndex = FileTransferProtocol.CommandDataIndex; //测试:准备发送新的文件 string filename = @"c:\abc.txt"; byte[] FileInfo = FileTransferProtocol.GetFrameFileInfo(255 + 256, filename); //帧头 Trace.Assert(FileInfo[0] == FileTransferProtocol.FrameHead); //crc //Trace.Assert(FileInfo[1] == crc); //命令字 Trace.Assert(FileInfo[1] == 0x00); //文件长度 Trace.Assert(FileInfo[2] == 0xFF); Trace.Assert(FileInfo[3] == 0x01); Trace.Assert(FileInfo[4] == 0); Trace.Assert(FileInfo[5] == 0); byte[] bs = System.Text.Encoding.Default.GetBytes(filename); Trace.Assert(FileInfo[6] == bs[0]); Trace.Assert(FileInfo[7] == bs[1]); //帧偏移 Trace.Assert((FileInfo[FileInfo.Length - 4] + FileInfo[FileInfo.Length - 3] * 256) == (FileInfo.Length - 1)); Trace.Assert(FileInfo[FileInfo.Length - 2] == 0x7F); Trace.Assert(FileInfo[FileInfo.Length - 1] == 0xFF); byte[] data = new byte[] { 0x01, 0x02, 0xFF, 0xEF, 0xCC, 0xDD, 0x00, 0xAA }; byte[] FileData = FileTransferProtocol.GetFrameFileData(0x01AABBFF, data); //帧头 Trace.Assert(FileData[0] == FileTransferProtocol.FrameHead); //帧偏移 Trace.Assert((FileData[FileData.Length - 3] * 256 + FileData[FileData.Length - 4]) == (FileData.Length - 1)); //命令字 Trace.Assert(FileData[1] == 0x1); //文件偏移 Trace.Assert(FileData[2] == 0xFF); Trace.Assert(FileData[3] == 0xBB); Trace.Assert(FileData[4] == 0xAA); Trace.Assert(FileData[5] == 0x01); //文件数据 Trace.Assert(FileData[6] == 0x01); Trace.Assert(FileData[7] == 0x02); Trace.Assert(FileData[8] == 0xFF); Trace.Assert(FileData[9] == 0xEF); Trace.Assert(FileData[10] == 0xCC); Trace.Assert(FileData[11] == 0xDD); //crc //byte[] x = new byte[] { 0x02, 0xFF, 0xBB, 0xAA, 0x01, 0x01, 0x02, 0xFF, 0xEF, 0xCC, 0xDD, 0x00, 0xAA, FileData[FileData.Length - 3], FileData[FileData.Length - 2] }; //Trace.Assert(FileData[1] == crc.Crc(x, 0, x.Length)); Trace.Assert(FileData[FileData.Length - 1] == 0x7F); //文件发送完毕 byte[] f = FileTransferProtocol.GetFrameFileSendFinish(); //帧头 Trace.Assert(f[0] == FileTransferProtocol.FrameHead); //帧偏移 Trace.Assert((f[f.Length - 3] * 256 + f[f.Length - 4]) == f.Length - 1); //命令字 Trace.Assert(f[1] == 0x02); //crc //Trace.Assert(f[1] == crc.Crc(f, dataStartIndex, f.Length - 3)); Trace.Assert(f[f.Length - 1] == 0x7F); //表示可以新的文件 byte[] a = FileTransferProtocol.GetFrameWhatIsYourMNandVersion(); TestCmdFrame(a, 0xFD, crc); //表示已经接收数据 //byte[] Ac = FileTransferProtocol.GetFrameMNAndVersion(1,"123"); //TestCmdFrame(Ac, 0xFE, crc); //表示已经保存文件完毕 byte[] s = FileTransferProtocol.GetFrameCloseSocket(); TestCmdFrame(s, 0xFF, crc); }