프로그래밍/Python

[python] socketio Clinet : One or more namespaces failed to connect error

채윤아빠 2021. 9. 28. 17:42
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