Skip to content

Commit 5633917

Browse files
added server disconnect support
1 parent cbb1a82 commit 5633917

File tree

5 files changed

+48
-7
lines changed

5 files changed

+48
-7
lines changed

example/app.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,15 @@ def send_room_message(sid, message):
7777
room=message['room'], namespace='/test')
7878

7979

80+
@socketio.on('disconnect request', namespace='/test')
81+
def disconnect_request(sid):
82+
socketio.disconnect(sid, namespace='/test')
83+
84+
8085
@socketio.on('connect', namespace='/test')
8186
def test_connect(sid, environ):
82-
socketio.emit('my response', {'data': 'Connected', 'count': 0}, room=sid)
87+
socketio.emit('my response', {'data': 'Connected', 'count': 0}, room=sid,
88+
namespace='/test')
8389

8490

8591
@socketio.on('disconnect', namespace='/test')

example/templates/index.html

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
namespace = '/test';
1010
var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
1111

12-
socket.on('my response', function(msg) {
13-
$('#log').append('<br>Received: ' + msg.data);
14-
});
1512
socket.on('connect', function() {
1613
socket.emit('my event', {data: 'I\'m connected!'});
1714
});
15+
socket.on('my response', function(msg) {
16+
$('#log').append('<br>Received: ' + msg.data);
17+
});
1818

1919
// event handler for server sent data
2020
// the data is displayed in the "Received" section of the page
@@ -79,6 +79,9 @@ <h2>Send:</h2>
7979
<input type="text" name="close_room" id="close_room" placeholder="Room Name">
8080
<input type="submit" value="Close Room">
8181
</form>
82+
<form id="disconnect" method="POST" action="#">
83+
<input type="submit" value="Disconnect">
84+
</form>
8285
<h2>Receive:</h2>
8386
<div><p id="log"></p></div>
8487
</body>

socketio/base_manager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ def get_participants(self, namespace, room):
2727
self._clean_rooms()
2828

2929
def connect(self, sid, namespace):
30-
"""Record a client connection to a namespace."""
30+
"""Register a client connection to a namespace."""
3131
self.enter_room(sid, namespace, None)
3232
self.enter_room(sid, namespace, sid)
3333

3434
def disconnect(self, sid, namespace):
35-
"""Record a client disconnect event."""
35+
"""Register a client disconnect event."""
3636
if namespace == '/':
37-
namespace_list = list(six.iterkeys(self.rooms))
37+
namespace_list = list(self.get_namespaces())
3838
else:
3939
namespace_list = [namespace]
4040
for n in namespace_list:

socketio/server.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,23 @@ def rooms(self, sid, namespace=None):
246246
namespace = namespace or '/'
247247
return self.manager.get_rooms(sid, namespace)
248248

249+
def disconnect(self, sid, namespace=None):
250+
"""Disconnect a client.
251+
252+
:param sid: Session ID of the client.
253+
:param namespace: The Socket.IO namespace to disconnect. If this
254+
argument is omitted the default namespace is used.
255+
"""
256+
self.logger.info('Disconnecting %s]', sid)
257+
if namespace is None or namespace == '/':
258+
for namespace in self.manager.get_namespaces():
259+
self._send_packet(sid, packet.Packet(packet.DISCONNECT,
260+
namespace=namespace))
261+
else:
262+
self._send_packet(sid, packet.Packet(packet.DISCONNECT,
263+
namespace=namespace))
264+
self.manager.disconnect(sid, namespace=namespace)
265+
249266
def handle_request(self, environ, start_response):
250267
"""Handle an HTTP request from the client.
251268

tests/test_server.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,21 @@ def test_invalid_callback(self, eio):
345345
self.assertRaises(ValueError, s._handle_eio_message, '123',
346346
'32["foo",2]')
347347

348+
def test_disconnect_all(self, eio):
349+
s = server.Server()
350+
s._handle_eio_connect('123', 'environ')
351+
s._handle_eio_message('123', '0/foo')
352+
s.disconnect('123')
353+
s.eio.send.assert_any_call('123', '1/foo', binary=False)
354+
s.eio.send.assert_any_call('123', '1', binary=False)
355+
356+
def test_disconnect_namespace(self, eio):
357+
s = server.Server()
358+
s._handle_eio_connect('123', 'environ')
359+
s._handle_eio_message('123', '0/foo')
360+
s.disconnect('123', namespace='/foo')
361+
s.eio.send.assert_any_call('123', '1/foo', binary=False)
362+
348363
def test_logger(self, eio):
349364
s = server.Server(logger=False)
350365
self.assertEqual(s.logger.getEffectiveLevel(), logging.ERROR)

0 commit comments

Comments
 (0)