/// <summary> /// まとめたパケット送信など、最後に行うべきUpdateループ /// </summary> public override void OnLastUpdate() { if (state == State.Offline) { return; } if (!networkLinkerHandle.IsCreated) { return; } var linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); if (state == State.Online || state == State.Disconnecting) { linker.SendMeasureLatencyPacket(); linker.SendReliableChunks(); } jobHandle = linker.ScheduleSendUnreliableChunks(default(JobHandle)); jobHandle = driver.ScheduleUpdate(jobHandle); jobHandle = linker.ScheduleRecieve(jobHandle); }
// すべてのClientが切断したら呼ぶ public override void StopComplete() { if (state == State.Offline) { Debug.LogError("CompleteStop Failed currentState = " + state); return; } state = State.Offline; jobHandle.Complete(); driver.Dispose(); if (networkLinkerHandles.IsCreated) { for (int i = 0; i < networkLinkerHandles.Length; i++) { if (networkLinkerHandles[i].IsCreated) { NetworkLinkerPool.ReleaseLinker(networkLinkerHandles[i]); networkLinkerHandles[i] = default; } } networkLinkerHandles.Dispose(); } Debug.Log("StopComplete"); }
public override ushort Send(NativeList <ushort> playerIdList, DataStreamWriter data, QosType qos, bool noChunk = false) { if (state == State.Offline) { Debug.LogError("Send Failed : State.Offline"); return(0); } ushort seqNum = 0; using (var writer = CreateSendPacket(data, qos, playerIdList, playerId)) { if (networkLinkerHandle.IsCreated) { NetworkLinker linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); if (linker != null) { seqNum = linker.Send(writer, qos, noChunk); } } else { Debug.LogError("Send Failed : is not create networkLinker"); } } return(seqNum); }
//再接続 private void Reconnect() { var endpoint = new IPEndPoint(serverAdress, serverPort); state = State.Connecting; var linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); linker.Reconnect(driver.Connect(endpoint)); Debug.Log("Reconnect"); }
// サーバーから切断されたらLinkerを破棄して停止 public override void StopComplete() { playerId = 0; state = State.Offline; jobHandle.Complete(); //var linker = NetworkLinkerPool.GetLinker (networkLinkerHandle); //driver.Disconnect (linker.connection); //ここはserverからDisconnectされたら行う処理 NetworkLinkerPool.ReleaseLinker(networkLinkerHandle); networkLinkerHandle = default; Debug.Log("StopComplete"); }
/// <summary> /// クライアント接続開始 /// </summary> public void Start(IPAddress adress, int port) { serverAdress = adress; serverPort = port; if (!driver.IsCreated) { var parm = new NetworkConfigParameter() { connectTimeoutMS = 1000 * 5, disconnectTimeoutMS = 1000 * 5, }; driver = new UdpCNetworkDriver(new INetworkParameter[] { parm }); } var endpoint = new IPEndPoint(serverAdress, port); state = State.Connecting; networkLinkerHandle = NetworkLinkerPool.CreateLinkerHandle(driver, driver.Connect(endpoint)); Debug.Log("StartClient"); }
/// <summary> /// 受信パケットの受け取りなど、最初に行うべきUpdateループ /// </summary> public override void OnFirstUpdate() { jobHandle.Complete(); if (!networkLinkerHandle.IsCreated) { return; } var linker = NetworkLinkerPool.GetLinker(networkLinkerHandle); linker.Complete(); if (state == State.Offline) { return; } //受け取ったパケットを処理に投げる. if (!networkLinkerHandle.IsCreated) { return; } if (linker.IsConnected) { Debug.Log("IsConnected : dataLen=" + linker.dataStreams.Length); } if (linker.IsDisconnected) { Debug.Log("IsDisconnected"); if (state == State.Disconnecting) { StopComplete(); } else { Reconnect(); } return; } for (int j = 0; j < linker.dataStreams.Length; j++) { var stream = linker.dataStreams[j]; var ctx = default(DataStreamReader.Context); if (!ReadQosHeader(stream, ref ctx, out var qosType, out var seqNum, out var ackNum)) { continue; } //chunkをバラして解析 while (true) { if (!ReadChunkHeader(stream, ref ctx, out var chunk, out var ctx2, out ushort targetPlayerId, out ushort senderPlayerId)) { break; } //Debug.Log ("Linker streamLen=" + stream.Length + ", Pos=" + pos + ", chunkLen=" + chunk.Length + ",type=" + type + ",target=" + targetPlayerId + ",sender=" + senderPlayerId); byte type = chunk.ReadByte(ref ctx2); //自分宛パケットの解析 switch (type) { case (byte)BuiltInPacket.Type.RegisterPlayer: state = State.Online; playerId = chunk.ReadUShort(ref ctx2); leaderStatTime = chunk.ReadLong(ref ctx2); ushort syncSelfSeqNum = chunk.ReadUShort(ref ctx2); if (syncSelfSeqNum != 0) { Debug.Log("Reconnected"); } linker.SyncSeqNum(syncSelfSeqNum); byte count = chunk.ReadByte(ref ctx2); for (int i = 0; i < count; i++) { activePlayerIdList.Add(chunk.ReadByte(ref ctx2)); } for (int i = 0; i < uncheckRegisterPlayerIds.Length; i++) { RegisterPlayerId(uncheckRegisterPlayerIds[i]); } for (int i = 0; i < uncheckUnregisterPlayerIds.Length; i++) { UnregisterPlayerId(uncheckUnregisterPlayerIds[i]); } uncheckRegisterPlayerIds.Clear(); uncheckUnregisterPlayerIds.Clear(); break; case (byte)BuiltInPacket.Type.NotifyAddPlayer: ushort addPlayerId = chunk.ReadUShort(ref ctx2); if (state == State.Online) { if (addPlayerId != playerId) { RegisterPlayerId(addPlayerId); ExecOnRegisterPlayer(addPlayerId); } } else { //ほかの接続情報が順番入れ替わっている可能性を考慮 uncheckRegisterPlayerIds.Add(addPlayerId); Debug.Log("uncheckRegisterPlayerIds.Add"); } Debug.Log("NotifyAddPlayer id=" + addPlayerId); break; case (byte)BuiltInPacket.Type.NotifyRemovePlayer: ushort removePlayerId = chunk.ReadUShort(ref ctx2); if (state == State.Online) { if (removePlayerId != playerId) { UnregisterPlayerId(removePlayerId); ExecOnUnregisterPlayer(removePlayerId); } } else { //ほかの接続情報が順番入れ替わっている可能性を考慮して uncheckUnregisterPlayerIds.Add(removePlayerId); Debug.Log("uncheckUnregisterPlayerIds.Add"); } Debug.Log("NotifyRemovePlayer id=" + removePlayerId); break; case (byte)BuiltInPacket.Type.StopNetwork: Stop(); break; default: RecieveData(senderPlayerId, type, chunk, ctx2); break; } } } }