public void ChannelReceiveMessage(ServerBase server, PacketRecieveMessagerArgs e) { try { HttpHeader hader = (HttpHeader)e.Message; Properties ps = new Properties(); ps.FromHeaders(hader.Properties); switch (hader.RequestType) { case Protocol.COMMAND_GET: OnGet(e.Channel, hader.Url, ps); break; case Protocol.COMMAND_GETINFO: OnGetInfo(e.Channel, hader.Url, ps); break; case Protocol.COMMAND_REGISTER: OnRegister(e.Channel, hader.Url, ps); break; default: break; } } catch (Exception e_) { Utils.Error <TrackerServer>("<{0}> message process error {1}", e.Message, e_.Message); HttpHeader header = Protocol.GetResponse(new Properties()); header.Action = "500 " + e_.Message; e.Channel.Send(header); } }
public void ChannelReceiveMessage(ServerBase server, PacketRecieveMessagerArgs e) { try { HttpHeader hader = (HttpHeader)e.Message; Properties ps = new Properties(); ps.FromHeaders(hader.Properties); switch (hader.RequestType) { case Protocol.COMMAND_GET: OnGet(e.Channel, hader.Url, ps); break; case Protocol.COMMAND_GETINFO: OnGetInfo(e.Channel, hader.Url, ps); break; case Protocol.COMMAND_REGISTER: OnRegister(e.Channel, hader.Url, ps); break; default: break; } } catch (Exception e_) { Utils.Error<TrackerServer>("<{0}> message process error {1}", e.Message, e_.Message); HttpHeader header = Protocol.GetResponse(new Properties()); header.Action = "500 " + e_.Message; e.Channel.Send(header); } }
protected override void OnMessageReceive(PacketRecieveMessagerArgs e) { base.OnMessageReceive(e); if (e.Message is HttpExtend.HttpHeader) { HttpExtend.HttpHeader header = e.Message as HttpExtend.HttpHeader; if (header.Connection != null) { e.Channel["keep-alive"] = true; } header = new HttpHeader(); header.Action = "HTTP/1.1 200 OK"; header["Cache-Control"] = "private"; header.ContentType = "text/html; charset=utf-8"; header.Server = "Beetle/HttpExtend"; header.Connection = "keep-alive"; // FileReader reader = new FileReader("h:\\KendeSoft.htm"); // header.Length = reader.FileInfo.Length; HttpBody body = HttpPacket.InstanceBodyData(); body.Data.Encoding("<p>beetle http extend server!</p><p>Beetle是基于c#编写的高性能稳定的TCP通讯组件,它可以轻易支持成千上万长连接基础上进行密集的通讯交互. 组件提供了出色的性能支持和可靠的稳定性足以保证应用7x24无间断运行。为了更好地利用.Net的网络IO来处理数据,组件提供智能合并消息机制,组件调度器会根据当前负载情况对发向客户的多个消息进行合并处处理,从而减少IO操作达到更高的处理效能;通过测试在大量用户信息广播的情况轻易可以处理上百万的消息转发</p>", Encoding.UTF8); body.Eof = true; header.Length = body.Data.Count; e.Channel.Send(header); e.Channel.Send(body); //while (reader.Read()) //{ // HttpBody body = HttpPacket.InstanceBodyData(); // reader.ReadTo(body); // e.Channel.Send(body); //} } }
public void ChannelReceiveMessage(ServerBase server, PacketRecieveMessagerArgs e) { }
static void OnMessageReceive(PacketRecieveMessagerArgs e) { ProtobufAdapter adapter = (ProtobufAdapter)e.Message; Type type = adapter.Message.GetType(); switch (type.Name) { case "PlayerLoginRequestMsg": { PlayerLoginRequestMsg plm_cs = (PlayerLoginRequestMsg)adapter.Message; if (players_byname.ContainsKey(plm_cs.Name)) { PlayerLoginResultMsg plrm = new PlayerLoginResultMsg(); plrm.Result = LoginResult.Failed_AlreadyLogin; ProtobufAdapter.Send(e.Channel, plrm); } else { //get accout infomation PlayerSync ps = null; try { using (FileStream fs = new FileStream(string.Format(@"accounts/{0:s}.xml", plm_cs.Name), FileMode.Open)) { XmlSerializer formatter = new XmlSerializer(typeof(PlayerSync)); ps = formatter.Deserialize(fs) as PlayerSync; } } catch (FileNotFoundException) { ps = null; } catch (FileLoadException) { ps = null; } if (ps != null) { //check password if (ps.Password != plm_cs.Password) { PlayerLoginResultMsg plrm = new PlayerLoginResultMsg(); plrm.Result = LoginResult.Failed_Password; ProtobufAdapter.Send(e.Channel, plrm); break; } else { Player pl = new Player(plm_cs.Name, scene); pl.Channel = e.Channel; pl.ClientID = e.Channel.ClientID; //pl.Position = new Vector2((float)random.NextDouble() * 1000.0f + 100.0f, // (float)random.NextDouble() * 1000.0f + 100.0f); // pl.Speed = 200.0f; pl.Position = new Vector2(ps.Position[0], ps.Position[1]); pl.Speed = ps.Speed; pl.HP = ps.HP; pl.MaxHP = ps.MaxHP; pl.Name = ps.Name; pl.ATK = ps.ATK; pl.DEF = ps.DEF; //send succeed msg PlayerLoginResultMsg plrm = new PlayerLoginResultMsg(); plrm.Result = LoginResult.Succeed; plrm.ClientID = e.Channel.ClientID; ProtobufAdapter.Send(e.Channel, plrm); //add player to list lock (lockobject) { players_byname[pl.Name] = pl; players_byid[pl.ClientID] = pl; } PlayerLoginSelfMsg plms_sc = new PlayerLoginSelfMsg(); plms_sc.Position = new float[2]; plms_sc.ClientID = pl.ClientID; plms_sc.Name = pl.Name; plms_sc.Position[0] = pl.Position.X; plms_sc.Position[1] = pl.Position.Y; plms_sc.Speed = pl.Speed; plms_sc.ATK = pl.ATK; plms_sc.DEF = pl.DEF; plms_sc.HP = pl.HP; plms_sc.MaxHP = pl.MaxHP; ProtobufAdapter.Send(e.Channel, plms_sc); foreach (KeyValuePair<string, Player> sp in players_byname) { if (sp.Value.ClientID != pl.ClientID) { PlayerLoginMsg plm_sc = new PlayerLoginMsg(); plm_sc.Position = new float[2]; plm_sc.ClientID = sp.Value.ClientID; plm_sc.Name = sp.Value.Name; plm_sc.Position[0] = sp.Value.Position.X; plm_sc.Position[1] = sp.Value.Position.Y; plm_sc.Speed = sp.Value.Speed; plm_sc.ATK = sp.Value.ATK; plm_sc.DEF = sp.Value.DEF; plm_sc.HP = sp.Value.HP; plm_sc.MaxHP = sp.Value.MaxHP; ProtobufAdapter.Send(e.Channel, plm_sc); } } //send player login to other client foreach (KeyValuePair<string, Player> sp in players_byname) { if (sp.Value.ClientID != pl.ClientID) { PlayerLoginMsg plm_sc = new PlayerLoginMsg(); plm_sc.Position = new float[2]; plm_sc.ClientID = pl.ClientID; plm_sc.Name = pl.Name; plm_sc.Position[0] = pl.Position.X; plm_sc.Position[1] = pl.Position.Y; plm_sc.Speed = pl.Speed; plm_sc.ATK = pl.ATK; plm_sc.DEF = pl.DEF; plm_sc.HP = pl.HP; plm_sc.MaxHP = pl.MaxHP; ProtobufAdapter.Send(sp.Value.Channel, plm_sc); } } } } else { PlayerLoginResultMsg plrm = new PlayerLoginResultMsg(); plrm.Result = LoginResult.Failed_Notfound; ProtobufAdapter.Send(e.Channel, plrm); } } break; } case "PlayerTargetChanged": { PlayerTargetChanged msg_cs = (PlayerTargetChanged)adapter.Message; if (players_byid.ContainsKey(e.Channel.ClientID)) { Player player = players_byid[e.Channel.ClientID]; Console.WriteLine("Player {0:s} PlayerTargetChanged ", player.Name); if (player.State != CharacterState.Moving) { CorrectPlayerPoistionToOrigin(player); return; } player.Timer.Stop(); double dur = player.Timer.Duration; Vector2 dir = player.Position - player.PositionBackup; float s = dir.Length(); float time = s / player.Speed; if (time - (float)dur > 0.1) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("PTC : Player {0:s} error is {1:f}", player.Name, time - (float)dur); Console.ResetColor(); CorrectPlayerPoistionToOrigin(player); return; } player.Target = new Vector2(msg_cs.Target[0], msg_cs.Target[1]); player.Position = new Vector2(msg_cs.Position[0], msg_cs.Position[1]); player.PushPosition(); foreach (KeyValuePair<string, Player> sp in players_byname) { if (sp.Value.ClientID != player.ClientID) { PlayerTargetChanged msg_sc = new PlayerTargetChanged(); msg_sc.ClientID = player.ClientID; msg_sc.Target = new float[2]; msg_sc.Target[0] = player.Target.X; msg_sc.Target[1] = player.Target.Y; msg_sc.Position = new float[2]; msg_sc.Position[0] = player.Position.X; msg_sc.Position[1] = player.Position.Y; ProtobufAdapter.Send(sp.Value.Channel, msg_sc); } } player.Timer.Start(); } break; } case "PlayerMoveRequest": { PlayerMoveRequest msg_cs = (PlayerMoveRequest)adapter.Message; if (players_byid.ContainsKey(e.Channel.ClientID)) { Player player = players_byid[e.Channel.ClientID]; player.State = CharacterState.Moving; Vector2 p = new Vector2(msg_cs.Position[0], msg_cs.Position[1]); if (Vector2.Distance(p, player.Position) > 5.0f) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("PMR : Player {0:s}", player.Name); Console.ResetColor(); CorrectPlayerPoistionToOrigin(player); return; } player.Target = new Vector2(msg_cs.Target[0], msg_cs.Target[1]); Console.WriteLine("Player {0:s} PlayerMoveRequest ", player.Name); player.PushPosition(); //fixme: //verifying the position and target foreach (KeyValuePair<string, Player> sp in players_byname) { if (sp.Value.ClientID != player.ClientID) { PlayerMoveRequest msg_sc = new PlayerMoveRequest(); msg_sc.ClientID = player.ClientID; msg_sc.Target = new float[2]; msg_sc.Target[0] = player.Target.X; msg_sc.Target[1] = player.Target.Y; ProtobufAdapter.Send(sp.Value.Channel, msg_sc); } } player.Timer.Start(); } break; } case "PlayerStopRequest": { PlayerStopRequest msg_cs = (PlayerStopRequest)adapter.Message; if (players_byid.ContainsKey(e.Channel.ClientID)) { Player player = players_byid[e.Channel.ClientID]; Console.WriteLine("Player {0:s} PlayerStopRequest ", player.Name); if (player.State != CharacterState.Moving) { CorrectPlayerPoistionToOrigin(player); return; } player.Timer.Stop(); double dur = player.Timer.Duration; Vector2 dir = player.Target - player.PositionBackup; float s = dir.Length() - 15.0f; //扣除到达目标点误差 float time = s / player.Speed; if (time - (float)dur > 0.1) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("PSR : Player {0:s}", player.Name); Console.ResetColor(); CorrectPlayerPoistionToOrigin(player); return; } player.Direction = dir.X >= 0 ? 1 : -1; player.Position = player.Target; BroadcastPlayerPosition(player); } break; } case "PlayerPositioReport": { /*Messages.PlayerPositioReport msg_cs = (Messages.PlayerPositioReport)adapter.Message; if (players_byid.ContainsKey(e.Channel.ClientID)) { Player player = players_byid[e.Channel.ClientID]; if (player.State != CharacterState.Moving) { CorrectPlayerPoistionToOrigin(player); return; } double dur = player.Timer.GetTotalDuration(); Vector2 dir = player.Target - player.PositionBackup; float s = dir.Length(); float time = s / player.Speed; if (time < (float)dur) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("PPR : Player {0:s} ", player.Name); Console.ResetColor(); CorrectPlayerPoistionToOrigin(player); return; } player.Position = new Vector2(msg_cs.Position[0], msg_cs.Position[1]); BroadcastPlayerPosition(player); }*/ break; } } }