Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        // すべての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");
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        //再接続
        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");
        }
Esempio n. 5
0
        // サーバーから切断されたら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");
        }
Esempio n. 6
0
        /// <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");
        }
Esempio n. 7
0
        /// <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;
                    }
                }
            }
        }