summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-01-01 09:44:26 +0800
committerchai <chaifix@163.com>2021-01-01 09:44:26 +0800
commitbe6caf20c319f55fe6fa5d918859af39991a899f (patch)
tree795cbdfd4eea3c442f5578ff0538ad63dfae0725 /Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
parente9ea621b93fbb58d9edfca8375918791637bbd52 (diff)
*网络
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetClient.cs')
-rw-r--r--Client/Assembly-CSharp/InnerNet/InnerNetClient.cs96
1 files changed, 70 insertions, 26 deletions
diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
index 7cff87c..b88dda4 100644
--- a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
+++ b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs
@@ -34,6 +34,7 @@ namespace InnerNet
}
}
+ // 本机是host
public bool AmHost
{
get
@@ -176,6 +177,7 @@ namespace InnerNet
this.GameId = 32;
}
+ //c 发送数据,在主线程调用
private void SendOrDisconnect(MessageWriter msg)
{
try
@@ -244,21 +246,26 @@ namespace InnerNet
this.LastDisconnectReason = DisconnectReasons.ExitGame;
this.NetIdCnt = 1U;
this.DestroyedObjects.Clear();
+ // 创建发送流
if (this.Streams == null)
{
- this.Streams = new MessageWriter[2];
- for (int i = 0; i < this.Streams.Length; i++)
+ this.Streams = new MessageWriter[2]; // 一个是不可靠的,一个是可靠的
+ for (int i = 0; i < this.Streams.Length; i++)
{
this.Streams[i] = MessageWriter.Get((SendOption)i);
}
}
- for (int j = 0; j < this.Streams.Length; j++)
+ //c 初始化发送流
+ // SendRpcImmediately和SendRpc的区别是前者每次会发送一个rpc,后者会把rpc拼起来
+ // 所以这里设置了头5
+ for (int j = 0; j < this.Streams.Length; j++)
{
MessageWriter messageWriter = this.Streams[j];
messageWriter.Clear((SendOption)j);
- messageWriter.StartMessage(5);
+ messageWriter.StartMessage(5); // GameData
messageWriter.Write(this.GameId);
}
+
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(this.networkAddress), this.networkPort);
this.connection = new UdpClientConnection(remoteEndPoint, IPMode.IPv4);
this.connection.KeepAliveInterval = 1500;
@@ -315,8 +322,9 @@ namespace InnerNet
yield break;
}
this.GameId = 0;
+ // 单局游戏配置
PlayerControl.GameOptions = SaveManager.GameHostOptions;
- this.HostGame(PlayerControl.GameOptions);
+ this.HostGame(PlayerControl.GameOptions); // 作为host
yield return this.WaitWithTimeout(() => this.GameId != 0);
if (!this.AmConnected)
{
@@ -520,7 +528,10 @@ namespace InnerNet
this.allObjectsFast.Clear();
}
- public void HostGame(IBytesSerializable settings)
+ // 作为host建立服务器
+ // 根据settings配置
+ // 服务器会返回GameId(根据settings)
+ public void HostGame(IBytesSerializable settings)
{
this.IsGamePublic = false;
MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable);
@@ -925,7 +936,7 @@ namespace InnerNet
});
return;
}
- IL_2F5:
+ IL_2F5: // 同时处理join game和disconnect
int num8 = reader.ReadInt32();
DisconnectReasons disconnectReasons = (DisconnectReasons)num8;
if (InnerNetClient.disconnectReasons.Contains(disconnectReasons))
@@ -950,6 +961,7 @@ namespace InnerNet
{
this.Dispatcher.Add(delegate
{
+ // 某个玩家加入了本局
this.OnPlayerJoined(client);
});
}
@@ -1210,6 +1222,7 @@ namespace InnerNet
private void FixedUpdate()
{
+ // 每隔MinSendInterval的时间同步一次标记为脏的数据
if (this.mode == MatchMakerModes.None || this.Streams == null)
{
this.timer = 0f;
@@ -1229,9 +1242,12 @@ namespace InnerNet
for (int i = 0; i < this.allObjects.Count; i++)
{
InnerNetObject innerNetObject = this.allObjects[i];
- if (innerNetObject && innerNetObject.DirtyBits != 0U && (innerNetObject.AmOwner || (innerNetObject.OwnerId == -2 && this.AmHost)))
+ // 如果这个数据是本玩家控制的,作为同步数据写入
+ if (innerNetObject
+ && innerNetObject.DirtyBits != 0U
+ && (innerNetObject.AmOwner || (innerNetObject.OwnerId == /*-2*/InvalidClient && this.AmHost)))
{
- MessageWriter messageWriter = this.Streams[(int)innerNetObject.sendMode];
+ MessageWriter messageWriter = this.Streams[(int)innerNetObject.sendMode]; // 根据是否是可靠UDP,选择对应的writer
messageWriter.StartMessage(1);
messageWriter.WritePacked(innerNetObject.NetId);
if (innerNetObject.Serialize(messageWriter, false))
@@ -1245,16 +1261,32 @@ namespace InnerNet
}
}
}
-
+ // 发送数据
for (int j = 0; j < this.Streams.Length; j++)
{
MessageWriter messageWriter2 = this.Streams[j];
- if (messageWriter2.HasBytes(7))
- {
+ /*
+ public void StartMessage(byte typeFlag)
+ {
+ messageStarts.Push(this.Position);
+ this.Position += 2; // Skip for size
+ this.Write(typeFlag);
+ }
+ public void EndMessage()
+ {
+ var lastMessageStart = messageStarts.Pop();
+ ushort length = (ushort)(this.Position - lastMessageStart - 3); // Minus length and type byte
+ this.Buffer[lastMessageStart] = (byte)length;
+ this.Buffer[lastMessageStart + 1] = (byte)(length >> 8);
+ }
+ */
+ if (messageWriter2.HasBytes(7)) // 里面是否有数据,有的话发送。7=length(2B) + DataFlag(1B) + netId(4B)
+ {
messageWriter2.EndMessage();
this.SendOrDisconnect(messageWriter2);
+
messageWriter2.Clear((SendOption)j);
- messageWriter2.StartMessage(5);
+ messageWriter2.StartMessage(5); // 初始化
messageWriter2.Write(this.GameId);
}
}
@@ -1270,12 +1302,13 @@ namespace InnerNet
return default(T);
}
+ //c 发送RPC
public void SendRpcImmediately(uint targetNetId, byte callId, SendOption option)
{
MessageWriter messageWriter = MessageWriter.Get(option);
- messageWriter.StartMessage(5);
- messageWriter.Write(this.GameId);
- messageWriter.StartMessage(2);
+ messageWriter.StartMessage(5); // public const byte GameData = 5;
+ messageWriter.Write(this.GameId);
+ messageWriter.StartMessage(2); // Rpc
messageWriter.WritePacked(targetNetId);
messageWriter.Write(callId);
messageWriter.EndMessage();
@@ -1312,6 +1345,7 @@ namespace InnerNet
msg.Recycle();
}
+ //
public void SendRpc(uint targetNetId, byte callId, SendOption option = SendOption.Reliable)
{
this.StartRpc(targetNetId, callId, option).EndMessage();
@@ -1319,8 +1353,8 @@ namespace InnerNet
public MessageWriter StartRpc(uint targetNetId, byte callId, SendOption option = SendOption.Reliable)
{
- MessageWriter messageWriter = this.Streams[(int)option];
- messageWriter.StartMessage(2);
+ MessageWriter messageWriter = this.Streams[(int)option]; // 拿到对应的发送流
+ messageWriter.StartMessage(2); // 2 = rpc
messageWriter.WritePacked(targetNetId);
messageWriter.Write(callId);
return messageWriter;
@@ -1393,11 +1427,11 @@ namespace InnerNet
yield break;
}
- public void Spawn(InnerNetObject netObjParent, int ownerId = -2, SpawnFlags flags = SpawnFlags.None)
+ public void Spawn(InnerNetObject netObjParent, int ownerId = /*-2*/InvalidClient, SpawnFlags flags = SpawnFlags.None)
{
if (this.AmHost)
{
- ownerId = ((ownerId == -3) ? this.ClientId : ownerId);
+ ownerId = ((ownerId == /*-3*/CurrentClient) ? this.ClientId : ownerId);
MessageWriter msg = this.Streams[1];
this.WriteSpawnMessage(netObjParent, ownerId, flags, msg);
return;
@@ -1482,7 +1516,7 @@ namespace InnerNet
public void RemoveUnownedObjects()
{
HashSet<int> hashSet = new HashSet<int>();
- hashSet.Add(-2);
+ hashSet.Add(/*-2*/InvalidClient);
List<ClientData> obj = this.allClients;
lock (obj)
{
@@ -1530,6 +1564,15 @@ namespace InnerNet
}
//c 辅助tag别名
+ /*
+ internal const byte DataFlag = 1;
+ internal const byte RpcFlag = 2;
+ internal const byte SpawnFlag = 4;
+ internal const byte DespawnFlag = 5;
+ internal const byte SceneChangeFlag = 6;
+ internal const byte ReadyFlag = 7;
+ internal const byte ChangeSettingsFlag = 8;
+ */
private enum SubTagAlias
{
Normal = 1, // 游戏内的简单数据,比如同步角色位置、动画等
@@ -1565,17 +1608,18 @@ namespace InnerNet
case (int)SubTagAlias.Rpc:
{
// 根据编号找到对应的同步数据
- uint index = reader.ReadPackedUInt32();
+ uint netId = reader.ReadPackedUInt32();
InnerNetObject innerNetObject2;
- if (this.allObjectsFast.TryGetValue(index, out innerNetObject2))
+ if (this.allObjectsFast.TryGetValue(netId, out innerNetObject2))
{
byte callId = reader.ReadByte();
+ //c 调用Rpc的唯一入口
innerNetObject2.HandleRpc(callId, reader);
return;
}
- if (!this.DestroyedObjects.Contains(index))
+ if (!this.DestroyedObjects.Contains(netId))
{
- this.DeferMessage(cnt, reader, "Stored RPC for " + index);
+ this.DeferMessage(cnt, reader, "Stored RPC for " + netId);
return;
}
return;
@@ -1623,7 +1667,7 @@ namespace InnerNet
for (int i = 0; i < num5; i++)
{
InnerNetObject innerNetObject4 = componentsInChildren[i];
- innerNetObject4.NetId = reader.ReadPackedUInt32();
+ innerNetObject4.NetId = reader.ReadPackedUInt32(); // 设置netid
innerNetObject4.OwnerId = num4;
if (this.DestroyedObjects.Contains(innerNetObject4.NetId))
{