Пример #1
0
        public static byte[] FrameData(byte[] payload, FrameType frameType)
        {
            var  memoryStream = new MemoryStream();
            byte op           = (byte)((byte)frameType + 128);

            memoryStream.WriteByte(op);

            if (payload.Length > UInt16.MaxValue)
            {
                memoryStream.WriteByte(127);
                var lengthBytes = IntExtensions.ToBigEndianBytes <ulong>(payload.Length);
                memoryStream.Write(lengthBytes, 0, lengthBytes.Length);
            }
            else if (payload.Length > 125)
            {
                memoryStream.WriteByte(126);
                var lengthBytes = IntExtensions.ToBigEndianBytes <ushort>(payload.Length);
                memoryStream.Write(lengthBytes, 0, lengthBytes.Length);
            }
            else
            {
                memoryStream.WriteByte((byte)payload.Length);
            }

            memoryStream.Write(payload, 0, payload.Length);

            return(memoryStream.ToArray());
        }
Пример #2
0
        public static IHandler Create(WebSocketHttpRequest request, Action <string> onMessage, Action onClose, Action <byte[]> onBinary, Action <byte[]> onPing, Action <byte[]> onPong)
        {
            var readState = new ReadState();

            return(new ComposableHandler
            {
                Handshake = sub => Hybi13Handler.BuildHandshake(request, sub),
                TextFrame = s => Hybi13Handler.FrameData(Encoding.UTF8.GetBytes(s), FrameType.Text),
                BinaryFrame = s => Hybi13Handler.FrameData(s, FrameType.Binary),
                PingFrame = s => Hybi13Handler.FrameData(s, FrameType.Ping),
                PongFrame = s => Hybi13Handler.FrameData(s, FrameType.Pong),
                CloseFrame = i => Hybi13Handler.FrameData(IntExtensions.ToBigEndianBytes <ushort>(i), FrameType.Close),
                ReceiveData = d => Hybi13Handler.ReceiveData(d, readState, (op, data) => Hybi13Handler.ProcessFrame(op, data, onMessage, onClose, onBinary, onPing, onPong))
            });
        }