summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetServer.cs')
-rw-r--r--Client/Assembly-CSharp/InnerNet/InnerNetServer.cs113
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