뒤끝채팅이 하루에 특정시간마다 끊기나요?

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

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

5대의 핸드폰을 채팅에 접속시키고 방치해뒀을 때 정확한 시간파악은 못했지만

5대 모두 일정 타이밍에 채팅채널에서 접속이 종료되어 메시지 보내기가 되지 않습니다.

아직 채팅채널에서 나가졌을 때 재접속 시키는 로직을 넣어놓지 않았는데

뒤끝채팅 자체적으로 일정 시간에 서버를 리프레쉬하는게 있는건가요?

안녕하세요 개발자님,
말씀해주신 내용은 뒤끝챗 인스턴스가 재시작되어 발생한 상황으로 확인됩니다.
간헐적으로 뒤끝챗 인스턴스가 재시작이 이루어질 수 있으며,
이 경우 재접속이 진행되도록 구성하여 주시면 됩니다.

@Ransiee 인스턴스 재시작때는 뒤끝 개발자
일반 채널 접속 종료 이벤트에 에러인포가 날라오나요? 어디 부분에서 에러인포가 날라오는지 알 수 있을까요?

OnLeaveChannel 및 OnGuildLeaveChannel 에서 다음이 아닌 경우로 봐주시면 될 것 같습니다. :D

ResetConnect()함수를 통해 로컬에서 강제로 접속을 끊었을 경우

ErrInfo.Category: Exception
ErrInfo.Detail: DisconnectFromLocal
ErrInfo.SocketError: Success

자기자신이나 다른 유저가 채널에서 퇴장할 경우

ErrInfo.Category: Success
ErrInfo.Detail: Success
ErrInfo.SocketError: Success

@Ransiee
적어주신 2가지 경우가 아닌 에러코드가 들어올 때 재접속 로직을 짜면 된다는건가요?
공지사항을 보니
서버 재시작은 평균 1~2분이 소요되며, 최대 5분 이후에는 뒤끝챗의 정상 이용이 가능합니다.
라고 적혀있던데 접속이 끊어지고 5분 후에 재접속 되게 하는게 베스트라는건가요?

네 맞습니다.
위의 경우가 아닌 에러의 경우 재접속 로직을 구성하여주시고,
5.7.0 버전부터 인스턴스 재시작 문제는 대폭 개선되어 3~5초 이내에 정상화가 이루어집니다.
적절하게 5~10초가량정도의 여유를 두고 재접속하는 로직으로 구성해 주시면 감사하겠습니다. :D

@Ransiee

else
    {
        // 에러가 발생했을 경우
        Debug.Log("퇴장 도중 에러가 발생했습니다 : " + args.ErrInfo.Reason);
        if (args.ErrInfo.Reason != null)
        {
           //재접속 로직
        }
    }

이 코드 부분에 로직을 짜면 될까요?
위에 적어주신 두가지 경우를 제외한 나머지가 args.ErrInfo.Reason String 값이 들어올때인거 같은데

네 맞습니다.

다만 재접속 로직이 수행되는 if문은 아래와 같이 두 경우를 제외하고 작동할 수 있도록 구성해주시는 것을 추천드립니다.

if(args.ErrInfo.Detail == "DisconnectFromLocal" || args.ErrInfo.Detail == "Success") {
 Debug.Log("성공적으로 채널 접속을 종료했습니다.");
}
else {
  //재접속 로직
}

@Hassan 뒤끝 채팅 관련 질문이있습니다. - yoon0020님의 글 #4

여기 게시글에 답변해주신걸 기준으로 다시 짜고 있습니다.
비동기쪽은 잘 모르겠어서 기존에 하던 동기방식으로 하면서 코드를 수정했는데

public void OnLeaveChannelCompleted(LeaveChannelEventArgs args)
    {
        Debug.Log(string.Format("OnLeaveChannel {0}", args.ErrInfo));

        if (args.ErrInfo == ErrorInfo.Success)
        {
            if (!args.Session.IsRemote) // 본인이 직접 퇴장한 경우
            {
                Debug.Log("채널에서 퇴장했습니다");
            }
            else // 다른 유저가 퇴장한 경우
            {
                Debug.Log(args.Session.NickName + "님이 퇴장했습니다");
            }
        }
        else
        {
            if (!args.Session.IsRemote)
            {
                // 에러가 발생했을 경우
                Debug.Log("퇴장 도중 에러가 발생했습니다 : " + args.ErrInfo.Reason);
                if (args.ErrInfo.Detail == ErrorCode.DisconnectFromLocal || args.ErrInfo.Detail == ErrorCode.Success)
                {
                    Debug.Log("성공적으로 채널 접속을 종료했습니다.");
                }
                else
                {
                    //재접속 로직
                    this.Invoke(delegate { CheckChatStatus(); }, 7f);
                }
            }
        }
    }
void CheckChatStatus()
    {
        var data = Backend.Chat.GetChatStatus();

        if (data.IsSuccess())
        {
            if (data.GetReturnValuetoJSON()["chatServerStatus"]["chatServer"].ToString().Equals("y"))
                LoadChannelList();
        }
        else Message.instance.On("채팅 서버 접속 실패\n인터넷 연결 상태를 확인해보세요.", CheckChatStatus);
    }
void LoadChannelList()
    {
        var data = Backend.Chat.GetGroupChannelList(groupName);

        if (data.IsSuccess())
        {
            JsonData rows = data.GetReturnValuetoJSON()["rows"];
            for (int i = 0; i < rows.Count; i++)
                channelDataList.Add(rows[i]);
            for (int i = 0; i < rows.Count; i++)
                if ((int)rows[i]["joinedUserCount"] < 200)
                    if (OnJoinChannel(rows[i]))
                    {
                        currentChannelIndex = i;
                        return;
                    }

            Message.instance.On("채팅 채널 접속 실패\n모든 채널에 자리가 없습니다.");
        }
        else Message.instance.On("채팅 채널 접속 실패\n인터넷 연결 상태를 확인해보세요.");
}
bool OnJoinChannel(JsonData data)
    {
        ErrorInfo info;
        ChannelType channelType = ChannelType.Public;
        string groupName = data["groupName"].ToString();
        string inDate = data["inDate"].ToString();
        string serverAddress = data["serverAddress"].ToString();
        ushort serverPort = (ushort)data["serverPort"];
        string alias = data["alias"].ToString();
        int joinedUserCount = (int)data["joinedUserCount"];
        int maxUserCount = (int)data["maxUserCount"];

        channelInfo = new ChannelInfo(channelType, groupName, inDate, joinedUserCount, maxUserCount, serverAddress, serverPort, alias);

        bool isJoin = Backend.Chat.JoinChannel(channelType, serverAddress, serverPort, groupName, inDate, out info);

        Debug.Log("isJoin : " + isJoin + ", Error Info : " + info);

        tryJoinCount++;
        if (info.Category != ErrorCode.Success)
        {
            Backend.Chat.ResetConnect(); // 해당 함수 요청시 OnLeaveChannel에 이벤트 발생(에러로 인해 재접속 시도)
            Debug.Log(info);
        }

        return isJoin;
    }

이대로면 문제없이 재접속 로직이 된걸까요?

네 프로세스상 정상적으로 작동될 것입니다.

다만 유저 또한 재접속 중에 수동으로 채널 접속이 가능하다면 JoinChannel이 중복으로 호출이 되서 에러가 발생할 수 있으니, 재접속동안에는 버튼을 비활성화시키거나, 재접속용 bool값을 통해 입력을 하더라도 프로세스가 진행되지 않도록 구성해주시는 것을 추천드립니다.