Example #1
0
        private void SendServerDataToAll(string receiveType)
        {
            GameNetPacket gameNetPacket = new GameNetPacket();

            gameNetPacket.name = receiveType;
            gameNetPacket.data = JsonUtility.ToJson(serverData);
            SendReceiveTo(JsonUtility.ToJson(gameNetPacket));
        }
Example #2
0
        public void Close()
        {
            open = false;


            //发送关闭房间信号
            GameNetPacket gameNetPacket = new GameNetPacket();

            gameNetPacket.name = "CloseServer";
            gameNetPacket.data = JsonUtility.ToJson(serverData);
            SendReceiveTo(JsonUtility.ToJson(gameNetPacket));

            //关闭服务器socket
            ServerSocket.Close();
            //关闭所有客户端的socket
            foreach (var item in ClientSockets)
            {
                item.Close();
            }
        }
Example #3
0
        public GameServer(ServerData serverData)
        {
            this.serverData = serverData;

            open = true;
            //服务器初始化
            // 侦听所有网络客户接口的客活动
            //使用指定的地址簇协议、套接字类型和通信协议
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            BindServerSocket(minPort);
            //设定最多玩家数量
            ServerSocket.Listen(this.serverData.maxNumber);

            // string ipStr = ipAddress.ToString();
            Debug.Log("服务器初始化完成");
            SendServerDataToAll("UpdateServer");

            //接受广播信息
            Socket     receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint sep           = BindReceiverSocket(receiveSocket, radiateMinPort);
            EndPoint   ep            = (EndPoint)sep;



            //接收广播线程
            new Thread(() =>
            {
                while (open)
                {
                    byte[] message = new byte[1024];            //设置缓冲数据流
                    receiveSocket.ReceiveFrom(message, ref ep); //接收数据,并确把数据设置到缓冲流里面
                    string data = Encoding.Unicode.GetString(message).TrimEnd('\u0000');

                    GameNetPacket receiveData = JsonUtility.FromJson <GameNetPacket>(data);

                    switch (receiveData.name)
                    {
                    case "Is Room?":
                        GameNetPacket gameNetPacket = new GameNetPacket();
                        gameNetPacket.name          = "NewServer";
                        gameNetPacket.data          = JsonUtility.ToJson(serverData);
                        SendReceiveTo(JsonUtility.ToJson(gameNetPacket));
                        break;

                    default:
                        break;
                    }
                }
            }).Start();



            //监听客户端连接线程
            new Thread(() =>
            {
                while (open)
                {
                    try
                    {
                        //与客户的排队建立连接(堵塞)
                        Socket socket = ServerSocket.Accept();

                        LoopClientMessage(socket);

                        Debug.Log("连接成功");
                        ////进行广播更新房间信息
                        SendServerDataToAll("UpdateServer");
                    }
                    catch (Exception)
                    {
                        Debug.Log("停止等待客户端连接");
                        open = false;
                    }
                }
            }).Start();
        }