/// <summary> /// 收到消息 /// </summary> /// <param name="br">流</param> /// <param name="socketID">套接字ID</param> /// <param name="localSID">本地套接字ID</param> /// <param name="len">长度</param> public virtual void onCallBack(FCBinary br, int socketID, int localSID, int len) { int headSize = sizeof(int) * 4 + sizeof(short) * 3 + sizeof(byte) * 2; int functionID = br.readShort(); int sessionID = br.readInt(); int requestID = br.readInt(); int state = br.readByte(); int compressType = br.readByte(); int bodyLength = br.readInt(); byte[] body = new byte[len - headSize]; br.readBytes(body); if (compressType == COMPRESSTYPE_GZIP) { using (MemoryStream dms = new MemoryStream()) { using (MemoryStream cms = new MemoryStream(body)) { using (GZipStream gzip = new GZipStream(cms, CompressionMode.Decompress)) { byte[] buffer = new byte[1024]; int size = 0; while ((size = gzip.Read(buffer, 0, buffer.Length)) > 0) { dms.Write(buffer, 0, size); } body = dms.ToArray(); } } } } FCMessage message = new FCMessage(GroupID, ServiceID, functionID, sessionID, requestID, socketID, state, compressType, bodyLength, body); onReceive(message); onWaitMessageHandle(message); message.m_body = null; body = null; }
/// <summary> /// 回调方法 /// </summary> public void callBack(FCMessage message) { int callBackSize = m_callBacks.Count; for (int i = 0; i < callBackSize; i++) { m_callBacks.get(i)(message); } }
/// <summary> /// 异步发送数据 /// </summary> /// <param name="obj"></param> public void asynSend(Object obj) { FCMessage message = obj as FCMessage; if (message == null) { return; } sendRequest(message); }
/// <summary> /// 等待消息的处理 /// </summary> /// <param name="message">消息</param> public virtual void onWaitMessageHandle(FCMessage message) { if (m_waitMessages.Count > 0) { lock (m_waitMessages) { if (m_waitMessages.containsKey(message.m_requestID)) { FCMessage waitMessage = m_waitMessages.get(message.m_requestID); waitMessage.copy(message); } } } }
/// <summary> /// 复制数据 /// </summary> /// <param name="message">消息</param> public void copy(FCMessage message) { m_groupID = message.m_groupID; m_serviceID = message.m_serviceID; m_functionID = message.m_functionID; m_sessionID = message.m_sessionID; m_requestID = message.m_requestID; m_socketID = message.m_socketID; m_state = message.m_state; m_compressType = message.m_compressType; m_bodyLength = message.m_bodyLength; m_body = message.m_body; }
/// <summary> /// 发送POST数据 /// </summary> /// <param name="message">消息</param> /// <returns>返回消息</returns> public override int send(FCMessage message) { if (!m_isSyncSend) { Thread thread = new Thread(asynSend); thread.Start(message); return(1); } else { return(sendRequest(message)); } }
/// <summary> /// 发送到监听者 /// </summary> /// <param name="message">消息</param> public virtual void sendToListener(FCMessage message) { FCMessageListener listener = null; lock (m_listeners) { if (m_listeners.containsKey(message.m_requestID)) { listener = m_listeners.get(message.m_requestID); } } if (listener != null) { listener.callBack(message); } }
/// <summary> /// 发送消息 /// </summary> /// <param name="message">消息</param> public override int send(FCMessage message) { FCBinary bw = new FCBinary(); byte[] body = message.m_body; int bodyLength = message.m_bodyLength; int uncBodyLength = bodyLength; lock (m_compressTypes) { if (m_compressTypes.ContainsKey(message.m_socketID)) { message.m_compressType = m_compressTypes.get(message.m_socketID); } } if (message.m_compressType == COMPRESSTYPE_GZIP) { using (MemoryStream cms = new MemoryStream()) { using (GZipStream gzip = new GZipStream(cms, CompressionMode.Compress)) { gzip.Write(body, 0, body.Length); } body = cms.ToArray(); bodyLength = body.Length; } } int len = sizeof(int) * 4 + bodyLength + sizeof(short) * 3 + sizeof(byte) * 2; bw.writeInt(len); bw.writeShort((short)message.m_groupID); bw.writeShort((short)message.m_serviceID); bw.writeShort((short)message.m_functionID); bw.writeInt(message.m_sessionID); bw.writeInt(message.m_requestID); bw.writeByte((byte)message.m_state); bw.writeByte((byte)message.m_compressType); bw.writeInt(uncBodyLength); bw.writeBytes(body); byte[] bytes = bw.getBytes(); lock (FCHttpMonitor.MainMonitor.m_httpDatas) { FCHttpMonitor.MainMonitor.m_httpDatas.get(message.m_socketID).m_resBytes = bytes; } int ret = bytes.Length; UpFlow += ret; bw.close(); onClientClose(message.m_socketID, 0); return(ret); }
/// <summary> /// 发送消息 /// </summary> /// <param name="message">消息</param> public virtual int send(FCMessage message) { FCBinary bw = new FCBinary(); byte[] body = message.m_body; int bodyLength = message.m_bodyLength; int uncBodyLength = bodyLength; if (message.m_compressType == COMPRESSTYPE_GZIP) { using (MemoryStream cms = new MemoryStream()) { using (GZipStream gzip = new GZipStream(cms, CompressionMode.Compress)) { gzip.Write(body, 0, body.Length); } body = cms.ToArray(); bodyLength = body.Length; } } int len = sizeof(int) * 4 + bodyLength + sizeof(short) * 3 + sizeof(byte) * 2; bw.writeInt(len); bw.writeShort((short)message.m_groupID); bw.writeShort((short)message.m_serviceID); bw.writeShort((short)message.m_functionID); bw.writeInt(message.m_sessionID); bw.writeInt(message.m_requestID); bw.writeByte((byte)message.m_state); bw.writeByte((byte)message.m_compressType); bw.writeInt(uncBodyLength); bw.writeBytes(body); byte[] bytes = bw.getBytes(); int length = bytes.Length; int ret = FCClientSockets.send(message.m_socketID, bytes, length); m_upFlow += ret; bw.close(); return(ret); }
/// <summary> /// 注册等待 /// </summary> /// <param name="requestID">请求ID</param> /// <param name="message">消息</param> public virtual void registerWait(int requestID, FCMessage message) { lock (m_waitMessages) { m_waitMessages.put(requestID, message); } }
/// <summary> /// 接收数据 /// </summary> /// <param name="message">消息</param> public virtual void onReceive(FCMessage message) { lock (m_compressTypes) { m_compressTypes.put(message.m_socketID, message.m_compressType); } }
/// <summary> /// 接收数据 /// </summary> /// <param name="message">消息</param> public override void onReceive(FCMessage message) { base.onReceive(message); sendToListener(message); }
/// <summary> /// 发送POST数据 /// </summary> /// <param name="message">消息</param> /// <returns>返回消息</returns> public int sendRequest(FCMessage message) { FCBinary bw = new FCBinary(); byte[] body = message.m_body; int bodyLength = message.m_bodyLength; int uncBodyLength = bodyLength; if (message.m_compressType == COMPRESSTYPE_GZIP) { using (MemoryStream cms = new MemoryStream()) { using (GZipStream gzip = new GZipStream(cms, CompressionMode.Compress)) { gzip.Write(body, 0, body.Length); } body = cms.ToArray(); bodyLength = body.Length; } } int len = sizeof(int) * 4 + bodyLength + sizeof(short) * 3 + sizeof(byte) * 2; bw.writeInt(len); bw.writeShort((short)message.m_groupID); bw.writeShort((short)message.m_serviceID); bw.writeShort((short)message.m_functionID); bw.writeInt(message.m_sessionID); bw.writeInt(message.m_requestID); bw.writeByte((byte)message.m_state); bw.writeByte((byte)message.m_compressType); bw.writeInt(uncBodyLength); bw.writeBytes(body); byte[] bytes = bw.getBytes(); int length = bytes.Length; HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(m_url); webReq.Method = "POST"; webReq.ContentType = "application/x-www-form-urlencoded"; webReq.ContentLength = bytes.Length; if (bytes != null) { Stream writer = webReq.GetRequestStream(); writer.Write(bytes, 0, bytes.Length); writer.Close(); } HttpWebResponse response = (HttpWebResponse)webReq.GetResponse(); Stream reader = response.GetResponseStream(); long contentLength = response.ContentLength; byte[] dataArray = new byte[contentLength]; for (int i = 0; i < contentLength; i++) { dataArray[i] = (byte)reader.ReadByte(); } response.Close(); reader.Dispose(); bw.close(); int ret = dataArray.Length; UpFlow += ret; FCClientService.callBack(message.m_socketID, 0, dataArray, ret); return(ret); }
/// <summary> /// 接收数据 /// </summary> /// <param name="message">消息</param> public virtual void onReceive(FCMessage message) { }