채팅(python-socketio)
[Django] python-socketio 서버 연결 끊김 해결
coding232624
2024. 2. 25. 17:08
다른 페이지를 갔다 오거나 가끔 인터넷이 좋지 못해 소켓서버와의 연결이 끊기는 문제 발생
이 경우 원하는 결과는 다시 소켓서버를 연결하여 잠시 끊겼을때의 내용이 다시 보이며 내 메시지도 잘 보내져야함
=> 하지만 메시지가 보내지지도 받아지지도 않는 오류 발생
Socket.io에서 connect의 경우 자체적으로 연결이 끊겼을때 계속해서 연결을 다시 시도한다.
하지만 connect는 시도를 계속하지만 내 코드에서 채팅방에 입장하는 join의 경우 1번만 실행하는 것이 문제였다.
해결방법
- 클라이언트 단에서 연결이 끊겼을 경우 다시 소켓 서버와의 연결을 시도함
- 소켓 서버와 연결이 되었을 경우 서버에서 클라이언트로 연결이 되었다는 신호 전송
- 클라이언트에서 서버와 연결이 되었다는 신호를 받을 경우 방을 입장하도록 설정
- 해당 과정에서 방에 입장한 참가자의 수를 계산하기 위해 재입장인지 첫입장인지 판단하기 위해 cnt_join변수 추가
python-socketio(Django 비동기서버 코드 - asgi)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@sio.event
async def connect(sid, environ):
await sio.emit("connect", "connect")
@sio.event
async def join(sid, room_name):
await sio.enter_room(sid, room_name)
if room_name in rooms:
rooms[room_name] += 1
else:
rooms[room_name] = 1
await sio.emit("count", rooms[room_name], room=room_name)
@sio.event
async def join_again(sid, room_name):
await sio.enter_room(sid, room_name)
|
cs |
JS 클라이언트 코드(Socket.io)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
let socket = io.connect(
location.protocol + "//" + document.domain + ":" + location.port
);
let cnt_join = 0;
socket.on("connect", function (data) {
if (cnt_join == 0) {
socket.emit("join", room_name);
} else {
socket.emit("join_again", room_name);
}
cnt_join++;
});
|
cs |