Beispiel #1
0
    public static void Update()
    {
        // 処理待ち中は無視
        if (!messageSyoriSitemoii)
        {
            return;
        }
        // メッセージ何もなかったら
        if (messageBox.Count == 0)
        {
            return;
        }
        if (!oulNetwork.s_Singleton.isNetworkActive)
        {
            return;
        }
        // 一定間隔(Remessage送りすぎないように)
        //if ((timer += Time.deltaTime) < kankaku)
        //{
        //    // 通信中UI表示
        //    sceneMain.uiManager.AppearConnectingUI();
        //    return;
        //}
        // 通信中UI非表示
        //sceneMain.uiManager.DisAppearConnectingUI();

        //timer = 0;

        bool ok = false;

        // ずれがないように順番通りに処理するようにする
        for (int i = 0; i < messageBox.Count; i++)
        {
            if (messageBox[i].number == receiveMessageNumber)
            {
                var message = messageBox[i];
                // 処理したのでリストから消去
                messageBox.Remove(message);
                // 次のメッセージ待機
                receiveMessageNumber++;
                // 受け取ったことにする
                networkScene.HandleMessage(message);
                // 見つかったフラグ
                ok = true;
                break;
            }
        }

        if (!ok)
        {
            Debug.LogError("メッセージずれてるクマ。前回のメッセージが受け取れてない可能性があるクマ");
            //oulFile.OutPutLog(Application.dataPath + "/log.txt", "メッセージずれてるクマ。前回のメッセージが受け取れてない可能性があるクマ\n");

            // もっかい送ってもらう
            ReMessageInfo info = new ReMessageInfo();
            info.messageNumber = receiveMessageNumber;
            MessageInfo re = new MessageInfo();
            re.messageType = MessageType.ReMessage;
            re.SetExtraInfo(info);
            oulNetwork.s_Singleton.SendMessage(re);

            //for (int i = receiveMessageNumber; i < mes.myMessageInfo.number; i++)
            //{
            //    ReMessageInfo info = new ReMessageInfo();
            //    info.messageNumber = i;
            //    MessageInfo re = new MessageInfo();
            //    re.messageType = MessageType.ReMessage;
            //    re.SetExtraInfo(info);
            //    SendMessage(re);
            //}
        }

        //if (messageBox[0].messageType == MessageType.ReceiveOK)
        //{
        //    Send(messageBox[0]);
        //    return;
        //}

        //if ((timer += Time.deltaTime) > kankaku)
        //{
        //    timer = 0;

        //    Send(messageBox[0]);
        //}
    }
Beispiel #2
0
    public override void OnStartServer()
    {
        base.OnStartServer();

        //
        MessageManager.isServer = true;

        // サーバがMsg.Textを受信したときに行う関数を登録する
        NetworkServer.RegisterHandler(Msg.MyMessage, networkMessage =>
        {
            var mes = networkMessage.ReadMessage <MyNetworkMessage>();
            Debug.Log("サーバー: " + networkMessage.conn.connectionId + "番のプレイヤーからのメッセージを受信" + mes.myMessageInfo.messageType.ToString());

            //
            //if (mes.myMessageInfo.messageType == MessageType.ReceiveOK)
            //{
            //    // byte[]→構造体
            //    ReceiveOKInfo info = new ReceiveOKInfo();
            //    IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(info));
            //    Marshal.Copy(mes.myMessageInfo.exInfo, 0, ptr, Marshal.SizeOf(info));
            //    info = (ReceiveOKInfo)Marshal.PtrToStructure(ptr, info.GetType());
            //    Marshal.FreeHGlobal(ptr);

            //    for (int i = 0; i < clientIDList.Count; i++)
            //    {
            //        if (clientIDList[i].connectionId == networkMessage.conn.connectionId)
            //        {
            //            clientIDList[i].sendOK = true;
            //            break;
            //        }
            //    }
            //    return;
            //}
            if (mes.myMessageInfo.messageType == MessageType.ReMessage)
            {
                // byte[]→構造体
                ReMessageInfo reMessageInfo = new ReMessageInfo();
                mes.myMessageInfo.GetExtraInfo <ReMessageInfo>(ref reMessageInfo);
                //IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(reMessageInfo));
                //Marshal.Copy(mes.myMessageInfo.exInfo, 0, ptr, Marshal.SizeOf(reMessageInfo));
                //reMessageInfo = (ReMessageInfo)Marshal.PtrToStructure(ptr, reMessageInfo.GetType());
                //Marshal.FreeHGlobal(ptr);

                // 返信
                MyNetworkMessage re = new MyNetworkMessage();
                re.myMessageInfo    = messageBuffer[reMessageInfo.messageNumber];
                Debug.Assert(re.myMessageInfo.messageType != MessageType.NoMessage, "ReMessageでエラー");
                networkMessage.conn.Send(Msg.MyMessage, re);
            }

            Debug.Log("メッセージ保存: " + sendMessageNumber);

            // 番号
            messageBuffer[sendMessageNumber] = mes.myMessageInfo;
            mes.myMessageInfo.number         = sendMessageNumber++;


            // Msg.Textを送ってきたクライアントに返信する
            // 受け取ったよメッセージを送る
            //MyNetworkMessage re = new MyNetworkMessage();
            //re.myMessageInfo.messageType = MessageType.ReceiveOK;
            //ReceiveOKInfo exInfo = new ReceiveOKInfo();
            //exInfo.iMessageType = (uint)mes.myMessageInfo.messageType;
            //re.myMessageInfo.SetExtraInfo(exInfo);
            //networkMessage.conn.Send(Msg.MyMessage, re);

            // クライアント全員に送信する
            //NetworkServer.SendToAll(Msg.MyMessage, mes);

            // おくられてないとき用にメッセージ保存
            messageQueue.Enqueue(mes);
            //waitTimer = 114514;
        });

        Debug.Log("サーバーキテルグマ");
    }