public void PlayerQuit(Socket cfd) { if (m_Players.ContainsKey(cfd)) { var quitPlayer = m_Players[cfd]; quitPlayer.isQuit = true; ServerNetManager.Send(quitPlayer.cfd, (Int16)ProtocType.CombatResult, new CombatResult { WinnerId = 0, }); m_OnlineCount--; if (m_OnlineCount <= 1) { foreach (var pair in m_Players) { var player = pair.Value; if (player.id != quitPlayer.id) { player.isQuit = true; ServerNetManager.Send(player.cfd, (Int16)ProtocType.CombatResult, new CombatResult { WinnerId = player.id, }); m_OnlineCount--; } } } } }
private void SendFrame() { // 打包帧包 var frame = new FramePackage { Seq = m_NextSeq, }; m_NextSeq++; foreach (var cmd in m_Commands) { frame.Data.Add(new FramePackage.Types.Command { PlayerId = cmd.playerId, CommandId = cmd.cmdId, Parameter = cmd.parm, }); } // 广播帧包 foreach (var pair in m_Players) { var player = pair.Value; if (!player.isQuit) { ServerNetManager.Send(player.cfd, (Int16)ProtocType.FramePackage, frame); } } // 清空缓存的命令 m_Commands.Clear(); }
static void Main(string[] args) { LoginListener.instance.AddListener(delegate(Socket cfd, GameProto.Login login) { Console.WriteLine(String.Format("Check Account = {0}", login.Account)); ServerNetManager.Send(cfd, (Int16)ProtocType.Login, login); ServerNetManager.Send(cfd, (Int16)ProtocType.LoginRes, new GameProto.LoginRes { IsMatch = true, }); }); ServerNetManager.Bind("127.0.0.1", 8888); ConsoleAsync console = new ConsoleAsync(); bool isShutdown = false; while (!isShutdown) { string cmd = console.TryReadLine(); if (cmd != null) { if (cmd == "exit") { isShutdown = true; } } ServerNetManager.Update(); } }
private void ListenProtoc() { CombatMatchListener.instance.AddListener(this.CombatMatch); HeartbeatListener.instance.AddListener(this.AnswerHeartBeat); CancelCombatMatchListener.instance.AddListener(this.CancelCombatMatch); QuitCombatListener.instance.AddListener(this.QuitCombat); ServerNetManager.onAccept += delegate(Socket cfd) { if (m_Clients.ContainsKey(cfd)) { Console.WriteLine("client has been in online list."); return; } if (m_Clients.Count >= GameServer.MAX_CLIENT_COUNT) { Console.WriteLine("Server has been full."); ServerNetManager.Send(cfd, (Int16)ProtocType.ServerOverload, new ServerOverload { }); return; } Console.WriteLine("One client connect to server."); m_Clients.Add(cfd, new Client { cfd = cfd, lastBeat = Timer.time }); }; ServerNetManager.onClose += delegate(Socket cfd) { Console.WriteLine("One client closing."); m_Clients.Remove(cfd); }; }
private void AnswerHeartBeat(Socket cfd, Heartbeat heartbeat) { ServerNetManager.Send(cfd, (Int16)ProtocType.Heartbeat, new Heartbeat()); if (m_Clients.ContainsKey(cfd)) { m_Clients[cfd].lastBeat = Timer.time; } }
public void Clear() { foreach (var pair in m_Players) { var player = pair.Value; ServerNetManager.Send(player.cfd, (Int16)ProtocType.CombatResult, new CombatResult { }); } m_Players.Clear(); m_NextId = 1; }
public void CancelCombatMatch(Socket cfd) { /* 若匹配队列没有该玩家,证明已经有匹配结果,不需要额外发送别的信息。 */ if (m_MatchingSet.Contains(cfd)) { Console.WriteLine("One client cancel matching."); m_MatchingSet.Remove(cfd); ServerNetManager.Send(cfd, (Int16)ProtocType.CombatMatchRes, new CombatMatchRes { RoomId = CommonConst.ROOM_ERROR, }); } }
public void PlayerWin(Socket cfd) { if (m_Players.ContainsKey(cfd)) { Int32 winnerId = m_Players[cfd].id; foreach (var pair in m_Players) { var player = pair.Value; player.isQuit = true; ServerNetManager.Send(player.cfd, (Int16)ProtocType.CombatResult, new CombatResult { WinnerId = winnerId, }); } m_NextId = 1; } }
public void Matching() { /* 两两匹配 */ var resList = new List <MatchingResult>(); var players = new List <Socket>(); foreach (var player in m_MatchingSet) { players.Add(player); if (players.Count >= CombatRoom.MAX_PLAYER) { var res = new MatchingResult { roomId = m_RoomAllocator.GetId(), players = players, }; players = new List <Socket>(); resList.Add(res); } } /* 创建房间 */ foreach (var res in resList) { var room = new CombatRoom(res.roomId); Int32 seed = m_Random.Next(); Int32 playerId = 1; foreach (var player in res.players) { m_MatchingSet.Remove(player); room.AddPlayer(player); m_MapPlayerToRoom.Add(player, res.roomId); ServerNetManager.Send(player, (Int16)ProtocType.CombatMatchRes, new CombatMatchRes { RoomId = res.roomId, Seed = seed, PlayerCount = CombatRoom.MAX_PLAYER, SelfId = playerId, }); playerId++; } m_RoomSet.Add(res.roomId, room); } }
/// <summary> /// Send a packet to the given client on a given channel /// </summary> public void Send(Connection receiver, int channel, object packet) { _server.Send(receiver, packet, channel); }
public static void Main(string[] args) { /* * First we initialize our server by creating a HybridNetworkLib.Server.ServerNetManager * * This example passes in an array of transports, composed of the built-in Telepathy & MiniUDP * We're also using the built-in CobblestoneSerializer * * Important note: For any server and client to be connected, they must pass in the exact same transport layers & ports * * new ServerNetManager(ITransportLayer[], IObjectSerializer); */ var server = new ServerNetManager ( new [] { new TransportLayerInfo(new TelepathyTransport(), 1337), new TransportLayerInfo(new MiniUdpTransport(), 1447) }, new CobblestoneSerializer() ); /* * All packets must be registered with the serializer before being sent. * * It's important they're registered in the *same* order on both the server & client(s). */ server.RegisterPacket(typeof(PacketMessage)); /* * Subscribe this method to incoming packets */ server.Subscribe((packet, sender) => { if (packet is PacketMessage message) { Logger.Log(sender.Address + ": " + message.text); } }); /* * Starts the server on the corresponding ports for each transport layer. */ server.Start(); /* * A simple forever-loop for this console application */ while (true) { if (Console.KeyAvailable) { var key = Console.ReadKey(true).Key; if (key == ConsoleKey.A) { /* * Send a packet on channel#0, which in our case is Telepathy */ server.Send(new PacketMessage("Hey there, clients!"), 0); } else if (key == ConsoleKey.B) { /* * Send a packet on channel#1, which in our case is MiniUDP */ server.Send(new PacketMessage("I'm gonna do what's called a pro-gamer move..."), 1); } else if (key == ConsoleKey.Q) { /* * Stop the server before quitting */ server.Stop(); break; } } /* * Update checks for incoming connections & packets. */ server.Update(); Thread.Sleep(16); // Simple ~60fps loop. If using Unity, make sure the code above is in FixedUpdate() } }