public Service(int port) { _port = port; _connectionManager = new ConnectionManager(port); _clientManager = new ClientManager(_connectionManager); }
/// <summary> /// 接收客户端发来的信息 /// </summary> /// <param name="obj"></param> void ReceMsg(object obj) { Socket client; byte[] mag = new byte[1024 * 1024 * 5]; int msgLength; while (true) { client = obj as Socket; msgLength = client.Receive(mag); string sqlconn; //内存流 MemoryStream stream = new MemoryStream(mag, 0, msgLength); //二进制与Object 类的转换 BinaryFormatter fomatter = new BinaryFormatter(); //强制转换并且接收她 var protocolqq = fomatter.Deserialize(stream) as Protocol.ProtocolQQ; switch (protocolqq.mode) { //用户登录 case 0: switch (protocolqq.ope) { //验证登录 case 0: var userLogin = protocolqq.data as Protocol.UserLogin; //弄错了应该是ID,但是我也并没有很想改转来,所以就不改了。 string name = userLogin.Name; string pwd = userLogin.Pwd; //数据库操作语句 sqlconn = "select count(*) from tb_User where ID= '" + name + "'" + "and Pwd = '" + pwd + " '"; //新建一个用户登录返回类 ReturnLogin IsLogin = new ReturnLogin(); //如果num==1则数据库中有该用户 int num = DataOperator.ESSql(sqlconn); if (num != 0) { ClientManager.AddClient(name, client); //判断是否重复登录该用户 if (ClientManager.reLogin == true) { IsLogin.ResultLogin = false; client.Send(SendMsg(0, 1, IsLogin)); //关闭该字 string s_1 = "用户:" + client.RemoteEndPoint.ToString() + "下线。" + "\r\n"; ShowMsg(s_1); receThread.Abort(); while (receThread.ThreadState == ThreadState.Aborted) { Thread.Sleep(100); } break; } else { IsLogin.ResultLogin = true; User user = new User(); user.ID = name; //数据库更新用户记住密码,自动登录操作的操作 sqlconn = "update tb_User set Remember = " + userLogin.Remember + ",AutoLogin="******" where ID = '" + name + " '"; DataOperator.ENQSql(sqlconn); //访问数据库,得到好友列表 List <Friend> friends = new List <Friend>(); sqlconn = "select NickName, HeadID,Sign from tb_User where ID='" + name + "'"; //查询用户信息和用户好友信息的数据库查询语句 SqlDataReader dataReader = DataOperator.GetDataReader(sqlconn); //一直读 if (dataReader.Read()) { if (!(dataReader["NickName"] is DBNull)) { user.NickName = dataReader["NickName"].ToString(); } user.HeadId = Convert.ToInt32(dataReader["HeadID"]); user.Sign = dataReader["Sign"].ToString(); } //加载好友的SQL语句 sqlconn = "select FriendID,NickName,HeadID,Flag from tb_User,tb_Friend where tb_Friend.HostID='" + name + "'" + " and tb_User.ID=tb_Friend.FriendID"; dataReader = DataOperator.GetDataReader(sqlconn); while (dataReader.Read()) { Friend friend = new Friend(); friend.HeadID = Convert.ToInt32(dataReader["HeadID"]); //????? friend.ID = Convert.ToString(dataReader["FriendID"]); friend.NickName = dataReader["NickName"].ToString(); friends.Add(friend); } //关闭读取器 dataReader.Close(); //关闭数据库连接 DataOperator.conn.Close(); IsLogin.Friends = friends; IsLogin.GetUser = user; client.Send(SendMsg(0, 0, IsLogin)); } } else { IsLogin.ResultLogin = false; client.Send(SendMsg(0, 0, IsLogin)); } break; //注册用户 case 1: //不太对得起我自己---这个只允许注册100个 Random rand = new Random(); int v; v = rand.Next(0, 101); var reger = protocolqq.data as Protocol.Regr; reger.ID = Convert.ToString(20000 + v); sqlconn = "Select ID from tb_User Where ID = '" + reger.ID.Trim() + "'"; while (true) { if (DataOperator.ESSql(sqlconn).ToString() != reger.ID) { break; } else { v = rand.Next(0, 100); reger.ID = Convert.ToString(20000 + v); sqlconn = "Select ID from tb_User Where ID ='" + reger.ID + "'"; } } sqlconn = string.Format("insert into tb_User(ID,Pwd, NickName) values('{0}', '{1}','{2}')", reger.ID.Trim(), reger.PSW, reger.NickName); int num_ = DataOperator.ENQSql(sqlconn); if (num_ == 1) { client.Send(SendMsg(0, 2, reger)); } else { reger.ID = ""; client.Send(SendMsg(0, 2, reger)); } break; //忘记密码---验证账号是否正确 case 2: //忘记密码和登录时的协议我们采用一样的 var fuser = protocolqq.data as Protocol.UserLogin; string name_ = fuser.Name.Trim(); //数据库操作语句 sqlconn = "select ID from tb_User where ID= '" + name_ + "'"; int num_1 = DataOperator.ESSql(sqlconn); if (num_1 != 0) { client.Send(SendMsg(0, 3, fuser)); } else { fuser.Name = ""; client.Send(SendMsg(0, 3, fuser)); } break; //忘记密码---修改密码 case 3: var ffuer = protocolqq.data as UserLogin; //修改密码的数据库语句 sqlconn = "update tb_User set Pwd= '" + ffuer.Pwd.Trim() + "'" + "where ID= '" + ffuer.Name + "'"; int num_2 = DataOperator.ENQSql(sqlconn); if (num_2 != 0) { client.Send(SendMsg(0, 4, ffuer)); } else { ffuer.Name = ""; client.Send(SendMsg(0, 4, ffuer)); } break; //用户勾选密码 case 4: break; } break; //用户聊天 case 1: switch (protocolqq.ope) { //普通聊天 case 0: var utu = protocolqq.data as Protocol.UTU; var str = utu.Msg as Str; utu.ReceID = utu.ReceID.Trim(); if (ClientManager.CheckingUser(utu.ReceID)) { ClientManager.SendMsg(mag, ClientManager.client); } //此处的MessageTypeId为1,表示聊天消息;MessageState为0,表示消息未读 //把聊天记录插入数据库 sqlconn = string.Format("INSERT INTO tb_Message (FromUserID, ToUserID, Message, MessageTypeID, MessageState,MessageTime) VALUES ('{0}','{1}','{2}',{3},{4},'{5}')", utu.SendID, utu.ReceID, str.Message, 1, 0, utu.Time); int num = DataOperator.ENQSql(sqlconn); if (num != 1) { //发给客户端 MessageBox.Show("用户:" + utu.SendID + "向用户:" + utu.ReceID + "发送消息失败!" + "/r/n"); } break; // 发送文件 case 1: break; //发送图片 case 2: break; //发送抖屏 case 3: break; } break; //用户离线 case 3: //关闭套接字且移除用户 string s_0 = "用户:" + client.RemoteEndPoint.ToString() + "下线。" + "\r\n"; ClientManager.Clear(client); ShowMsg(s_0); receThread.Abort(); while (receThread.ThreadState == ThreadState.Aborted) { Thread.Sleep(100); } break; } } }
public void ProcessCommandCallback(object obj) { int activeLine = (int)((ParamObject)obj).Param[0]; string command = (string)((ParamObject)obj).Param[1]; Command fullCommand = Server.CommandProcessor.ParseCommand(command); string fullArgs = CommandProcessor.JoinArgs(fullCommand.CommandArgs.ToArray()); switch (fullCommand.CommandArgs[0].ToLower()) { case "/help": { DisplayHelp(); } break; case "/clear": { mainUI.ClearCommands(); } break; case "/global": { Messenger.GlobalMsg(fullArgs, Text.White); mainUI.AddCommandLine("Global: " + fullArgs); } break; case "/masskick": { foreach (Client i in ClientManager.GetClients()) { if (i.IsPlaying() && Ranks.IsDisallowed(i, Enums.Rank.Moniter)) { Messenger.GlobalMsg(i.Player.Name + " has been kicked by the server!", Text.White); Messenger.AlertMsg(i, "You have been kicked by the server!"); } } mainUI.AddCommandLine("Everyone has been kicked."); } break; case "/dumpstats": { Statistics.PacketStatistics.DumpStatistics(); mainUI.AddCommandLine("Packet statistics dumped to database."); } break; case "/clearstats": { Statistics.PacketStatistics.ClearStatistics(); mainUI.AddCommandLine("Packet statistics cleared."); } break; case "/masswarp": { if (fullCommand.CommandArgs.Count == 4) { int map = fullCommand.CommandArgs[1].ToInt(-1); int x = fullCommand.CommandArgs[2].ToInt(-1); int y = fullCommand.CommandArgs[3].ToInt(-1); if (map <= 0) { mainUI.AddCommandLine("Invalid Map."); break; } else if (x == -1) { mainUI.AddCommandLine("Invalid X coordinate."); break; } else if (y == -1) { mainUI.AddCommandLine("Invalid Y coordinate."); break; } // TODO: Mass Warp //if (x > MapManager.Maps[map].MaxX) { // mainUI.AddCommandLine("Invalid X coordinate."); // break; //} //if (y > MapManager.Maps[map].MaxY) { // mainUI.AddCommandLine("Invalid Y coordinate."); // break; //} foreach (Client i in ClientManager.GetClients()) { if (i.IsPlaying() && Ranks.IsDisallowed(i, Enums.Rank.Moniter)) { Messenger.GlobalMsg("The server has warped everyone!", Text.White); Messenger.PlayerWarp(i, map, x, y); } } mainUI.AddCommandLine("Everyone has been warped."); } else { mainUI.AddCommandLine("Invalid arguments."); } } break; case "/kick": { if (fullCommand.CommandArgs.Count == 2) { Client client = ClientManager.FindClient(fullCommand.CommandArgs[1]); if (client == null) { mainUI.AddCommandLine("Player is offline."); } else { Messenger.GlobalMsg(client.Player.Name + " has been kicked by the server!", Text.White); Messenger.AlertMsg(client, "You have been kicked by the server!"); mainUI.AddCommandLine(client.Player.Name + " has been kicked!"); } } else { mainUI.AddCommandLine("Invalid arguments."); } } break; case "/warp": { if (fullCommand.CommandArgs.Count == 5) { Client client = ClientManager.FindClient(fullCommand.CommandArgs[1]); if (client == null) { mainUI.AddCommandLine("Player is offline."); } else { int mapNum = fullCommand.CommandArgs[2].ToInt(-1); int x = fullCommand.CommandArgs[3].ToInt(-1); int y = fullCommand.CommandArgs[4].ToInt(-1); if (mapNum <= 0) { mainUI.AddCommandLine("Invalid Map."); break; } else if (x == -1) { mainUI.AddCommandLine("Invalid X coordinate."); break; } else if (y == -1) { mainUI.AddCommandLine("Invalid Y coordinate."); break; } IMap map; if (MapManager.IsMapActive(MapManager.GenerateMapID(mapNum))) { map = MapManager.RetrieveActiveMap(MapManager.GenerateMapID(mapNum)); } else { using (Database.DatabaseConnection dbConnection = new Database.DatabaseConnection(Database.DatabaseID.Data)) { map = MapManager.LoadStandardMap(dbConnection, MapManager.GenerateMapID(mapNum)); } } if (x > map.MaxX) { mainUI.AddCommandLine("Invalid X coordinate."); break; } if (y > map.MaxY) { mainUI.AddCommandLine("Invalid Y coordinate."); break; } Messenger.PlayerMsg(client, "You have been warped by the server!", Text.White); Messenger.PlayerWarp(client, mapNum, x, y); mainUI.AddCommandLine(client.Player.Name + " has been warped."); } } else { mainUI.AddCommandLine("Invalid arguments."); } } break; case "/mapmsg": { if (fullCommand.CommandArgs.Count == 3) { string map = fullCommand.CommandArgs[1]; // Check if the map is active if (!MapManager.IsMapActive(map)) { mainUI.AddCommandLine("Invalid Map."); break; } Messenger.MapMsg(map, fullCommand.CommandArgs[2], Text.DarkGrey); mainUI.AddCommandLine("Map Msg (Map " + map.ToString() + "): " + fullCommand.CommandArgs[2]); } else { mainUI.AddCommandLine("Invalid arguments."); } } break; case "/reloadscripts": { Scripting.ScriptManager.Reload(); mainUI.AddCommandLine("Scripts reloaded."); } break; case "/players": { string players = ""; int count = 0; foreach (Client i in ClientManager.GetClients()) { if (i.IsPlaying()) { count++; players += i.Player.Name + "\r\n"; } } mainUI.AddCommandLine("Players online: \r\n" + players); mainUI.AddCommandLine("There are " + count.ToString() + " players online"); } break; case "/test": { //Email.Email.SendEmail("test"); //mainUI.AddCommandLine("Mail sent!"); //mainUI.AddCommandLine("There are currently no benchmarking tests"); //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); //watch.Start(); //MapGeneralInfo genInfo = MapManager.RetrieveMapGeneralInfo(10); //watch.Stop(); //mainUI.AddCommandLine("Elapsed, New: " + watch.Elapsed.ToString()); //watch.Reset(); //watch.Start(); //Map map = MapManager.LoadMap(10); //watch.Stop(); //mainUI.AddCommandLine("Elapsed, Old: " + watch.Elapsed.ToString()); //mainUI.AddCommandLine("Name: " + genInfo.Name); } break; case "/finditem": { int itemsFound = 0; for (int i = 0; i < Server.Items.ItemManager.Items.MaxItems; i++) { if (ItemManager.Items[i].Name.ToLower().StartsWith(fullCommand.CommandArgs[1].ToLower())) { mainUI.AddCommandLine(ItemManager.Items[i].Name + "'s number is " + i.ToString()); itemsFound++; //return; } } if (itemsFound == 0) { mainUI.AddCommandLine("Unable to find an item that starts with '" + fullCommand.CommandArgs[1] + "'"); } } break; case "/finditemc": { int itemsFound = 0; for (int i = 0; i < Server.Items.ItemManager.Items.MaxItems; i++) { if (ItemManager.Items[i].Name.ToLower().Contains(fullCommand.CommandArgs[1].ToLower())) { mainUI.AddCommandLine(ItemManager.Items[i].Name + "'s number is " + i.ToString()); itemsFound++; //return; } } if (itemsFound == 0) { mainUI.AddCommandLine("Unable to find an item that starts with '" + fullCommand.CommandArgs[1] + "'"); } } break; case "/calcwm": { mainUI.AddCommandLine("Factorial: " + Server.Math.CalculateFactorial(fullCommand.CommandArgs[1].ToInt()).ToString("R")); } break; case "/gmmode": { Globals.GMOnly = !Globals.GMOnly; mainUI.AddCommandLine("GM Only Mode Active: " + Globals.GMOnly); } break; default: { Scripting.ScriptManager.InvokeSub("ProcessServerCommand", mainUI, fullCommand, fullArgs); } break; } mainUI.CommandComplete(activeLine, command); }
void Authentication(MessageReceivedEventArgs e) { using (Message message = e.GetMessage() as Message) { using (DarkRiftReader reader = message.GetReader()) { var login = reader.ReadString(); var password = reader.ReadString(); var avatarType = reader.ReadUInt16(); var authResult = DB.Count("SELECT COUNT(*) FROM users WHERE login = @login AND password = @password", new Dictionary <string, string> { { "@login", login }, { "@password", password }, }); if (authResult > 0) { // Сохраняем данные для нового игрока players[e.Client].Name = login; players[e.Client].Session = Guid.NewGuid().ToString("n").Substring(0, 20); players[e.Client].Avatar = avatarType == 0 ? AvatarType.Neru : (avatarType == 1 ? AvatarType.Kira : AvatarType.Miku); // Уведомляем всех пользователей о новом игроке using (DarkRiftWriter newPlayerWriter = DarkRiftWriter.Create()) { newPlayerWriter.Write(""); newPlayerWriter.Write(players[e.Client].ID); newPlayerWriter.Write(players[e.Client].Name); newPlayerWriter.Write(players[e.Client].Avatar); using (Message newPlayerMessage = Message.Create(Tags.SpawnNewPlayer, newPlayerWriter)) { foreach (IClient client in ClientManager.GetAllClients().Where(x => x != e.Client)) { client.SendMessage(newPlayerMessage, SendMode.Reliable); } } } // Уведомляем нового игрока о удачной авторизации using (DarkRiftWriter playerWriter = DarkRiftWriter.Create()) { playerWriter.Write(players[e.Client].Session); foreach (Player player in players.Values) { playerWriter.Write(player.ID); playerWriter.Write(player.Name); playerWriter.Write(player.Avatar); } using (Message playerMessage = Message.Create(Tags.SpawnCurrentPlayer, playerWriter)) e.Client.SendMessage(playerMessage, SendMode.Reliable); } } else { // Уведомляем нового игрока о НЕ удачной авторизации using (DarkRiftWriter playerWriter = DarkRiftWriter.Create()) { playerWriter.Write(players[e.Client].ID); using (Message playerMessage = Message.Create(Tags.AuthorizationFail, playerWriter)) e.Client.SendMessage(playerMessage, SendMode.Reliable); } } } } }
private void OnUserAvatarUpdated(User user) { var avatarNotification = new EntityNotification <Avatar>(user.Avatar, NotificationType.Update); ClientManager.SendMessageToClients(avatarNotification); }
private void OnUserConnectionUpdated(User user) { var userNotification = new EntityNotification <ConnectionStatus>(user.ConnectionStatus, NotificationType.Update); ClientManager.SendMessageToClients(userNotification); }
private void OnUserAdded(object sender, EntityChangedEventArgs <User> e) { var userNotification = new EntityNotification <User>(e.Entity, NotificationType.Create); ClientManager.SendMessageToClients(userNotification); }
public ServerMessageProcessor(ClientManager manager, MayKhach client) { this.clientManager = manager; this.client = client; Response = new List <MessageBase>(); }