C.W.K.
Stream
Lesson 02 of 07 · published

Room & Channel

~12 min · management, rooms, channels

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Room 은 서버 쪽 grouping

'Room' 은 서버가 connection grouping 에 쓰는 임의의 string. 그 string 에 send → 거기 구독 중인 모두 receive. 브라우저는 room 의 존재 모름 — 서버가 gatekeeper.

Room 깔끔하게 switch

한 connection 안에서 user 가 room 사이 옮기는 거 (Slack, Discord) 강력한 UX. 서버 패턴: switch_room message 받음 → manager 에서 disconnect (WebSocket 자체는 보존) → 새 room 으로 connect 또. 같은 물리 connection, 두 logical 멤버십.

Channel vs room

일부 라이브러리가 'room' (loose grouping) 과 'channel' (named, 종종 persistent broadcast topic) 을 구분. 구현은 동일; 구분은 개념적. 한 용어 골라서 codebase 에서 일관 유지.

Code

Switch 지원하는 room 기반 handler·python
@app.websocket('/ws/{room}')
async def chat(websocket: WebSocket, room: str):
    user_id = websocket.query_params.get('user_id', 'anon')
    await manager.connect(websocket, user_id, room)

    await manager.broadcast(room, {
        'type': 'user.joined',
        'data': {'user_id': user_id, 'room': room,
                 'online': manager.room_users(room)},
    }, exclude=websocket)

    try:
        async for msg in websocket.iter_json():
            t = msg.get('type')
            if t == 'switch_room':
                old_room = manager.ws_meta[websocket]['room']
                new_room = msg['data']['room']
                manager.disconnect(websocket)
                await manager.connect(websocket, user_id, new_room)
                await manager.broadcast(old_room, {
                    'type': 'user.left',
                    'data': {'user_id': user_id},
                })
            elif t == 'chat.message':
                await manager.broadcast(
                    manager.ws_meta[websocket]['room'],
                    {'type': 'chat.message', 'data': {**msg['data'], 'from': user_id}},
                    exclude=websocket,
                )
    except WebSocketDisconnect:
        room = manager.ws_meta.get(websocket, {}).get('room', room)
        manager.disconnect(websocket)
        await manager.broadcast(room, {
            'type': 'user.left',
            'data': {'user_id': user_id},
        })

External links

Exercise

Room 사이드바 (general, random, support) UI 짜. room 클릭 시 기존 WebSocket 통해 switch_room 보내. dev tools 에서 새 WebSocket connection 안 열리고 같은 거 재사용 되는 거 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.