서버 접속 끊김

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

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

  • 뒤끝 SDK 버전 : 5.11.9
  • 프로젝트명 : Lol
  • 스테이터스 코드 :
  • 에러 코드 : Exception: Not connected.
  • 에러 메시지 :
Exception: Not connected.
  at QcDdNkZtwipC7A4s8ls.D4rdylZUdhUJyTqJAy1.OGbar6Je8v (System.Byte[]  , System.Int32  , System.Int32  ) [0x0001a] in <fa6b5d91740b4e329b76dcfab89a8bad>:0 
  at QcDdNkZtwipC7A4s8ls.D4rdylZUdhUJyTqJAy1.iOHa3uvTMT (System.Byte[]  , System.Int32  , System.Int32  ) [0x00000] in <fa6b5d91740b4e329b76dcfab89a8bad>:0 
  at BackEnd.RealTime.GameMatch.SendDataToInGameRoom (System.Byte[] data) [0x00000] in <fa6b5d91740b4e329b76dcfab89a8bad>:0 
  at Server.SendData_Position () [0x00019] in D:\UNITY\LOL - multy\Assets\01_script\Server.cs:37 
  at Server.FixedUpdate () [0x00008] in D:\UNITY\LOL - multy\Assets\01_script\Server.cs:48 

(Filename: D:/UNITY/LOL - multy/Assets/01_script/Server.cs Line: 37)

멀티 서버와 잘 연결 후 게임을 시작했습니다.
그 후 1분 이내에 이러한 에러가 뜹니다.
특별한 이유로 이 오류가 뜨는 거인가요?
아니면 저의 코드에 실수가 있는 거일까요?

안녕하세요, 개발자님.
말씀하신 멀티 서버가 뒤끝 서버 내 client_app_id가 다른 서버들을 뜻하는 것일까요?
게임 도중 해당 값이 변경되면 매칭 서버와 룸 서버 접속을 완전히 끊어야 합니다.
매칭 서버라면 마지막으로 발생한 콜백이 어떤 것이었는지 확인해 주시면 감사하겠습니다.

좋아요 1

답변 감사합니다.
제가 말했던 멀티 서버는 뒤끝 매치입니다.

1 대 1 매치를 잡고 게임 시작 메시지까지 왔습니다
image
그 후 클라이언트와 클라이언트의 플레이어 위치 동기화를 위해
FixedUpdate에서 Backend.Match.SendDataToInGameRoom(bytelist); 을 이용했습니다.

그런데 정상적으로 정보를 잘 주고받다가 갑자기 위의 에러 코드가 뜹니다.

아래의 코드는 서버에 정보를 보내는 코드입니다.

image

감사합니다

확인 후 안내드리도록 하겠습니다.

좋아요 1

기다려주셔서 감사합니다.
업데이트에서 호출할 경우, 60프레임이면 1초에 60번의 호출이 발생합니다.
과다한 호출은 클라이언트쪽 메모리 또는 동작에 오류가 발생할 수 있습니다.
이에, 캐릭터가 움직이는 경우 사용자가 조작할 때만 데이터를 보내주는 로직으로 변경해 주시면 감사하겠습니다.

좋아요 1

답변 감사합니다.

왜 서버와 PC 사이의 연결이 끊기는지 이해가 갔습니다.

하지만 자신의 이동 조작 정보와 다른 정보를 구분하여 보낼 때 이 정보가 이동 조작 정보인지 아니면 다른 정보인지 다른 PC에서 받는 방법을 모르겠습니다.
image

저는 자신의 위치와 다른 정보들을 같이 보내서 동기화합니다.
이동 조작 정보와 다른 정보를 Class를 이용하여 따로 보내는 것 으로 추축합니다.

그래서 받을 때 이 클래스가 어떤 클래스인지 구분하는 방법을 모르겠습니다.

공통된 변수로 동작을 설정하시면 됩니다.

public string actionName = "PlayerInfo";
public enum actionName = ACTION.PLAYER_INFO;

받을 때에는 해당 action에 따라 알맞은 객체로 파싱을 하시면 됩니다.
감사합니다.

좋아요 1

답변 감사합니다.
hmin님이 보내주신 답변을 보고 이 문제를 해결하려고 했으나…
저는 아직 코딩을 배우는 단계에 있어서 이 문제에 대해 어떻게 해결해야 할지 모르겠습니다.

혹시 괜찮으시면 정보를 보내고 받는 부분에 대해 예제 코드를 받을 수 있나요?

안녕하세요, 개발자님.
요청하신 예제 코드 전달드립니다.

 enum MessageType
    {
        NONE,
        PLAYER_MOVE,
        PLAYER_ATTACK,
        PLAYER_HP
    }
    
    public class Message
    {
        public int mType = 0;
    }
    
    public class PlayerMoveMessage : Message
    {
        public float ange;
    }
    
    public class PlayerAttackMessage : Message
    {
        public float damage;
    }
    
    public class PlayerHPMessage : Message
    {
        public float hp;
    }

    void Start() {
        Backend.Match.OnMatchRelay = (MatchRelayEventArgs args) =>
        {
            var strByte = System.Text.Encoding.Default.GetString(args.BinaryUserData);
            
            JsonData json = JsonMapper.ToObject(strByte);

            if (json.ContainsKey("mType"))
            {
                int mType = int.Parse(json["mType"].ToString());
                switch ((MessageType)mType)
                {
                    case MessageType.NONE:
                        break;
                    case MessageType.PLAYER_MOVE:
                    {
                        PlayerMoveMessage msg = JsonUtility.FromJson<PlayerMoveMessage>(strByte);
                    }
                        break;
                    case MessageType.PLAYER_ATTACK:
                    {
                        PlayerAttackMessage msg = JsonUtility.FromJson<PlayerAttackMessage>(strByte);
                    }
                        break;
                    case MessageType.PLAYER_HP:
                    {
                        PlayerHPMessage msg = JsonUtility.FromJson<PlayerHPMessage>(strByte);
                    }
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
            else
            {
                Debug.LogError("존재하지 않는 메시지 유형입니다.");
            }
            
            byteMessageCount++;
        };
    }

    public void SendPlayerMoveData(string msg)
    {
        PlayerMoveMessage message = new PlayerMoveMessage();
        var jsonData = JsonUtility.ToJson(message); // 클래스를 json으로 변환해주는 함수
        var dataByte = System.Text.Encoding.UTF8.GetBytes(jsonData); // json을 byte[]로 변환해주는 함수
        Backend.Match.SendDataToInGameRoom(dataByte);
    }

    
    public void SendPlayerHpData(string msg)
    {
        PlayerHPMessage message = new PlayerHPMessage();
        var jsonData = JsonUtility.ToJson(message); // 클래스를 json으로 변환해주는 함수
        var dataByte = System.Text.Encoding.UTF8.GetBytes(jsonData); // json을 byte[]로 변환해주는 함수
        Backend.Match.SendDataToInGameRoom(dataByte);
    }
좋아요 1

답변 감사합니다!

himin님이 주신 예제 코드를 참고하여 코드를 작성했고, 성공했습니다.

저의 게임 완성에 도움을 주셔서 감사합니다.

좋아요 1