매칭방 생성시 Not Connected뜸 제발좀 답변해주세요

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 :
  • 프로젝트명 : 머니게임
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

매칭방 생성 하면 간혈적으로 예외가 뜹니다.
매칭서버 잘 들어가있고
게임 시작할 때부터 이 현상이 나타납니다.

2월부터 문의했는데 해결 안되는데 해결 안하시나요??

안녕하세요 개발자님,
간헐적으로 서버의 연결이 실패하거나 응답처리가 원활히 이루어지지 않을 수 있습니다.
이러한 경우는 재호출이 이루어지도록 처리해 주시면 감사하겠습니다.

이전 문의에 제공해주신 로직에 대해 한차례 수정된 로직을 제공해드렸는데요,
Not connect와 관련한 내용을 추가하여 수정하였으니 확인하여 이용해 주시면 감사하겠습니다.

  • OnJoinMatchMaking에서 에러가 발생하여 CreateRoom이 안되는 케이스를 위한 Debug.Log(Not Connected 발생 부분)
  • 접속한 세션에 문제가 발생하여 OnSessionJoinInServer에서 에러하는 것을 확인하기 위한 Debug.Log
  • OnMatchInGameStart 호출을 확인하기 위한 Debug.Log
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using BackEnd;
using BackEnd.Tcp;
using UnityEngine.SceneManagement;

public class BackEndMatch : MonoBehaviour
{
    ErrorInfo errorinfo;
    [SerializeField]
    bool isConnectMatchServer;
    string RoomToken;
    WaitForSeconds repeatTime = new WaitForSeconds(0.1f);
    MatchUserGameRecord MyStartData, EnemyStartData;
    [SerializeField]
    GameObject WaitStartGame;

    AsyncOperation op;

    bool isReCreateMatchRoom = false;
    private void Awake()
    {
        {
            //WaitStartGame.SetActive(true);
            //GameObject.FindWithTag("MyStart").GetComponent<StartProfile>().Init("운영자", 1024, Skin.None);
            //GameObject.FindWithTag("EnemyStart").GetComponent<StartProfile>().Init("시", 1402, Skin.None);
        }
        try//전판 인게임서버에서 나오지 못했을 경우를 대비
        {
            Backend.Match.LeaveGameServer();
        }
        catch
        {

        }

        //StartCoroutine(Poller());

        Matchready();

        Backend.Match.OnMatchMakingRoomCreate = (args) =>
        {
            Debug.Log("OnMatchMakingRoomCreate : " + args.ErrInfo); // [뒤끝] - 디버깅

            print("매칭룸");
        };


        Backend.Match.OnMatchMakingResponse = (args) =>
        {
            print(args.ErrInfo);
            switch (args.ErrInfo)
            {
                case ErrorCode.Match_InProgress:
                    print("매칭 신청 성공");
                    MatchingEventScript.Instance.MatchMaking();
                    break;

                case ErrorCode.Success:
                    print("매칭 성공");
                    JoinInGameServer(args.RoomInfo.m_inGameServerEndPoint.m_address, args.RoomInfo.m_inGameServerEndPoint.m_port);//1단계
                    RoomToken = args.RoomInfo.m_inGameRoomToken;//인게임 서버접속시 안쓰이고 게임방 입장에 쓰임

                    break;

                case ErrorCode.Match_MatchMakingCanceled:
                    print("매칭 취소");
                    MatchingEventScript.Instance.MatchMakingStop();
                    break;

                default:
                    print(args.ErrInfo);
                    break;
            }
        };
        void JoinInGameServer(string serverAddress, ushort serverPort) // 임의의 함수
        {
            bool isReconnect = false;//재접속한건지. 디폴트값은 false
            //ErrorInfo errorInfo = null;

            if (!Backend.Match.JoinGameServer(serverAddress, serverPort, isReconnect, out ErrorInfo errorInfo))//2단계
                StopMatching();

        }
        Backend.Match.OnSessionJoinInServer = (args) =>
        {
            if (args.ErrInfo != ErrorInfo.Success)
            {
                Debug.LogError(args.ErrInfo);  // [뒤끝] - 디버깅
            }
            Backend.Match.JoinGameRoom(RoomToken);//3단계
        };

        Backend.Match.OnMatchMakingRoomCreate = (args) =>
         {
             isReCreateMatchRoom = false;
             Backend.Match.RequestMatchMaking(MatchType.Random, MatchModeType.OneOnOne, "2022-02-10T04:34:45.143Z");
         };
        Backend.Match.OnSessionListInServer = (args) =>//겜방 들어가자마자
        {

            MatchDoor.instance.isClose(true);
            op = SceneManager.LoadSceneAsync("Ingame");
            op.allowSceneActivation = false;

            CharacterFromWeb.Instance.userRecord = new List<MatchUserGameRecord>(args.GameRecords);
            foreach (var a in args.GameRecords)
            {
                print(a.m_sessionId);
            }

            if (args.GameRecords.Count == CharacterFromWeb.FullCount)
            {
                CharacterFromWeb.Instance.isLast = true;
                print("im last");
                CharacterFromWeb.Instance.SetUserCharacters(2);
            }
        };
        Backend.Match.OnMatchInGameAccess = (args) =>//다른애들 들어올 때마다
        {
            print(args.GameRecord.m_sessionId);
            if (!CharacterFromWeb.Instance.userRecord.Exists(x => x.m_nickname == args.GameRecord.m_nickname))//중복시 넣지않음
                CharacterFromWeb.Instance.userRecord.Add(args.GameRecord);
        };
        Backend.Match.OnMatchInGameStart = () =>
        {
            Debug.Log("OnMatchInGameStart 호출");   // [뒤끝] - 디버깅
            op.allowSceneActivation = true;
        };

        Backend.Match.OnJoinMatchMakingServer = (args) =>
        {
            if (args.ErrInfo != ErrorInfo.Success)
            {
                Debug.LogError($"OnJoinMatchMakingServer : {args.ErrInfo}");   // [뒤끝] - 디버깅
            }

            isConnectMatchServer = true;
            print("매칭서버 입장(람다식)");

            if (isReCreateMatchRoom)
            {
                FastMatchMaking();
            }
        };
        Backend.Match.OnLeaveMatchMakingServer = (args) =>
        {
            if (args.ErrInfo != ErrorInfo.Success)
            {
                Debug.LogError($"OnLeaveMatchMakingServer : {args.ErrInfo}");   // [뒤끝] - 디버깅
            }
            isConnectMatchServer = false;
            print("매칭서버 퇴장(람다식)");

            if (isReCreateMatchRoom)
            {
                Matchready();
            }
        };
    }

    void Poll()
    {
        Backend.Match.Poll();
    }

    public void Matchready()
    {
        if (Backend.Match.JoinMatchMakingServer(out errorinfo))
        {
            Debug.Log("매칭서버진입성공");
            Debug.Log(errorinfo);
        }
        else
        {
            Debug.LogError($"에러 : {errorinfo.ToString()}");   // [뒤끝] - 디버깅
            Debug.Log(errorinfo);
            isReCreateMatchRoom = false;
        }

    }

    public void FastMatchMaking()
    {
        //if (!isConnectMatchServer)
        // Matchready();
        try
        {
            Backend.Match.CreateMatchRoom();
        }
        catch (System.Exception e)
        {
            Debug.LogError(e.Message);
            ReCreateMatchRoom();
            //SceneManager.LoadScene("startscene");
        }
    }

    public void ReCreateMatchRoom()
    {
        isReCreateMatchRoom = true;
        Backend.Match.LeaveMatchMakingServer();
    }


    public void StopMatching()
    {
        Backend.Match.CancelMatchMaking();
    }


    // IEnumerator Poller()
    // {
    //     while (true)
    //     {
    //         Backend.Match.Poll();
    //         //print(Backend.Match.Poll());
    //         yield return repeatTime;
    //     }
    // }

    private void OnDestroy()
    {
        Backend.Match.LeaveMatchRoom();
    }

}

이대로 넣어서 하니까 오류 발생 시 아예 멈춥니다. RECREATING ROOM이 계속 반복되고 계속 오류나서 멈추는거 같은데요. 아무래도 연결상태가 좋지 않을 때마다 발생하는 것 같은데 문제는 그 기준이 너무 까다롭다는 것입니다. 와이파이 풀일때도 어쨋서인지 발생하네요. 해결책을 하루빨리 강구해주시길 바랍니다. 최소한 무슨 오류인지라도 확인하게 해주세요. 무작정 Not Connected.라고 뜨니까 원인 파악이 안되는것ㅅ 아닙니까

원인으로 추정되는 부분을 일부 수정 및 로그파악이 될 수 있도록 SDK를 수정하여 DM을 통해 전달드렸습니다.

다만 서버 통신 불량으로 인해 Not Connected가 발생하는 이슈는 완전히 픽스되는 것은 불가능하며,
이부분은 개발자님께서 예외처리 로직을 통해 보안을 해야하는 점 참고해주시면 감사하겠습니다.

현재로서는 개발자님이 이전에 작성하신 Not Connected가 발생하면 초기화면으로 돌아가 Backend.RequestMatchMaking()부터 호출하는 로직으로 구성하는 것을 추천드립니다.

명쾌한 답변 드리지 못해 죄송합니다.