채팅 접속 오류 문의

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

  • 뒤끝 SDK 버전 : 5.7.0
  • 프로젝트명 : 다크니스

안녕하세요. 가끔씩 발생하는 문제로, 갑자기 이전 채팅이 불러와지고, 채팅 송신이 제대로 이루어지지 않는 문제가 발생하여 문의드립니다. 현재 채팅 구축은 이와 같이 이루어져 있습니다.

Start 호출

  • SearchChannel() : 채널 찾은 후 JoinChannel을 통해 채널 입장
 string groupName = "다크니스";
        string serverAddress = "";
        string alias = "";
        string inDate = "";
        ushort serverPort = 50000;

        BackendReturnObject bro = Backend.Chat.GetGroupChannelList(groupName);

        if (bro.IsSuccess())
        {
            var channels = bro.Rows();

            for (int i = 0; i < channels.Count; ++i)
            {
                // 순서대로 190명 이상 들어가 있지 않는 채널을 찾기
                var count = channels[i]["joinedUserCount"].ToString();
                var num = Convert.ToInt32(count);

                if (num >= 190)
                {
                    continue;
                }
                else
                {
                    // 들어갈 채널을 찾았으면 정보를 받고 채널 탐색 종료(break)
                    serverAddress = channels[i]["serverAddress"].ToString();
                    alias = channels[i]["alias"].ToString();
                    inDate = channels[i]["inDate"].ToString();
                    serverPort = ushort.Parse(channels[i]["serverPort"].ToString());
                    break;
                }
            }
            Debug.Log(string.Format("address  : {0} / groupName : {1} / inDate : {2} / alias : {3}", serverAddress, groupName, inDate, alias));

            // 얻은 인자 값으로 입장
            ErrorInfo errorInfo;
            Backend.Chat.JoinChannel(ChannelType.Public, serverAddress, 50000, groupName, inDate, out errorInfo);
            Debug.Log(errorInfo);
        }
        else
        {
            Debug.Log("Error to GetGroupChannelList: " + bro);
        }
  • ChatHandlers()
 Backend.Chat.SetRepeatedChatBlockMessage("도배하면 안돼요.");
        Backend.Chat.SetTimeoutMessage("오랜 시간 채팅을 하지 않아 퇴장되었습니다.");

        ChatScroll chatScroll = ChatScroll.Instance();

        // 채널에 입장시 해당 채널에 접속해있는 모든 게이머들의 정보이며, 입장시 최초 한번 콜백
        Backend.Chat.OnSessionListInChannel = (args) =>
        {
            List<string> nameList = new List<string>();
        };

        // 채널에서 퇴장 혹은 다른 게이머가 채널에서 퇴장하면 콜백
        Backend.Chat.OnLeaveChannel = (LeaveChannelEventArgs args) =>
        {
            // 퇴장한 사람을 참여자 목록에서 삭제

            // 내가 채널에서 퇴장한 경우
            if (!args.Session.IsRemote)
            {
                //chatScroll.RemoveAllPublicListViewItem();
            }
        }; 

        //클라이언트의 네트워크 상황이 좋지않거나, 어떠한 이유로 인해 Poll 함수가 주기적으로 호출되지 못한 경우 서버에서 해당 유저를 오프라인하고 이 때 콜백되는 함수
        Backend.Chat.OnSessionOfflineChannel = (SessionOfflineEventArgs args) =>
        {
            // 내가 채널에서 끊겼을 경우
            if (!args.Session.IsRemote)
            {
                chatItem = new ChatItem(SessionInfo.None, chatScroll.infoText, "채팅창 재접속을 시도합니다.", false);
                chatScroll.PopulatePublicChat(chatItem);
            }
        };

        //오프라인 상태에서 클라이언트의 네트워크 상황이 다시 좋아지거나, Poll 함수가 다시 주기적으로 호출되는 경우 서버에서 해당 유저를 온라인 처리하고 콜백되는 함수
        Backend.Chat.OnSessionOnlineChannel = (SessionOnlineEventArgs args) =>
        {
            // 내가 채널에 다시 접속될 경우
            if (!args.Session.IsRemote)
            {
                chatItem = new ChatItem(SessionInfo.None, chatScroll.infoText, "OnSessionOnlineChannel로 접속되었습니다", false);
                chatScroll.PopulatePublicChat(chatItem);
            }
        };

        // 채팅 왔을 때
        Backend.Chat.OnChat = (ChatEventArgs args) =>
        {
            if (args.ErrInfo == ErrorInfo.Success)
            {
                chatItem = new ChatItem(args.From, args.From.NickName, args.Message, args.From.IsRemote);
                chatScroll.PopulatePublicChat(chatItem);
            }
            else if (args.ErrInfo.Category == ErrorCode.BannedChat)
            {
                // 도배방지 메세지 
                if (args.ErrInfo.Detail == ErrorCode.BannedChat)
                {
                    chatItem = new ChatItem(SessionInfo.None, chatScroll.infoText, args.ErrInfo.Reason, false);
                    chatScroll.PopulatePublicChat(chatItem);
                }
            }

        };

        string NotificationNick;
        Backend.Chat.OnNotification = (NotificationEventArgs args) =>
        {
            NotificationNick = string.Format("[공지] {0}", args.Subject);
            chatItem = new ChatItem(SessionInfo.None, NotificationNick, args.Message, false, false, true);
            chatScroll.PopulateAll(chatItem);

        };
       
        Backend.Chat.OnRecentChatLogs = (RecentChatLogsEventArgs args) =>
        {
            string str = string.Empty;
            str += "OnRecentChatLogs\n";
            str += string.Format("ChannelType : {0}\n", args.channelType);
            str += string.Format("message Count : {0}\n\n", args.LogInfos.Count);

            //역순으로 출력
            for (int i = args.LogInfos.Count - 1; i >= 0; i--)
            {
                str += string.Format("NickName : [ {0} ] : \"{1}\"\n", args.LogInfos[i].NickName, args.LogInfos[i].Message);
                chatItem = new ChatItem(args.LogInfos[i].NickName, args.LogInfos[i].Message);
                chatScroll.PopulateRecentChat(args.channelType, chatItem);
            }
        };      

Update 호출

  • Backend.Chat.Poll();
  • Backend.AsyncPoll();

혹시 무슨 문제인지 알 수 있을까요?
만약 해당 내용으로 확인이 불가능하다면,
원격 기술지원 가능한지도 문의드립니다.

안녕하세요 개발자님,
뒤끝챗의 간헐적인 채팅 서버 인스턴스 재시작 과정에서 말씀해 주신 것과 같은 상황이 발생할 수 있습니다.

SDK 5.5.0 이상의 버전부터는 채팅 연결 끊김 이벤트인 OnSessionOfflineChannel 가 deprecated 되면서 지원이 중단되었으며,
일시적으로 채팅 서버와의 연결이 끊어졌을 경우 완전히 연결을 끊고 OnLeaveChannel 핸들러가 호출됩니다.

이후 JoinChannel을 통해 채널에 다시 입장하게 되는데
만약 뒤끝챗 튜토리얼을 통해 JoinChannel을 구현하셨다면 재접속 로직으로 인해 이전 채널 정보를 이용하여 재접속을 하게 되면서 채팅 내역을 다시 불러올 수 있습니다.

현재 준비중에 있는 뒤끝챗 신버전에서는 인스턴스 재시작 현상이 수정되어 제공될 예정입니다.