뒤끝 채팅 관련 질문이있습니다.

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

  1. 오래 핸드폰을 방치하다 보면 항상 채팅이 끊기는데요… 재 접속 요청을 해도 재 접속이 되지 않습니다
    대부분 코드는 뒤끝 채팅 튜토리얼에서 있는 내용 그대로 가져왔습니다.


  1. 채팅이 끊겼을 때는 이벤트가 발생되지 않게 아래와 같이 체크를 하고 있는데
    정상적으로 확인이 안되는 것 같습니다.

안녕하세요 개발자님.

1번 코드의 경우, 뒤끝 채널 접속 중 내부에서 발생하는 에러(JoinChannel 시도시에 out ErrorInfo에서 error가 발생할 경우 접속되지 않습니다)에는 재접속이 되지 않을 것으로 예상됩니다.
해당 부분에도 재접속 하도록 로직을 추가해주심 될 것 같습니다.

2번 코드의 경우, 접속 시도중인 직후 나 에러가 발생하여 접속이 종료되는 도중에는 정상적으로 작동하지 않을 수 있습니다. 확실히 구분하고자 할 경우에는 직접 bool값을 이용하여 OnLeaveChannel 시에는 false를 주고, OnJoinChannel에는 true를 주어 직접 확인하는 로직을 추가하여 사용해주심 될 것 같습니다.

추가적으로 챗의 경우 동기코드로 되어있는데, 동기 코드는 호출 시 응답까지 잠시 멈출 수 있으므로 SendQueue의 비동기 형식으로 이용하는 것을 추천드립니다.

아래 코드 참고하여 로직 추가해주시면 감사하겠습니다.

int tryJoinCount = 0;
bool isPublicChatConnect = false;

Backend.Chat.OnLeaveChannel = () =>
{
   if(args.ErrInfo != ErrorInfo.Success)
   {
      if(!args.Session.IsRemote)
      {
           isPublicChatConnect = false;
           if(tryJoinCount < 3) // 반복되는 에러로 인해 버벅거림이 발생할 수 있으므로3번까지 시도
           { 
                  // 기존 재접속 코드
           }
      }
   }
}

Backend.Chat.OnJoinChannel= () =>
{
   if(args.ErrInfo == ErrorInfo.Success)
   {
      if(!args.Session.IsRemote) // 내가 접속할 경우
      {
           tryJoinCount = 0; // 접속이 되었으니 초기화
           isPublicChatConnect = true;
      }
   }
}

void SearchChannel()
{
   SendQueue.Enqueue(Backend.Chat.GetGroupChannelList, ChannelName, bro => { // 동기로 할 경우, 버벅거림 현상을 느낄 수 있음
         if(bro.IsSuccess())
         {
             //이하 if(bro.IsSuccess) 로직
            tryJoinCount++;
            ErrorInfo errorInfo;
            Backend.Chat.JoinChannel(--, errorInfo);

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

2번

if(isPublicChatConnect && is_WeaponChange == true)
좋아요 1

친절한 설명 정말 감사드립니다. 답변도 정말 제가 궁금했던 것만 핵심적으로 알려주셨네요… 정말 감사드립니다!

좋아요 1

혹시 하나만 여쭤봐도 될까요? 코드 안에 info 라는 변수가 있는데 어떤 변수가 선언되었는지 본문에 안나와서요… ㅠㅠㅠ 혹시나 if(info != ErrorInfo.Success) 를 if(errorInfo != ErrorInfo.Success)로 수정하였는데 접속을 성공적으로 진행하였는데도, 계속 조건문에 있는 내용을 호출하는 현상이 생깁니다.

그래서 if(errorInfo.SocketErrorCode != System.Net.Sockets.SocketError.Success)로 수정하였는데 잘 되는것 같은데 이렇게 써도 안정성에 문제 없는지요??..ㅎㅎ

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

잘못된 정보 제공드려 죄송합니다.
해당 구분 또한 대부분의 에러는 캐치할 수 있지만 일부 안되는 오류가 존재합니다.

errorInfo.SocketErrorCode != System.Net.Sockets.SocketError.Success

그러므로 해당 부분은 아래와 같이 수정해주시기 바랍니다.

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