I have a question very similar to this one: Send data every 10 seconds via socket.io
But: My server is written in Python, the client is in JavaScript
The goal:
- Clients connect to server via socket.io
- Clients receive push messages
ping
from server every n seconds - When a client sends a
ping
message, the server broadcasts apong
message
What works:
- Socket.io connection works fine
- Client
ping
is received by server, answered withpong
, which is again received by client - Server executes
ping_in_intervals
every 5 seconds
What doesn't work:
- When server executes
ping_in_intervals
(which triggers sending aping
), thatping
is not received by any client - When
ping_in_intervals
loop is active, socket connections crash every minute or so. If the method is commented out, then socket connection stays stable.
Observations:
- The thread, that
ping_in_intervals
is running in doesn't seem to properly work together with the wsgi server thread. - The
ping_in_intervals
thread destabilizes the server thred, causes it to loose connections (which are reestablished right away, but they do drop every minute or so) - I think, that I'm doing something terribly wrong with threading. I have very little experience with threading in Python and don't know, where to look for the problem
Server:
import eventlet
import socketio
import threading
sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet')
app = socketio.WSGIApp(sio)
def ping_in_intervals():
threading.Timer(5.0, ping_in_intervals).start()
print("send ping")
sio.emit('ping')
@sio.on('ping')
def ping(*args):
print("received ping - send pong")
sio.emit('pong')
ping_in_intervals()
eventlet.wsgi.server(eventlet.listen(('', 8080)), app)
Client:
const socket = io.connect('localhost:8080', {secure: true, transports: ['websocket']});
socket.on('pong', () => {
console.log('received pong');
});
socket.on('ping', () => {
console.log('received ping');
});
socket.on('connect', () => {
socket.emit('ping')
});