Esempio n. 1
0
        //private Queue<byte[]> GetPackage(byte[] receiveByte)
        //{
        //    List<byte> package =new List<byte>();
        //    var queePackage = new Queue<byte[]>();
        //    int msgLength;

        //    if (_prePartialReceiveByte != null && _prePartialReceiveByte.Length > 0)
        //    {
        //        package= package.Concat(_prePartialReceiveByte).ToList();
        //    }
        //    package = package.Concat(receiveByte).ToList();
        //    int rIndex = package.IndexOf(0x0A);
        //    if (rIndex == -1)//当前包也是同一个消息中的一部分
        //    {//处理断包问题
        //        if (_prePartialReceiveByte != null && _prePartialReceiveByte.Length > 0)
        //        {
        //            var temp = _prePartialReceiveByte.ToList();
        //            temp.AddRange(receiveByte);
        //            _prePartialReceiveByte = temp.ToArray();
        //        }
        //        else
        //        {
        //            _prePartialReceiveByte = receiveByte;
        //        }
        //        return queePackage;
        //    }
        //    if (package.Count >= 6) //包最小长度6,过滤掉0数据长度包
        //    {
        //        byte[] byts = package.GetRange(0, 4).ToArray();
        //        msgLength = BitConverter.ToInt32(byts,0);
        //    }
        //    else
        //    {
        //        _prePartialReceiveByte = null;
        //        return queePackage;
        //    }

        //    int takeLength = 0;
        //    while (takeLength < package.Count)
        //    {
        //        var takeBytes = package.Skip(takeLength + 4).Take(msgLength - 4).ToArray();
        //        takeLength += takeBytes.Length + 4;
        //        if (takeBytes.Length + 4 == msgLength && takeBytes[takeBytes.Length - 2] == 0x0D &&
        //            takeBytes[takeBytes.Length - 1] == 0x0A)
        //        {
        //            queePackage.Enqueue(takeBytes.Take(takeBytes.Length - 2).ToArray());
        //        }
        //        else break;
        //        var currindex = package.IndexOf(0x0A, takeLength);
        //        if (currindex > 0 && currindex + 1 < package.Count)
        //        {
        //            byte[] byts = package.GetRange(takeLength, 4).ToArray();
        //            msgLength = BitConverter.ToInt32(byts, 0);
        //        }
        //        else break;
        //    }
        //    if (takeLength < package.Count)
        //    {
        //        _prePartialReceiveByte = package.GetRange(takeLength, package.Count - takeLength).ToArray();
        //    }
        //    else
        //    {
        //        _prePartialReceiveByte = null;
        //    }
        //    return queePackage;
        //}
        #endregion

        #region Send
        /// <summary>
        /// 发送字节数组,针对websocket协议本身就定义了前2,4,8字节为数据长度,所以不用加上自定义的数据帧长度了
        /// </summary>
        /// <param name="byteData"></param>
        /// <param name="sendCallBack">发送数据当前回调</param>
        public virtual void Send(byte[] byteData, Action <SocketConnection> sendCallBack = null)
        {
            try
            {
#if DEBUG
                LogMsg(ConnectSocket.LocalEndPoint.ToString(), ConnectSocket.RemoteEndPoint.ToString(), $"to {ConnectSocket.RemoteEndPoint} data [{BitConverter.ToString(byteData)}]\r\n");
#endif
                Sktconfig?.BeforeSend?.Invoke(byteData, this);//发送之前的操作
                var sendBytes = BitConverter.GetBytes(byteData.Length + 6).Concat(byteData).ToArray().Concat(new byte[] { 0x0D, 0x0A }).ToArray();
                if (SocketConnectType == SocketConnectType.WebSocket)
                {
                    long   byteLength = byteData.Length;
                    byte[] header;
                    if (byteLength < 126)
                    {
                        header = new byte[] { 0x82, 0x00 };
                        Array.Copy(BitConverter.GetBytes((byte)byteLength & 0x7F), 0, header, 1, 1);
                    }
                    else if (byteLength <= ushort.MaxValue)
                    {
                        header = new byte[] { 0x82, 0x7E, 0x00, 0x00 };
                        var shortLength = Convert.ToUInt16(byteLength);
                        var b1          = Convert.ToByte(shortLength / 256);
                        var b2          = Convert.ToByte(shortLength % 256);
                        Array.Copy(new [] { b1, b2 }, 0, header, 2, 2);
                    }
                    else
                    {
                        header = new byte[] { 0x82, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
                        Array.Copy(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(byteLength)), 0, header, 2, 2);
                    }
                    sendBytes = header.Concat(byteData).ToArray();
                    sendBytes = new DataFrame(sendBytes).GetBytes();
                }
                ConnectSocket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, sendCallBack);
            }
            catch (SocketException sktex)
            {
                SocketException(ConnectSocket, sktex);
            }
            catch (Exception ex)
            {
                Exception(ex);
            }
        }