오늘의 목표
더보기
✔️ 채팅 서버 완성
⏱️ 오늘의 일정
채팅 서버 완성
📜 채팅 서버 완성
채팅 서버를 완성했다.
완성이라는 말이 거창하긴 하지만 ...
유저가 게임방을 생성하면 채팅방을 생성하고, 해당 채팅방으로 입장한다.
게임이 시작되면 엔터키를 이용해 채팅을 전송하고,
채팅을 전송한 유저가 속해 있는 방 유저들에게 채팅을 모두 전송한다.
ChattingServer Update
update() {
const now = performance.now();
const elapsed = now - this.lastExecutionTime;
if (elapsed >= this.updateTime) {
// JobQue에서 Job을 꺼내 패킷 처리
while (this.chattingServerJobQue.length > 0) {
const job = this.chattingServerJobQue.shift();
if (!job) {
console.log("job이 undefine");
break;
}
const jobHandler = getChattingServerJobHandlerByJobType(job.jobType);
jobHandler?.(job);
}
// 방 업데이트
this.rooms.forEach((room) => {
room.update();
});
this.lastExecutionTime = now - (elapsed % this.updateTime);
}
const delay = this.updateTime - (now - this.lastExecutionTime);
setTimeout(() => this.update(), delay);
}
update() 문을 돌면서 chattingServerJobQue에 Job이 들어오면,
Job을 꺼내고 jobHandler에게 전달해 Job을 처리한다.
chattingLoginJobHandler
// 채팅 서버 로그인
export const chattingLoginJobHandler = async (job: Job): Promise<void> => {
const userEmail = job.payload[0] as string;
const userSocket = job.payload[1] as CustomSocket;
const user: any = await DatabaseManager.getInstance().findUserByEmail(userEmail);
if (!user) {
return;
}
const loginUserNickName = user.nickname as string;
const newChattingUser = new ChattingUser(userSocket, userEmail, loginUserNickName);
ChattingServer.getInstance().getUsers().push(newChattingUser);
}
클라가 보낸 Email, 그리고 socket을 가져오고
DB에서 User에 대한 정보를 가져와 새로운 User를 생성해 저장한다.
chattingChatSendJobHandler
export const chattingChatSendJobHandler = (job: Job): void => {
const chattingRoom = job.payload[0] as ChattingRoom;
const chatMessageSendUser = job.payload[1] as ChattingUser;
const chatMessage = job.payload[2] as string;
const isFindUser = chattingRoom.userFind(chatMessageSendUser.getId());
if (isFindUser === undefined) {
console.log("chattingChatSendJobHandler User 없음");
return;
}
const chattingChatSendJob = new Job(config.jobType.CHATTING_CHAT_SEND_REQUEST_JOB, chatMessageSendUser, chatMessage);
chattingRoom.roomJobQue.push(chattingChatSendJob);
}
유저가 보낸 채팅 메세지를 재조립해 유저가 속한 Room의 JobQue에 넣는다.
Room Update
update() {
while (this.roomJobQue.length > 0) {
const job = this.roomJobQue.shift();
if (!job) {
console.log("job이 없음");
break;
}
switch (job.jobType) {
case config.jobType.CHATTING_CHAT_SEND_REQUEST_JOB:
const chattingSendUser = job.payload[0] as ChattingUser;
const chatMessage = job.payload[1] as string;
const chatSendResponse = {
nickName: chattingSendUser.getNickName(),
chatMessage
}
this.users.forEach((user: ChattingUser) => {
sendChattingPacket(user.getUserSocket(), config.chattingPacketType.CHATTING_CHAT_SEND_RESPONSE, chatSendResponse);
});
break;
}
}
}
update가 호출되면 roomJobQue에서 job을 꺼내 처리한다.
jobType이 CHATTING_CHAT_SEND_REQUEST_JOB라면
채팅 응답 메세지를 작성해 방에 있는 모든 유저들에게 전송한다.
chattingLeaveRoomJobHandler
export const chattingLeaveRoomJobHandler = (job: Job): void => {
const chattingLeaveRoomUser = job.payload[0] as ChattingUser;
const leaveChattingRoomId = chattingLeaveRoomUser.getJoinRoomId();
const leaveChattingRoom = ChattingServer.getInstance().getRoomByRoomId(leaveChattingRoomId);
if (leaveChattingRoom === undefined) {
console.log("퇴장하려는 채팅방이 없음");
return;
}
leaveChattingRoom.roomUserDelete(chattingLeaveRoomUser.getId());
}
유저가 게임에서 나가거나, 접속을 종료하면 채팅방에서 나간다.
'내일배움캠프' 카테고리의 다른 글
[내일배움캠프][TIL] 최종 프로젝트 진행 ( 채팅서버 구현 시작 ) (0) | 2024.11.26 |
---|---|
[내일배움캠프][TIL] 최종프로젝트 진행 ( 상점 기능 ) (0) | 2024.11.25 |
[내일배움캠프][TIL] 최종 프로젝트 진행 ( 몬스터 사망 보상 ) (0) | 2024.11.21 |
[내일배움캠프][TIL] 최종프로젝트 진행 ( 기본틀 완성 ) (0) | 2024.11.20 |
[내일배움캠프][TIL] 최종프로젝트 진행 ( 기본틀 부분완성 ) (0) | 2024.11.18 |