JoinChannel 호출 시 exception 발생 문의

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

  • 뒤끝 SDK 버전 : 5.7.0
  • 프로젝트명 : KnightRush
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :
  1. JoinChannel 에서 null exception 발생

전에도 null exception 이 간헐적으로 발생을 했었는데, 이번에 채팅 관련 코드를 다시 수정했는데도 여전히 에러가 발생하고 있습니다. 코드는 채팅샘플에 있는 것과 동일하게 작성했습니다.

ErrorInfo info;
Backend.Chat.JoinChannel(channelNode.type, channelNode.host, channelNode.port, channelNode.groupName, channelNode.inDate, out info);

                _reconnectChannel = channelNode;

                if(info.Category != ErrorCode.Success)
                {
                    _isJoiningChannel = false;
                }

현재 버그리포트 툴로 backtrace 를 사용하고 있는데, backtrace 에 잡힌 에러로그는 첨부한 이미지와 같습니다.

  1. JoinChannel 에서 exception 발생

TCP Client is working 이라는 exception 이 발생하고 있습니다.

안녕하세요 개발자님,
두 경우 모두 채팅 채널에 접속을 시도한 상태에서 접속이 완료되기 전 다시 채팅 채널에도 접속을 시도하는 경우 발생하는 문제입니다.

동일한 채널에 접속을 시도할 때, 다른 채널에 접속을 시도할 때 모두 발생할 수 있습니다.
채널에 접속되어 있지 않은데, 위 예외가 지속적으로 발생할 경우 채팅 서버 접속 초기화 함수를 호출하는 것을 추천합니다.

접속이 완료되기전이라 함은 OnJonChannel 이 오기전을 말씀하시는걸까요?
현재 채팅샘플에서와 동일하게 joiningChannel 변수에서 현재 접속 중인지 여부를 체크하여, JoinChannel 이 호출되고 나서야 joiningChannel 을 false 처리해주고 있습니다. 그렇기 때문에 접속이 완료되기 전 다시 채팅채널에 접속을 시도하는 경우는 없다고 보여지기는 합니다.

채팅샘플의 로직을 다시 살펴보니 OnJoinChannel 에서 joiningChannel 변수를 false 로 처리해주고 있는데,

if(info.Category != ErrorCode.Success)
{
    _isJoiningChannel = false;
}

위의 부분에서도 joiningChannel 변수를 false 로 해주고 있는데, 이 경우에는 OnJoinChannel 이 호출이 안되는 경우일까요?

접속이 완료되기전이라 함은 서버로부터 OnJoinChannel 이 오기 전이 맞습니다.

말씀해주신 if 문은 서버의 응답이 아닌 접속 요청(JoinChannel)이 잘 보내졌는지 확인 용도로 사용되는 코드입니다.
재접속 로직을 시도했을 때 요청이 잘 이루어졌는지 확인하기 위해 작성된 코드인 점 참고하여 주시면 감사하겠습니다.

그러면 ErrorInfo.Category != ErrorCode.Success 인 경우는 OnJoinChannel 이 호출안되는 경우라고 봐야할까요?

JoinChannel 에서 ErrorInfo.Success 가 확인되었다면
채팅 서버와 소켓 연결에 성공한 경우입니다.
이 상태는 단순히 소켓 연결에 성공한 것으로 아직 채팅 서버에 접속된 것이 아니며
이후 OnJoinChannel 이벤트가 발생하게 됩니다.

그러면 JoinChannel 함수 호출 이후 바로 isJoiningChannel 을 false 처리해주지 않는게 좋겠군요.
샘플 코드에서는 OnJoinChannel 이 호출되었을 경우 ChannelListManager 에서 SetIsJoiningChannel(false) 를 호출해 다시 JoinChannel 을 호출할 수 있도록 처리가 되어 있는데, JoinChannel 호출 이후 바로 IsJoiningChannel 을 false 로 할 경우 OnJoinChannel 이 호출되기전에 JoinChannel 을 호출하게 되는 상황이 발생할 것 같습니다.

한번 더 질문드립니다. 아래코드에서 JoinChannel 호출 이후 info.Category 가 ErrorCode.Success 가 아니면 OnJoinChannel 이 호출이 안되었다고 볼 수 있을까요? 채팅서버와 소켓연결에 성공하지 못했으니 OnJoinChannel 도 호출안되는걸까요?

ErrorInfo info;
Backend.Chat.JoinChannel(channelNode.type, channelNode.host, channelNode.port, channelNode.groupName, channelNode.inDate, out info);

if(info.Category != ErrorCode.Success)
{
    _isJoiningChannel = false;
}

JoinChannel 호출 후 ErrorCode.Success 외의 다른 값으로 리턴이 된다면
서버 접속 혹은 소켓 연결에 실패하는 경우에 해당하기에 OnJoinChannel 이 호출되지 않습니다.

답변 감사드립니다!

추가적인 질문이 있습니다.

  1. JoinChannel 에서 exception 이 발생할 경우, Backend.Chat.OnException 이 호출되는건가요? JoinChannel 을 try~catch 로 감쌀 경우 OnException 은 호출안되게 되겠죠?

  2. OnException 이 호출될 경우 해당 이벤트에서 ResetConnect 를 호출해주는게 맞을까요?

  1. 네 맞습니다. exception 이 발생하는 경우 Backend.Chat.OnException 이 호출됩니다.
    try~catch 를 적용해 주시면 호출이 되지 않습니다.

  2. 말씀해주신 것 처럼 진행해주시면 됩니다. :D