문의 응대 : 평일 오전 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();
혹시 무슨 문제인지 알 수 있을까요?
만약 해당 내용으로 확인이 불가능하다면,
원격 기술지원 가능한지도 문의드립니다.