diff options
author | chai <chaifix@163.com> | 2021-01-01 09:44:26 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-01-01 09:44:26 +0800 |
commit | be6caf20c319f55fe6fa5d918859af39991a899f (patch) | |
tree | 795cbdfd4eea3c442f5578ff0538ad63dfae0725 /Client/Assembly-CSharp/InnerNet/InnerNetClient.cs | |
parent | e9ea621b93fbb58d9edfca8375918791637bbd52 (diff) |
*网络
Diffstat (limited to 'Client/Assembly-CSharp/InnerNet/InnerNetClient.cs')
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetClient.cs | 96 |
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)) { |