public static void EncodeMessage(Session session, WebMessage msg) { // do some complex encode actions here ... Encoding encode = Encoding.UTF8; Byte[] bytes = null; if (msg.IsBinary()) { bytes = msg.RawContent; } else if (msg.MessageContent.Length > 0) { bytes = encode.GetBytes(msg.MessageContent); msg.ContentSize = bytes.Length; } if (bytes == null) { bytes = new byte[0]; } if (msg.ContentSize <= 0) { msg.ContentSize = bytes.Length; // refresh size } if (msg.RawContent == null) { msg.RawContent = bytes; // refresh content } if (msg.RawContent != null && msg.ContentSize > msg.RawContent.Length) { msg.ContentSize = msg.RawContent.Length; } }
protected virtual void DispatchMessage(object data) { Session session = null; try { if (m_MessageHandlerManager == null || data == null) { return; } SessionContext ctx = (SessionContext)data; session = ctx.Session; WebMessage msg = (WebMessage)ctx.Data; if (msg.IsString()) { m_MessageHandlerManager.Dispatch(session, msg.MessageContent); } else if (msg.IsBinary()) { if (m_MessageHandlerManager.CanProcessBinary()) { m_MessageHandlerManager.Dispatch(session, msg.RawContent); } } } catch (Exception ex) { try { OnError(session, Session.ERROR_RECEIVE, ex); } catch { } } }
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); } }