using NetMQ; using NetMQ.Sockets; using System; using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace GameServer { internal class Program { private static ConcurrentDictionary clients = new ConcurrentDictionary(); static void Main(string[] args) { Task.Run(RunServer); } static async Task RunServer() { int port = 12345; TcpListener listener = new TcpListener(IPAddress.Any, port); listener.Start(); Console.WriteLine($"Server listening on port {port}"); while (true) { TcpClient client = await listener.AcceptTcpClientAsync(); _ = HandleClientAsync(client); } } static async Task HandleClientAsync(TcpClient client) { using (NetworkStream stream = client.GetStream()) { string clientAddress = client.Client.RemoteEndPoint.ToString(); clients.TryAdd(clientAddress, client); var user = User.Create(client, stream); Console.WriteLine($"Client connected: {clientAddress}"); byte[] buffer = new byte[4096]; byte[] response = null; int bytesRead; while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) { string data = Encoding.UTF8.GetString(buffer, 0, bytesRead); //Console.WriteLine($"Received from {clientAddress}: {data}"); string[] commands = data.Split(" "); if (commands.Length > 0) { switch (commands[0]) { case "test": Console.WriteLine($"测试 {commands[1]}"); break; case "regist"://注册临时身份 user.Regist(commands[1]); Console.WriteLine($"注册 {commands[1]}"); break; case "getusers"://获取用户列表 response = Encoding.UTF8.GetBytes(string.Format("getusers {0}", User.GetUsers(user.userId))); await stream.WriteAsync(response, 0, response.Length); break; case "createroom"://创建房间 Console.WriteLine($"创建房间 {commands[1]}"); var room = Room.Create(commands[1], user.userId); response = Encoding.UTF8.GetBytes(string.Format("createroom {0},{1},{2}", room.roomId, room.roomname, room.creater)); Console.WriteLine("订阅:" + room.roomId.ToString()); await stream.WriteAsync(response, 0, response.Length); break; case "getrooms"://获取所有房间 response = Encoding.UTF8.GetBytes(string.Format("getrooms {0}", Room.GetRooms())); await stream.WriteAsync(response, 0, response.Length); break; case "getownrooms"://获取自己创建的房间 response = Encoding.UTF8.GetBytes(string.Format("getownrooms {0}", Room.GetRooms(user.userId))); await stream.WriteAsync(response, 0, response.Length); break; case "joinroom"://加入房间 string join = Room.JoinRoom(user, ulong.Parse(commands[1])); if (!string.IsNullOrWhiteSpace(join)) { response = Encoding.UTF8.GetBytes(string.Format("joinroom {0}", join)); await stream.WriteAsync(response, 0, response.Length); } break; case "getroomusers"://获取所在房间的用户 response = Encoding.UTF8.GetBytes(string.Format("getroomusers {0}", User.GetUsers(user.userId, user.roomId))); await stream.WriteAsync(response, 0, response.Length); break; case "joins"://批量加入房间 List users = Room.BatchJoinRoom(ulong.Parse(commands[1])); for (int i = 0; i < users.Count; i++) { User.Send2User(users[i].userId, string.Format("send2user joins")); } //response = Encoding.UTF8.GetBytes(string.Format("joins {0}", joins)); //await stream.WriteAsync(response, 0, response.Length); break; case "leaveroom"://离开房间 string leave = Room.LeaveRoom(user); if (!string.IsNullOrWhiteSpace(leave)) { response = Encoding.UTF8.GetBytes(string.Format("leaveroom {0}", leave)); await stream.WriteAsync(response, 0, response.Length); } Console.WriteLine($"离开房间 {leave}"); break; case "closeroom"://关闭房间 string close = Room.CloseRoom(ulong.Parse(commands[1])); if (!string.IsNullOrWhiteSpace(close)) { response = Encoding.UTF8.GetBytes(string.Format("closeroom {0}", close)); Console.WriteLine("退订:" + close); await stream.WriteAsync(response, 0, response.Length); } break; case "send2user"://对用户说 User.Send2User(ulong.Parse(commands[1]), string.Format("send2user {0}", commands[2])); break; case "send2room"://对房间说 User.Send2Room(user.userId, user.roomId, string.Format("send2room {0}", commands[1])); Console.WriteLine($"send2room {commands[1]}"); break; case "send2world"://对世界说 User.Send2World(user, string.Format("send2world {0}", commands[1])); break; case "player"://对player说 User.Send2Player(user.userId, user.roomId, string.Format("player {0}", commands[1])); break; } } } clients.TryRemove(clientAddress, out _); user.OffLine(); Console.WriteLine($"Client disconnected: {clientAddress}"); } client.Close(); } } }