/// <summary> /// when a user disconnects, notify the servant layer /// </summary> /// <param name="AContext"></param> public static void OnDisconnect(UserContext AContext) { Log.Info("[CLIENT->PROXY]: Client " + AContext.ClientAddress.ToString() + " disconnected."); //Proxy.onlineUsers.Remove(AContext.ClientAddress.ToString()); Proxy.sendClientDisconnectToServer(AContext); //handled by the gameserver side of the proxy }
/// <summary> /// notify a server that a client just connected /// </summary> /// <param name="client"></param> public void SendClientConnect(UserContext client) { ServerContext server = PickServer(); Message resp = new Message(); resp.Type = ResponseType.Connection; resp.Data = client.ClientAddress.ToString(); server.Send(Newtonsoft.Json.JsonConvert.SerializeObject(resp)); }
private void OnConnected(UserContext context) { //TODO :: Logging? var client = new Client { Id = Guid.NewGuid(), Context = context }; context.Data = client; _clients.TryAdd(client.Id, client); }
private void OnDisconnect(UserContext context) { //TODO :: Logging? if (context.Data != null) { var client = context.Data as Client; if (client != null) { _clients.TryRemove(client.Id, out client); } } }
/// <summary> /// Events generated by client connections /// </summary> /// <param name="AContext"></param> public static void OnConnect(UserContext AContext) { Log.Info("[CLIENT->PROXY]: " + AContext.ClientAddress.ToString() + " connected."); User me = new User(); me.n = AContext.ClientAddress.ToString(); me.Context = AContext; AContext.TimeToProcess = DateTime.Now.Ticks; Proxy.onlineUsers.Add(me.n, me.Context); Proxy.sendClientConnectToServer(AContext); }
/// <summary> /// when proxy receives a msg in JSON format from a client, log it, convert it, and forward it to servant layer /// </summary> /// <param name="AContext"></param> public static void OnReceive(UserContext AContext) { //Log.Info("[CLIENT->PROXY]: Received " + AContext.DataFrame.ToString() + " from : " + AContext.ClientAddress.ToString()); long timestamp = DateTime.Now.Ticks; User me = new User(); me.n = AContext.ClientAddress.ToString(); AContext.ReceivedPackets++; try { string json = AContext.DataFrame.ToString(); Position pos = JsonConvert.DeserializeObject<Position>(json); me.p = pos; //Log.Info("[CLIENT->PROXY]: Position received from Client: " + pos.t.ToString() + ":" + pos.l.ToString() + ":" + pos.z.ToString()); } catch (Exception e) { // Hack: Java client is throwing weird messages filled with '/0'. Temp fix string test = AContext.DataFrame.ToString(); if (test.StartsWith("\0") == false) Log.Warn("[CLIENT->PROXY]: Error parsing Json into a position in ClientServer.OnReceive, JSON message was: " + AContext.DataFrame.ToString() + ". Error is: " + e.Message + e.StackTrace); } Proxy.sendSetPositionToServer(me,timestamp); // so far, the messages received only deal with user position updates }
private void OnReceive(UserContext context) { //TODO :: Logging? var client = context.Data as Client; if (client != null) { Request[] requests = client.GetRequests(); if (requests != null) { if (requests.Length > 0) { foreach (Request request in requests) { request.From = client; if (TryForward(request)) { //Only requests that are forwarded need to be tracked. client.Requests.TryAdd(request.Id, request); } else { client.Error(request, Message.ServerUnavailable); } } } } else { client.Error(null, Message.RequestMalformed); } } else { context.Send(String.Empty, true); //Close } }
/// <summary> /// Initializes a new instance of the <see cref="Context"/> class. /// </summary> public Context() { Buffer = new byte[_BufferSize]; this.UserContext = new UserContext(this); }
/// <summary> /// Sends an error message to the client who caused the error /// </summary> /// <param name="ErrorMessage">Details of the error</param> /// <param name="AContext">The user's connection context</param> private static void SendError(string ErrorMessage, UserContext AContext, ServerMessage message) { Log.Warn("Error Message: " + ErrorMessage); Message r = new Message(); r = new Message(); r.Type = ResponseType.Error; r.Data = new { Message = ErrorMessage }; //AContext.Send(JsonConvert.SerializeObject(r)); }
private void OnConnect(UserContext context) { //TODO :: Logging? }
private void OnSend(UserContext context) { //TODO :: Logging? }
public LoggingObject(long _lastupdate, UserContext _user, long _timetoprocess) { lastupdate = _lastupdate; timetoprocess = _timetoprocess; user = _user; }
/// <summary> /// when a message is sent from the proxy to one client, log it /// </summary> /// <param name="AContext"></param> public static void OnSend(UserContext AContext) { Log.Info("[PROXY->CLIENT]: Sent: " + UTF8Encoding.UTF8.GetString(AContext.SentData) + " to: " + AContext.ClientAddress.ToString()); }