Example #1
0
 private void Awake()
 {
     Instance = this;
     Notification.Subscribe("ServerMessage", ServerMessage);
     socketServer = new SocketServer();
     socketServer.StartSocketServer();//开启socket服务器
 }
 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();
            }
Example #4
0
        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);
            };
        }
Example #5
0
        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();
            }
        }
Example #6
0
 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;
     }
 }
        /// <summary>
        /// Initialize & start the server with the provided transports & serializer
        /// </summary>
        public bool StartServer()
        {
            if (_server == null)
            {
                _server = new ServerNetManager(config.TransportLayers, config.Serializer);
            }

            return(_server.Start());
        }
Example #8
0
        public void Update()
        {
            string cmd = m_Console.TryReadLine();

            ParseCommand(cmd);
            ServerNetManager.Update();
            Timer.Update();
            this.RemoveDeadClient();
            this.m_SysCombatRoom.Update();
        }
 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;
 }
Example #10
0
 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,
         });
     }
 }
Example #11
0
 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;
     }
 }
Example #12
0
        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);
            }
        }
Example #13
0
        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()
            }
        }
Example #14
0
 private void AwakeServer()
 {
     ServerNetManager.Bind("127.0.0.1", 8888);
 }