diff options
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetServer.cs')
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetServer.cs | 113 |
1 files changed, 90 insertions, 23 deletions
diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs b/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs index 3705318..3e09a4c 100644 --- a/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs +++ b/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs @@ -11,10 +11,12 @@ namespace InnerNet { public class InnerNetServer : DestroyableSingleton<InnerNetServer> { - public const int MaxPlayers = 10; + // 单局最大玩家数 + public const int MaxPlayers = 10; public bool Running; + // 是本地游戏的话id是这个32 public const int LocalGameId = 32; private const int InvalidHost = -1; @@ -25,13 +27,23 @@ namespace InnerNet public int Port = 22023; - [SerializeField] + /* + public enum GameStates : byte + { + NotStarted, + Started, + Ended, + Destroyed + } + */ + [SerializeField] private GameStates GameState; private NetworkConnectionListener listener; private List<InnerNetServer.Player> Clients = new List<InnerNetServer.Player>(); + // 某个玩家的连接 protected class Player { private static int IdCount = 1; @@ -49,25 +61,32 @@ namespace InnerNet } } + // 销毁这个单例 public override void OnDestroy() { this.StopServer(); base.OnDestroy(); } + // 开启本地服务器,监听端口 + // 在HostGameButton.CoStartGame中调用 public void StartAsServer() { if (this.listener != null) { this.StopServer(); } + this.GameState = GameStates.NotStarted; + this.listener = new UdpConnectionListener(new IPEndPoint(IPAddress.Any, this.Port), IPMode.IPv4, null); this.listener.NewConnection += this.OnServerConnect; this.listener.Start(); + this.Running = true; } + // 停止服务器 public void StopServer() { this.HostId = -1; @@ -91,6 +110,7 @@ namespace InnerNet return Constants.CompatVersions.Contains(version); } + // 收到某个玩家的连接 private void OnServerConnect(NewConnectionEventArgs evt) { MessageReader handshakeData = evt.HandshakeData; @@ -112,7 +132,9 @@ namespace InnerNet handshakeData.Recycle(); } InnerNetServer.Player client = new InnerNetServer.Player(evt.Connection); + Debug.Log(string.Format("Client {0} added: {1}", client.Id, evt.Connection.EndPoint)); + UdpConnection udpConnection = (UdpConnection)evt.Connection; udpConnection.KeepAliveInterval = 1500; udpConnection.DisconnectTimeout = 6000; @@ -169,75 +191,111 @@ namespace InnerNet } } - private void HandleMessage(InnerNetServer.Player client, MessageReader reader, SendOption sendOption) + /* + public static class Tags + { + public const byte HostGame = 0; + + public const byte JoinGame = 1; + + public const byte StartGame = 2; + + public const byte RemoveGame = 3; + + public const byte RemovePlayer = 4; + + public const byte GameData = 5; + + public const byte GameDataTo = 6; + + public const byte JoinedGame = 7; + + public const byte EndGame = 8; + + public const byte GetGameList = 9; + + public const byte AlterGame = 10; + + public const byte KickPlayer = 11; + + public const byte WaitForHost = 12; + + public const byte Redirect = 13; + } + */ + + // 处理收到的消息,在网络线程执行 + // reader是数据 + private void HandleMessage(InnerNetServer.Player client, MessageReader reader, SendOption sendOption) { - switch (reader.Tag) + switch (reader.Tag) { - case 0: + case 0: // HostGame { Debug.Log("Server got host game"); MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); - messageWriter.StartMessage(0); - messageWriter.Write(32); + messageWriter.StartMessage(0); // tag + messageWriter.Write(LocalGameId); // gameId messageWriter.EndMessage(); client.Connection.Send(messageWriter); messageWriter.Recycle(); return; } - case 1: + case 1: // JoinGame { Debug.Log("Server got join game"); - if (reader.ReadInt32() == 32) + if (reader.ReadInt32() == LocalGameId) { this.JoinGame(client); return; } MessageWriter messageWriter2 = MessageWriter.Get(SendOption.Reliable); - messageWriter2.StartMessage(1); - messageWriter2.Write(3); + messageWriter2.StartMessage(1); // tag + messageWriter2.Write(3); // messageWriter2.EndMessage(); client.Connection.Send(messageWriter2); messageWriter2.Recycle(); return; } - case 2: + case 2: // StartGame if (reader.ReadInt32() == 32) { this.StartGame(reader, client); return; } break; - case 3: + case 3: // RemoveGame if (reader.ReadInt32() == 32) { this.ClientDisconnect(client); return; } break; - case 4: - case 7: - case 9: - case 10: + case 4: // remove player + case 7: // joined game + case 9: // get game list + case 10: // alter game break; - case 5: + case 5: // Tags.GameData if (this.Clients.Contains(client)) { if (reader.ReadInt32() == 32) { MessageWriter messageWriter3 = MessageWriter.Get(sendOption); messageWriter3.CopyFrom(reader); + // 广播这个消息 this.Broadcast(messageWriter3, client); messageWriter3.Recycle(); return; } } - else if (this.GameState == GameStates.Started) + else if (this.GameState == GameStates.Started) // 没有这个连接就踢掉这个错误的连接 { client.Connection.Dispose(); return; } break; - case 6: + case 6: // GameDataTo 到指定玩家,和Tags.GameData不同,包括Rpc if (this.Clients.Contains(client)) { if (reader.ReadInt32() == 32) @@ -257,14 +315,14 @@ namespace InnerNet return; } break; - case 8: + case 8: // EndGame if (reader.ReadInt32() == 32) { this.EndGame(reader, client); return; } break; - case 11: + case 11: // kick player if (reader.ReadInt32() == 32) { this.KickPlayer(reader.ReadPackedInt32(), reader.ReadBoolean()); @@ -275,12 +333,14 @@ namespace InnerNet } } + // 踢玩家 private void KickPlayer(int targetId, bool ban) { List<InnerNetServer.Player> clients = this.Clients; lock (clients) { InnerNetServer.Player player = null; + // 找到对应的玩家的连接 for (int i = 0; i < this.Clients.Count; i++) { if (this.Clients[i].Id == targetId) @@ -291,7 +351,7 @@ namespace InnerNet } if (player != null) { - if (ban) + if (ban) // 是否ban掉这个ip { HashSet<string> obj = this.ipBans; lock (obj) @@ -318,6 +378,7 @@ namespace InnerNet lock (obj) { IPEndPoint endPoint = client.Connection.EndPoint; + // 如果这个ip被ban掉了,踢掉这个玩家 if (this.ipBans.Contains(endPoint.Address.ToString())) { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); @@ -457,6 +518,7 @@ namespace InnerNet } } + // 游戏结束 private void EndGame(MessageReader message, InnerNetServer.Player source) { if (source.Id == this.HostId) @@ -476,6 +538,7 @@ namespace InnerNet Debug.LogWarning("Reset request rejected from: " + source.Id); } + // 开始游戏,房主点击了开始按钮后,服务器向其他玩家广播开始消息 private void StartGame(MessageReader message, InnerNetServer.Player source) { this.GameState = GameStates.Started; @@ -509,6 +572,7 @@ namespace InnerNet messageWriter.Recycle(); } + // 精确发给某个玩家,而不是广播 protected void SendTo(MessageWriter msg, int targetId) { List<InnerNetServer.Player> clients = this.Clients; @@ -534,11 +598,13 @@ namespace InnerNet } } + // 广播消息 protected void Broadcast(MessageWriter msg, InnerNetServer.Player source) { List<InnerNetServer.Player> clients = this.Clients; lock (clients) { + // 遍历所有的玩家,广播数据 for (int i = 0; i < this.Clients.Count; i++) { InnerNetServer.Player player = this.Clients[i]; @@ -546,6 +612,7 @@ namespace InnerNet { try { + // 发送数据 player.Connection.Send(msg); } catch |