오늘의 목표

더보기

✔️ 채팅 서버 완성


⏱️ 오늘의 일정

채팅 서버 완성


📜 채팅 서버 완성

 

채팅 서버를 완성했다. 

완성이라는 말이 거창하긴 하지만 ...

유저가 게임방을 생성하면 채팅방을 생성하고, 해당 채팅방으로 입장한다.

게임이 시작되면 엔터키를 이용해 채팅을 전송하고,

채팅을 전송한 유저가 속해 있는 방 유저들에게 채팅을 모두 전송한다.

 

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());
}

 

유저가 게임에서 나가거나, 접속을 종료하면 채팅방에서 나간다.

+ Recent posts