public void Encode(Session session, Object message, MemoryStream stream) { if (message is WebMessage) { WebMessage msg = (WebMessage)message; EncodeMessage(session, msg); Byte[] bytes = msg.RawContent; if (bytes == null) { bytes = new byte[0]; } bool fin = true; bool rsv1 = false; bool rsv2 = false; bool rsv3 = false; byte opcode = 8; // if undefined then close it bool maskcode = msg.MaskFlag > 0; if (msg.IsString()) { opcode = 0x01; } else if (msg.IsBinary()) { opcode = 0x02; } else if (msg.IsPingFrame()) { opcode = 0x09; } else if (msg.IsPongFrame()) { opcode = 0x0A; } else if (msg.IsCloseFrame()) { opcode = 0x08; } byte payloadlength = 0; byte[] mask = maskcode ? new byte[4] { 0, 0, 0, 0 } : new byte[0]; byte[] extend = new byte[0]; int length = msg.ContentSize; if (length < 126) { extend = new byte[0]; payloadlength = (byte)(length & 0xff); } else if (length < 65536) { extend = new byte[2]; payloadlength = 126; extend[0] = (byte)(length / 256); extend[1] = (byte)(length % 256); } else { extend = new byte[8]; payloadlength = 127; int left = length; int unit = 256; for (int i = 7; i > 1; i--) { extend[i] = (byte)(left % unit); left = left / unit; if (left == 0) { break; } } } byte[] headerbuffer = new byte[2] { 0, 0 }; if (fin) { headerbuffer[0] |= 0x80; } if (rsv1) { headerbuffer[0] |= 0x40; } if (rsv2) { headerbuffer[0] |= 0x20; } if (rsv3) { headerbuffer[0] |= 0x10; } headerbuffer[0] |= opcode; if (maskcode) { headerbuffer[1] |= 0x80; } headerbuffer[1] |= payloadlength; stream.Write(headerbuffer, 0, headerbuffer.Length); if (extend.Length > 0) { stream.Write(extend, 0, extend.Length); } if (mask.Length > 0) { stream.Write(mask, 0, mask.Length); } if (mask.Length > 0) { int masklen = mask.Length; for (int i = 0; i < bytes.Length; i++) { bytes[i] = (byte)(bytes[i] ^ mask[i % masklen]); } } stream.Write(bytes, 0, length); } else if (message is byte[]) { Encode(session, new WebMessage(message as byte[]), stream); } else if (message is string) { String msg = (String)message; Encoding encode = Encoding.UTF8; Byte[] bytes = encode.GetBytes(msg); stream.Write(bytes, 0, bytes.Length); } }