public override void OnReceiveTimeout(string clientAddress, byte[] receiveData) { try { BufferReader reader = new BufferReader(receiveData); string paramString = reader.ReadPacketString(); paramString = HttpUtility.UrlDecode(paramString, Encoding.UTF8); int index = paramString.IndexOf("?d="); if (index != -1) { index += 3; paramString = paramString.Substring(index, paramString.Length - index); } PacketMessage receivePacket = ParsePacketMessage(clientAddress, paramString, ConnectType.Tcp); var recHead = receivePacket.Head; int errorCode = LanguageHelper.GetLang().ErrorCode; string errorMsg = LanguageHelper.GetLang().RequestTimeout; MessageHead head = new MessageHead(recHead.MsgId, recHead.ActionId, "st", errorCode, errorMsg); head.HasGzip = true; MessageStructure ds = new MessageStructure(); ds.WriteBuffer(head); byte[] data = ds.ReadBuffer(); OnSendCompleted(clientAddress, data); } catch (Exception ex) { TraceLog.WriteError("Send to client {0} timeout error:{1}", clientAddress, ex); } }
public void RequestTimeout(HttpConnection connection) { var param = connection.Param; int msgId = param.Get("MsgId").ToInt(); int actionId = param.Get("ActionId").ToInt(); int errorCode = LanguageHelper.GetLang().ErrorCode; string errorMsg = LanguageHelper.GetLang().RequestTimeout; var head = new MessageHead(msgId, actionId, "st", errorCode, errorMsg); head.HasGzip = true; var ms = new MessageStructure(); ms.WriteBuffer(head); byte[] data = ms.ReadBuffer(); string remoteAddress = connection.Context.Request.RemoteEndPoint.Address.ToString(); string successMsg = string.Format("{0}>>发送超时到{1} {2}字节!", DateTime.Now.ToString("HH:mm:ss:ms"), remoteAddress, data.Length); Console.WriteLine(successMsg); OnResponseCompleted(connection, data); }
private static void OnNetTcpCallback(object sender, RemoteEventArgs e) { try { RemoteService proxy = sender as RemoteService; if (proxy == null) { return; } try { using (var ms = new MessageStructure(e.Data)) { var head = ms.ReadHeadGzip(); if (head != null) { var package = proxy.Find(head.MsgId); if (package != null) { package.Message = ms.ReadBuffer(); proxy.Remove(head.MsgId); package.OnCallback(); return; } } } } catch (Exception) { } proxy.OnPushedHandle(e); } catch (Exception ex) { TraceLog.WriteError("OnNetTcpCallback error:{0}", ex); } }
/// <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; }
protected byte[] OnCallRemoteComplated(ChannelContext context, string route, string param, string remoteAddress) { lock (context) { HttpGet httpGet = new HttpGet(param, remoteAddress); MessageStructure structure = new MessageStructure(); MessageHead head = new MessageHead(); OnCallRemote(route, httpGet, head, structure); structure.WriteBuffer(head); return structure.ReadBuffer(); } }
protected virtual void OnSendToClient(PacketMessage packet) { var clientAddress = packet.Head.Address; byte[] content = packet.Content; if (!packet.Head.EnableGzip) { //gzip压缩包 MessageStructure ds = new MessageStructure(); ds.WriteGzipBuffer(content); packet.Content = ds.ReadBuffer(); } byte[] data = packet.Content; OnSendCompleted(clientAddress, data); }
/// <summary> /// 出错处理 /// </summary> /// <param name="response"></param> /// <param name="actionID"></param> /// <param name="errorCode"></param> /// <param name="errorInfo"></param> public static void RequestError(IGameResponse response, int actionID, int errorCode, string errorInfo) { MessageHead head = new MessageHead(actionID, errorCode, errorInfo); MessageStructure sb = new MessageStructure(); sb.WriteBuffer(head); response.BinaryWrite(sb.ReadBuffer()); }
private static byte[] DoSerialize(params BaseEntity[] entityList) { var rootWriter = new MessageStructure(); rootWriter.PushIntoStack(entityList.Length); object fieldValue = null; foreach (var entity in entityList) { var schema = entity.GetSchema(); if (schema == null) { continue; } var recordWriter = new MessageStructure(); recordWriter.PushIntoStack(schema.Name); //write columns var columns = schema.GetColumns(); foreach (var column in columns) { fieldValue = entity.GetPropertyValue(column.Name); if (EntitySchemaSet.IsSupportType(column.ColumnType)) { recordWriter.PushIntoStack(column.ColumnType, fieldValue); } else if (column.HasChild) { PushChildStack(recordWriter, column, fieldValue); } } rootWriter.PushIntoStack(recordWriter); } var head = new MessageHead(SyncActionId); rootWriter.WriteBuffer(head); return rootWriter.ReadBuffer(); }