/// <summary> /// /// </summary> /// <param name="session"></param> /// <param name="buffer"></param> /// <returns></returns> public byte[] Receive(string session, byte[] buffer) { Stopwatch watch = new Stopwatch(); watch.Start(); BufferReader reader = new BufferReader(buffer); string routeName = ""; string paramString = reader.ReadPacketString(); #if DEBUG //todo trace TraceLog.ReleaseWrite("Tcp param:{0}", paramString); #endif bool isRoute = false; if (!string.IsNullOrEmpty(paramString) && paramString.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { //检查参数格式:route:name?d=param isRoute = true; string[] paramArray = paramString.Split('?'); if (paramArray.Length == 2) { routeName = paramArray[0].Replace("route:", ""); paramString = "?" + paramArray[1]; } } paramString = HttpUtility.UrlDecode(paramString, Encoding.UTF8); int index = paramString.IndexOf("?d="); if (index != -1) { index += 3; paramString = paramString.Substring(index, paramString.Length - index); } var paramGeter = new ParamGeter(paramString); string remoteAddress = session.RemoteAddress; MessageHead head = ParseMessageHead(paramGeter); head.HasGzip = true; session.UserData = head; MessageStructure ms = new MessageStructure(); #if DEBUG Console.WriteLine("{0}>>请求参数:MsgId:{1},ActionId:{2},ip:{3}", DateTime.Now.ToLongTimeString(), head.MsgId, head.Action, remoteAddress); #endif var settings = ParseRequestSettings(paramGeter, remoteAddress); settings.ParamString = paramString; settings.RouteName = routeName; byte[] sendBuffer = new byte[0]; RequestError error = RequestError.Success; try { if (isRoute) { if (CheckCallAccessLimit(remoteAddress)) { error = RequestError.Unknown; head.ErrorInfo = ErrorCallAccessLimit; } else { ServiceRequest.CallRemote(settings, out sendBuffer); } } else { ServiceRequest.Request(settings, out sendBuffer); } } catch (CommunicationObjectFaultedException fault) { TraceLog.WriteError("The wcfclient request faulted:{0}", fault); error = RequestError.Closed; ServiceRequest.ResetChannel(settings); } catch (Exception ex) { if (ex.InnerException is SocketException) { var sex = ex.InnerException as SocketException; TraceLog.WriteError("The wcfclient request connect:{0}-{1}", sex.SocketErrorCode, sex); if (sex.SocketErrorCode == SocketError.TimedOut) { error = RequestError.Timeout; } else { error = RequestError.UnableConnect; } } else { TraceLog.WriteError("The wcfclient request error:{0}", ex); error = RequestError.Unknown; } ServiceRequest.ResetChannel(settings); } watch.Stop(); switch (error) { case RequestError.Success: ms.WriteGzipBuffer(sendBuffer); string msg = string.Format("[{0}]请求响应{1}:route={8},MsgId={2},St={3},Action-{4},error:{5}-{6},bytes:{7},响应时间:{9}ms\r\n", DateTime.Now.ToLongTimeString(), session.RemoteAddress, head.MsgId, head.St, head.Action, head.ErrorCode, head.ErrorInfo, sendBuffer.Length, routeName, (int)watch.Elapsed.TotalMilliseconds); TraceLog.ReleaseWrite(msg); #if DEBUG #endif Console.WriteLine(msg); break; case RequestError.Closed: case RequestError.NotFindService: head.ErrorInfo = ErrorNotFind; DoWriteError(ms, head); break; case RequestError.UnableConnect: head.ErrorInfo = ErrorConnected; DoWriteError(ms, head); break; case RequestError.Timeout: head.ErrorInfo = ErrorTimeout; DoWriteError(ms, head); break; case RequestError.Unknown: DoWriteError(ms, head); break; default: throw new ArgumentOutOfRangeException("RequestError", error, "Not process RequestError enum."); } sendBuffer = ms.ReadBuffer(); return sendBuffer; }
private MessageHead ParseMessageHead(ParamGeter paramGeter) { int msgId = paramGeter.GetInt("msgid"); int actionId = paramGeter.GetInt("actionId"); string St = "st"; string st = paramGeter.GetString("st"); if (!string.IsNullOrEmpty(st)) { St = st; } return new MessageHead(msgId, actionId, St, 0); }
private RequestSettings ParseRequestSettings(ParamGeter paramGeter, string remoteAddress) { int gameId = 0; int serverId = 0; if (paramGeter.Contains("sid")) { string[] array = paramGeter.GetString("sid").Split('|'); if (array.Length > 2) { string sid = array[0]; gameId = array[1].ToInt(); serverId = array[2].ToInt(); } else { gameId = paramGeter.GetInt("gametype"); serverId = paramGeter.GetInt("serverid"); } } return new RequestSettings(gameId, serverId, remoteAddress); }
protected PacketMessage ParsePacketMessage(string clientAddress, string paramString, ConnectType connectType) { ParamGeter paramGeter = new ParamGeter(paramString); PacketHead head = new PacketHead(connectType, PacketMsgType.Request); head.Address = clientAddress; head.MsgId = paramGeter.GetInt("msgid"); head.Uid = paramGeter.GetInt("uid"); head.ActionId = paramGeter.GetInt("actionId"); string[] sidArray = paramGeter.GetString("sid").Split('|'); if (sidArray.Length > 2) { head.GameId = sidArray[1].ToInt(); head.ServerId = sidArray[2].ToInt(); } else { head.GameId = paramGeter.GetInt("gametype"); head.ServerId = paramGeter.GetInt("serverid"); } head.EnableGzip = false; PacketMessage packet = new PacketMessage(); packet.Head = head; packet.Content = BufferUtils.GetBytes(paramString); return packet; }