본문 바로가기
소프트웨어/파이썬

[파이썬] socket.io를 이용한 callback 함수

by 만들오 2022. 6. 1.
728x90
socket.io란?

브라우저에서 websocket 호환이 안되는 경우, 적절한 통신 방법으로 전환해 통신하는 라이브러리 입니다. 이제 대부분의 브라우저가 websocket을 사용할 수 있게 되었지만, 다양한 기능과 안정성으로 사용을 추천합니다.

 

callback 함수란?

특정 함수의 실행이 마무리 되면 호출하는 함수입니다. 통신에서 꼭 필요한 기능입니다.

 

Requirements
pip install aiohttp python-socketio

서버를 구동하기 위한 다양한 옵션이 있었는데, 저는 aiohttp를 사용했습니다.

 

Server.py
from aiohttp import web
import socketio
import os
import time

# 정적 호스팅 서버를 이용하기 위한 cors 옵션 추가.
# 별도 클라이언트를 띄워주지 않는다.
sio = socketio.AsyncServer(cors_allowed_origins="*")
app = web.Application()
sio.attach(app)

@sio.event
def connect(sid, environ):
    print("connect ", sid)

@sio.event
def disconnect(sid):
    print('disconnect ', sid)
    os._exit(1) #강제종료

@sio.event
def callback(sid, data):
    print(data)
    time.sleep(3)
    return "Here is your callback"

if __name__ == '__main__':
    web.run_app(app, host="localhost", port=8080)

* 2022.09.09 업데이트 - host와 port 지정 추가. os._exit(1)을 이용한 강제종료 추가

 

Client.html
<!DOCTYPE html>
<html>

<body>
    <button onclick="requestCallback()">Button</button>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.3/socket.io.min.js"></script>
<script>
    const socket = io("http://localhost:8080", {
        autoConnect : false,
        reconnection : false
    });
    socket.on('connect', () => {
        console.log(`connect ${socket.id}`);
    });

    socket.on('disconnect', () => {
        console.log(`disconnect ${socket.id}`);
    });

    const requestCallback = () => {
        socket.emit("callback", "need callback", response => console.log(response));
    }

</script>
</html>

* 2022.09.09 업데이트 - autoConnect, reconnection 기능 추가.

 

기타

Github를 이용한 정적호스팅을 이용해 접속할 예정이므로, 클라이언트를 띄워주지 않도록 했습니다.

예전에 리니지W 웹버전으로 개발할 당시 websocket의 연결 끊김문제 해결과 코드 간결화를 위해 알아본 내용을 정리한 글 입니다. 

[끝].

댓글