on
[python] socketio Clinet : One or more namespaces failed to connect...
[python] socketio Clinet : One or more namespaces failed to connect...
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
from http://hbesthee.tistory.com/1904 by ccl(A) rewrite - 2021-09-28 18:00:25