42-TRANSENDENCE / backend

transcendence backend
MIT License
1 stars 0 forks source link

전체 소켓, 게임 소켓 사이의 문제 발생. #131

Closed u-lo-l closed 1 year ago

u-lo-l commented 1 year ago

현재 게임 소켓과 전체 소켓을 분리하면서 문제가 발생함.

minjune8506 commented 1 year ago

socket id 로 찾을수 없으면 user id 로 찾으면 됩니다. player service 메소드 중에 getByUserId라는게 있어요 그걸로 찾을 수 있지 않을까요? @u-lo-l

u-lo-l commented 1 year ago

disconnect이벤트에도 값을 전달해줄 수 있나요? handledisconnected에서 알 수 있는게 game_socket밖에 없는 거 같은데 game_socket을 key로가지는게 없지 않아요?

minjune8506 commented 1 year ago

disconnect에 값을 전달해야할 일이 있나요..?

minjune8506 commented 1 year ago

init을 할때 users에 대한 정보를 채우지 말까요? ready할때 users 정보를 채우면 해결되지 않을까 싶은데.. 지금 로직으로는 ready도 정상적으로 작동 안되는게 맞아보이는데여..? ready할때 client socket의 id하고 init할때 id가 다른게 맞으니..

u-lo-l commented 1 year ago

image

ready에선 players를 users로 바꾸고, players는 game socket을 가지고 있도록 추가해줘서 처리했어요.

u-lo-l commented 1 year ago

image 위에서 말씀하신게 이거 맞나요?

u-lo-l commented 1 year ago

1.

  private games: Map<string, Game> = new Map();

지금 이렇게 자료구조 하나인데 <gameSocketId: string, roomId : string>Map을 하나 더 만들어서 GameService내에서 처리한다.

  1. PongClient에 gameSocketId를 가리키는 속성을 하나 만든다. Game에 들어가고 나올 때 이 값을 수정해주고, 이후 getByUserID에서
    getByUserId(id: number): PongClient {
      const values = this.clients.values();
      for (const pongClient of values) {
        if (pongClient.user.id === id) {
          return pongClient;
        }
        //여기서 추가 검사
        else if (pongClient.status === ClientStatus.INGAME
                 && pongClient.user.gameSocketid === id)
        {
          return pongClient;
        }
      }
      return null;
    }

    GameState == Ingame인 경우 gameSocketID도 비교한다.

================================================= 저는 두가지정도 생각나네요.

minjune8506 commented 1 year ago

제가 말한거랑은 다르긴한데.. game 소켓에 연결될때 그냥 다른 socket id를 가지고 있게 하려구요

u-lo-l commented 1 year ago

음. 잘 모르겠지만ㅜㅜ 알겠습니다. 코드로 짜여지면 다시 볼게요