//向客户端发送数据 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 { } } }
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); }
/// <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); }