예제 #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);
        }
예제 #2
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);
        }
예제 #3
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");
        }
예제 #4
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;
                    }
                }
            }
        }