//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); } }