private void SendServerDataToAll(string receiveType) { GameNetPacket gameNetPacket = new GameNetPacket(); gameNetPacket.name = receiveType; gameNetPacket.data = JsonUtility.ToJson(serverData); SendReceiveTo(JsonUtility.ToJson(gameNetPacket)); }
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(); } }
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(); }