示例#1
0
        //向客户端发送数据
        public void Send(TcpClientEx tcpClient, ArraySegment <byte> datas)
        {
            if (tcpClient != null && tcpClient.Connected)
            {
                try
                {
                    NetworkStream stream = tcpClient.GetStream();
                    if (stream != null)
                    {
                        int num = 0;
                        while (!stream.CanWrite && tcpClient != null && tcpClient.Connected)
                        {
                            num++;
                            if (num > 10)
                            {
                                return;
                            }
                            Thread.Sleep(1000);
                            continue;
                        }
                        SplitPakeage splitPakeage = new SplitPakeage();
                        byte[]       newData      = splitPakeage.AssembleBytes(datas, this);

                        stream.WriteAsync(newData, 0, newData.Length);
                        stream.Flush();

                        TcpPackConfig.SendDelayTime();
                    }
                }
                catch { }
            }
        }
示例#2
0
        private async Task RunAsync(int port, int remoteport, IPAddress remoteIp)
        {
            Client = new AsyncTcpClient
            {
                IPAddress         = remoteIp,
                Port              = port,
                AutoReconnect     = true,
                ConnectedCallback = async(c, isReconnected) =>
                {
                    c.TemporaryByteBuffer = new List <byte[]>();
                    c.TemporaryByteRun    = false;
                    c.TemporaryBytesCount = 0;
                    c.TemporaryBytesKey   = "";
                    if (!c.IsClosing)
                    {
                        if (OnConnectedServer != null)
                        {
                            OnConnectedServer(c, true, "连接服务器成功");
                        }
                        await c.WaitAsync();   // 等待服务器

                        //连接到服务器后向服务器发送心跳握手数据
                    }
                },
                ClosedCallback = (c, isReconnected) =>
                {
                    c.TemporaryByteBuffer = new List <byte[]>();
                    c.TemporaryByteRun    = false;
                    c.TemporaryBytesCount = 0;
                    c.TemporaryBytesKey   = "";
                    if (c.IsClosing)
                    {
                        if (OnDisConnectedServer != null)
                        {
                            OnDisConnectedServer(c, true, "与服务器连接断开!");
                        }
                    }
                },
                ReceivedCallback = (c, count) =>
                {
                    ///原始数据包,有可能是粘包在一起,所以要单独处理
                    byte[] receivebytes = c.ByteBuffer.Dequeue(count);
                    //如果获取的是空数据,则结束任务
                    if (receivebytes.Length <= 0)
                    {
                        return(Task.CompletedTask);
                    }
                    //if (count != TcpPackConfig.NormalPackSize)//接收的包必须是5120
                    //    return Task.CompletedTask;
                    if (c.UsedPackageIdentification)
                    {
                        //准备分隔数据包,由于本系统全部将字符串转换为字节,所以需要通过字符串来分隔
                        byte[] headbytes       = new byte[c.HeadPackSize]; //头标识字节
                        byte[] macbytes        = new byte[c.MACSize];      //MAC地址
                        byte[] reallengthbytes = new byte[4];              //MAC地址
                        byte[] tailbytes       = new byte[c.TailPackSize]; //获取尾标识
                        System.Array.Copy(receivebytes, 0, headbytes, 0, headbytes.Length);
                        System.Array.Copy(receivebytes, headbytes.Length, macbytes, 0, macbytes.Length);
                        System.Array.Copy(receivebytes, headbytes.Length + macbytes.Length, reallengthbytes, 0, reallengthbytes.Length);

                        string receive_head   = Encoding.UTF8.GetString(headbytes);
                        string receive_mac    = Encoding.UTF8.GetString(macbytes);
                        string receive_length = BitConverter.ToInt32(macbytes, 0).ToString();

                        System.Array.Copy(receivebytes, headbytes.Length + macbytes.Length + 4 + int.Parse(receive_length), tailbytes, 0, tailbytes.Length);
                        string receive_tail = Encoding.UTF8.GetString(tailbytes);
                        //反回去获取分隔字节
                        if (receive_head != c.HeadPack || receive_tail != c.TailPack)
                        {
                            return(Task.CompletedTask);
                        }


                        string       MAC          = receive_mac;
                        string       msg          = "";
                        SplitPakeage splitPakeage = new SplitPakeage();
                        byte[]       realbytes    = splitPakeage.RemoveIdentificationBytes(receivebytes, c, out MAC, out msg);
                        if (realbytes.Length <= 0)
                        {
                            return(Task.CompletedTask);
                        }

                        try
                        {//分包处理
                            SplitReceivePack(realbytes, realbytes.Length, c);
                        }
                        catch (Exception ex)
                        {
                            DisplayException(new Exception("ERR10025" + ex.Message));
                        }
                    }



                    return(Task.CompletedTask);
                }
            };
            Client.Message           += Client_Message;
            Client.TCPExceptionEvent += Client_TCPExceptionEvent;
            var clientTask = Client.RunAsync();

            TaskManager.Add(clientTask);
        }
示例#3
0
        /// <summary>
        /// 通过将类直接与回调方法一起使用来演示客户端和服务器。IPAddress.IPv6Loopback
        /// </summary>
        /// <returns></returns>
        private async Task RunAsync(int port, IPAddress remoteIp)
        {
            Client = new AsyncTcpClient
            {
                IPAddress         = remoteIp,
                Port              = port,
                AutoReconnect     = true,
                ScadaClientType   = ScadaClientType.IoManager,
                ConnectedCallback = async(c, isReconnected) =>
                {
                    if (!c.IsClosing)
                    {
                        if (OnConnectedServer != null)
                        {
                            OnConnectedServer(c, true, "连接服务器成功");
                        }
                        await c.WaitAsync();   // 等待服务器

                        //连接到服务器后向服务器发送心跳握手数据
                    }
                },
                ConnectedTimeoutCallback = (c, isReconnected) =>
                {
                    if (OnConnectTimeout != null)
                    {
                        OnConnectTimeout(c, isReconnected, "与服务器连接超时");
                    }
                },
                ClosedCallback = (c, isReconnected) =>
                {
                    if (c.IsClosing)
                    {
                        if (OnDisConnectedServer != null)
                        {
                            OnDisConnectedServer(c, true, "与服务器连接断开!");
                        }
                    }
                },

                ReceivedCallback = (c, count) =>
                {
                    #region
                    ///原始数据包,有可能是粘包在一起,所以要单独处理
                    byte[] receivebytes = c.ByteBuffer.Dequeue(count);
                    //如果获取的是空数据,则结束任务
                    if (receivebytes.Length <= 0)
                    {
                        return(Task.CompletedTask);
                    }
                    if (c.UsedPackageIdentification)
                    {
                        string       MAC          = "";
                        string       msg          = "";
                        SplitPakeage splitPakeage = new SplitPakeage();
                        byte[]       realbytes    = splitPakeage.RemoveIdentificationBytes(receivebytes, c, out MAC, out msg);

                        //获取解析后的数据体如果为0,则不做任何处理
                        if (realbytes.Length > 0)
                        {
                            try
                            {
                                //处理数据体
                                SplitReceivePack(realbytes, realbytes.Length, c);
                            }
                            catch (Exception ex)
                            {
                                DisplayException(new Exception("ERR10025" + ex.Message));
                            }
                        }
                    }
                    #endregion
                    return(Task.CompletedTask);
                }
            };
            Client.Message           += Client_Message;
            Client.TCPExceptionEvent += Client_TCPExceptionEvent;
            var clientTask = Client.RunAsync();
            TaskManager.Add(clientTask);
        }