이제 배달원의 좌표를 줘야 하는데
어떻게 해야 하나 생각하다
결국 이것도 채팅방처럼
배달끼리 묶어서 방을 파면되는 거 아니야?
라는 결론에 도달했다
그래서 방을 만드는 원리를 찾아보았다
https://myhappyman.tistory.com/103?category=873296
1. 배달요청 처리(사장님)
배달요청(손님)->물건 픽업 완료 클릭-> 요청 db에 배달 방 번호부여(사장님) 배 달방 생성-> 배달 시작 버튼 클릭(사장님)->웹소켓 연결
->n번방에 배달이 종료될 때까지 위치정보 계속 전달
2. 배달조회(손님)
배달조회 페이지 입성(자동 웹소켓 연결)->db에 접속해 부여된 배달 방 번호 가져오기->배열에 넣기
어려워 보일 수 있는데 웹소켓 배열에 넣을 때
방 번호를 키값으로 넣어주면 된다
db세팅
delivery_rooms=매장이 만드는 배달 방이다
delivery_rooms_details=그 배달 방에 있는 손님들이다
테스트를 위해 대충 만들어준다
db내용에 따르면
1/2/3번 방이 있고
1번 방에는 11/17번 유저
2번 방에는 17/18번 유저가 있다
테스트 시 17번 유저는 1/2번 방 메시지를 모두 받아야 하고
나머지는 각자 있는 방의 메시지만 받아야 한다
3번 방은 회원이 입장한 회원이 없다고 세팅했으니 나오면 안 된다
afterConnectionEstablished
1. 회사 이용자
배달할 게 있는지 먼저 db를 다녀와야 한다
하지만 결제 테이블 없이 먼저 만들었으므로 나중에 추가해주자
2. 일반 이용자
actionAtUser(session, id);
이제 방에 입장해주자
actionAtUser
db에서 할당받은 방 번호를 가져온다List<Integer>roomIds=deliveryService.selectRoomIdByUserIdAndFlag(id,intenums.NOT_FLAG.get());
(물론 배달이 완료된 방 번호는 가져오지 않는다)
방이 있을 수도 있고 없을 수도 있다
만들어주거나
방 번호를 키값으로 배열을 map에 담아준다
roomList.put(roomId, room);
입장한다
room.add(makeRoomDetail(session, roomId, id));
소켓이 끊겼다 다시 들어온다면 세션정보를 갱신해준다
if(rd.get("userId").equals(id)){
map을 만들어 주는 함수
getLoginInfor
웹소켓 세션에서는 로그인 정보를 꺼내려면
비슷한 듯 다른 방법으로 꺼내야 했다
handleTextMessage
db에 있는 방 번호 모두에게 전송한다
(물론 배달이 완료된 방 번호는 가져오지 않는다)
테스트
배달 시작을 누르면 웹소켓이 연결되고
테스트 코드를 작성하고
(자바스크립트로 1초에 한 번씩 무언가 전송하는 코드를 써놓았다)
회원이 입장하는 말든 계속 보내고 있다
아주 좋다
11 회원 입장
입장 동시에 웹소켓이 연결되어 받아온다
1번 방에 있으니 1번 방 메시지만 아주 잘 받아오고 있다
18 회원 입장
2번 방에만 있는 손님이니
2번방 메시지만 잘 받고 있다
대망의 17번 손님
두방 다 속해 있으니
두 개의 메시지 모두 온다
문제가 있다..
손님쪽 로직은 잘만들어 졌는데
사장님 위치발송 로직을착각해서
모든 손님에게 메세지를 보내고 있다
예를들어
손님이 주문 했을때
매장에서 a/b 배달이 시작됐을때
손님이주문한 차량만 위치서비스를 받아야하는데
A/b 둘다 받게 된다
버그를 수정해 보자
'Springboot > WebSocket' 카테고리의 다른 글
Springboot WebSocketSession에서 파라미터 꺼내기 (0) | 2022.04.01 |
---|---|
Springboot WebSocket 배달방만들기!(2) (0) | 2022.01.28 |
springboot vue 소켓통신하기 2(전송) (0) | 2022.01.05 |
springboot vue 소켓통신하기 1(연결) (0) | 2022.01.05 |