728x90
반응형
문제점 및 증상
python flask-socketio 패키지를 이용하여 SocketIO를 구현한 서버에 대하여,
브라우저의 자바스크립트 라이브러리에서는 정상적으로 잘 접속되어, 이벤트를 주고 받는데 아무런 문제가 없었습니다.
# reference : https://flask-socketio.readthedocs.io/en/latest/getting_started.html
# https://stackoverflow.com/questions/31647081/
# https://heodolf.tistory.com/125
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from socketio import Client
from threading import Thread
from time import sleep
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode='threading')
sio_client = Client()
@sio_client.event
def connect():
print("sio_client: I'm connected!")
@sio_client.event
def connect_error(data):
print("sio_client: The connection failed!")
@sio_client.event
def disconnect():
print("sio_client: I'm disconnected!")
def somefunction():
# some tasks
someotherfunction()
def someotherfunction():
print('threaded : someotherfunction()')
sleep(10)
sio_client.emit('message', 'my jsondata') # here occurs the error
sleep(5)
sio_client.emit('message', 'my jsondata') # here occurs the error
@app.before_first_request
def activate_job():
print('before_first_request : activate_job()')
if (sio_client != None):
sio_client.connect('http://localhost')
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def setupconnect():
# global someThread
print('socketio.on connected...')
# someThread = Thread(target=somefunction)
@socketio.on('message')
def handle_message(data):
print('received message: ' + data)
@socketio.on('my event')
def handle_my_custom_event(json):
print('received json: ' + str(json))
emit('REFRESH', 'SMA')
if __name__ == '__main__':
someThread = Thread(target=somefunction)
someThread.start()
socketio.run(app, host='0.0.0.0', port=80, use_reloader=False)
그런데, 위와 같이 python-socketio 의 Client를 이용하여, 접속할 경우 다음과 같은 오류가 발생하였습니다.
Traceback (most recent call last):
File "d:\Dev\Python\python-test\http\flask\socketio\basic-sio.py", line 52, in activate_job
sio_client.connect('http://localhost', wait_timeout = 1)
File "d:\Dev\Python\venv\ace\lib\site-packages\socketio\client.py", line 338, in connect
raise exceptions.ConnectionError(
socketio.exceptions.ConnectionError: One or more namespaces failed to connect
원인 분석 및 해결 방안
이것 저것 많은 자료를 찾아 보았으나, 딱 맞는 해결책을 찾지 못하던 와중에 Client.connect() 함수의 파라미터를 보면,
wait_timeout = 1 로 기본 접속 대기시간이 1초로 지정되어 있었습니다.
설마 이것 때문일까 하고, "wait_timeout" 값을 10으로 수정 후, 실행해 보았더니 정상적으로 잘 실행되었습니다. ㅠ.ㅠ
@app.before_first_request
def activate_job():
print('before_first_request : activate_job()')
if (sio_client != None):
sio_client.connect('http://localhost', wait_timeout = 10)
파이썬은 파라미터의 기본값을 매우 많이 사용하고 있으므로, 각 파라미터들도 다시 한 번 살펴봐야겠습니다.
참고자료
https://medium.com/swlh/implement-a-websocket-using-flask-and-socket-io-python-76afa5bbeae1 ; Implement a WebSocket Using Flask and Socket-IO(Python)
https://stackoverflow.com/questions/68687773/ ; python-socketio socketio.exceptions.ConnectionError: One or more namespaces failed to connect
'프로그래밍 > Python' 카테고리의 다른 글
[python] 클래스 타입 비교 (type, isinstance) (0) | 2021.09.30 |
---|---|
[python] PIP로 설치한 패키지 내부 디버깅하기 (in VSCode) (0) | 2021.09.29 |
flask RESTful API의 CORS 설정 (0) | 2021.09.09 |
CCITT CRC16 함수 (0) | 2021.09.06 |
[python] 크롬 브라우저 실행 방법 (0) | 2021.08.09 |