Search code examples
javascriptpythonsocketswebsocketpython-socketio

Python Socketio not connecting with JavaScript socket.io-client


I want to simply connect socket.io-client to python server, but for some reason it's keep failing. Initially I start my python server and then try to connect JavaScript as my client server after following that process what I see is JavaScript client server is keep trying to connect and failing with following error:

websocket.js:88 WebSocket connection to 'ws://localhost:5100/socket.io/?EIO=4&transport=websocket' failed:

and python server also repeating following error:

(10448) accepted ('127.0.0.1', 61471) 127.0.0.1 - - [01/Feb/2022 15:14:01] "GET /socket.io/?EIO=4&transport=websocket HTTP/1.1" 400 136 0.000000

I am using python3.10 with socketio following Document:

https://python-socketio.readthedocs.io/en/latest/.

Also tried version compatibility:

https://pypi.org/project/python-socketio/

pip3 freeze

I have tried multiple version for python-engineio and python-socketio to match my socket.io-client but no improvements.

eventlet==0.33.0
python-engineio==3.13.0
python-socketio==4.6.1

server.py

import eventlet
import socketio

sio = socketio.Server()
app = socketio.WSGIApp(sio)

@sio.event
def connect(sid, environ):
    print('[INFO] Connect to client', sid)

@sio.event
def disconnect(sid):
    print('disconnect ', sid)

#ESI.local 192.168.2.95
if __name__ == '__main__':
    eventlet.wsgi.server(eventlet.listen(('0.0.0.0', 5100)), app)

   

HTML/JavaScript

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<h1>Socket IO Demo</h1>
    <script type="module">
        import { io } from "https://cdn.socket.io/4.3.2/socket.io.esm.min.js";
        
        const sio = io("http://localhost:5100:", {
            forceJSONP: true,
            secure: true,
            jsonp: true,
            transports: [ "websocket","polling"]
        });

        sio.on("connect", () => {
            console.log("connected");
        });

        sio.on("disconnect", () => {
            console.log("Disconnected");
        });
    </script>
</body>
</html>

Solution

  • After many trial and error. I have finally cracked it. This was happening due to CORS even though I used CORS google extension to handle this situation, but I guess this was supposed to be handled on backend. Simply passing (cors_allowed_origins="*") to socketio.Server() it fixed everything.

    sio = socketio.Server(cors_allowed_origins="*")