예제 #1
0
파일: Form1.cs 프로젝트: yanzisoft/COMFTP
 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
         {
         }
     }
 }
예제 #2
0
        //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);
            });
        }
예제 #3
0
        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();
            }
        }
예제 #4
0
        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);
        }