Skip to content

Commit 53d10d9

Browse files
asyncio support
1 parent 6c93f7f commit 53d10d9

21 files changed

Lines changed: 691 additions & 13 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,7 @@ venv*
4040
.eggs
4141
.ropeproject
4242
.idea
43+
.vscode
44+
tags
4345
htmlcov
4446
*.swp

.travis.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
language: python
22
matrix:
33
include:
4-
- python: 2.7
5-
env: TOXENV=flake8
64
- python: 3.6
75
env: TOXENV=flake8
86
- python: 2.7
@@ -15,7 +13,7 @@ matrix:
1513
env: TOXENV=py36
1614
- python: pypy
1715
env: TOXENV=pypy
18-
- python: 2.7
16+
- python: 3.6
1917
env: TOXENV=docs
2018
install:
2119
- pip install tox

examples/aiohttp/app.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import asyncio
2+
3+
from aiohttp import web
4+
5+
import socketio
6+
7+
sio = socketio.AsyncServer(async_mode='aiohttp')
8+
app = web.Application()
9+
sio.attach(app)
10+
11+
12+
async def background_task():
13+
"""Example of how to send server generated events to clients."""
14+
count = 0
15+
while True:
16+
await asyncio.sleep(10)
17+
count += 1
18+
await sio.emit('my response', {'data': 'Server generated event'},
19+
namespace='/test')
20+
21+
22+
async def index(request):
23+
with open('app.html') as f:
24+
return web.Response(text=f.read(), content_type='text/html')
25+
26+
27+
@sio.on('my event', namespace='/test')
28+
async def test_message(sid, message):
29+
await sio.emit('my response', {'data': message['data']}, room=sid,
30+
namespace='/test')
31+
32+
33+
@sio.on('my broadcast event', namespace='/test')
34+
async def test_broadcast_message(sid, message):
35+
await sio.emit('my response', {'data': message['data']}, namespace='/test')
36+
37+
38+
@sio.on('join', namespace='/test')
39+
async def join(sid, message):
40+
sio.enter_room(sid, message['room'], namespace='/test')
41+
await sio.emit('my response', {'data': 'Entered room: ' + message['room']},
42+
room=sid, namespace='/test')
43+
44+
45+
@sio.on('leave', namespace='/test')
46+
async def leave(sid, message):
47+
sio.leave_room(sid, message['room'], namespace='/test')
48+
await sio.emit('my response', {'data': 'Left room: ' + message['room']},
49+
room=sid, namespace='/test')
50+
51+
52+
@sio.on('close room', namespace='/test')
53+
async def close(sid, message):
54+
await sio.emit('my response',
55+
{'data': 'Room ' + message['room'] + ' is closing.'},
56+
room=message['room'], namespace='/test')
57+
sio.close_room(message['room'], namespace='/test')
58+
59+
60+
@sio.on('my room event', namespace='/test')
61+
async def send_room_message(sid, message):
62+
await sio.emit('my response', {'data': message['data']},
63+
room=message['room'], namespace='/test')
64+
65+
66+
@sio.on('disconnect request', namespace='/test')
67+
async def disconnect_request(sid):
68+
await sio.disconnect(sid, namespace='/test')
69+
70+
71+
@sio.on('connect', namespace='/test')
72+
async def test_connect(sid, environ):
73+
await sio.emit('my response', {'data': 'Connected', 'count': 0}, room=sid,
74+
namespace='/test')
75+
76+
77+
@sio.on('disconnect', namespace='/test')
78+
def test_disconnect(sid):
79+
print('Client disconnected')
80+
81+
82+
app.router.add_static('/static', 'static')
83+
app.router.add_get('/', index)
84+
85+
86+
if __name__ == '__main__':
87+
asyncio.ensure_future(background_task())
88+
web.run_app(app)

examples/aiohttp/latency.html

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<!doctype html>
2+
<html>
3+
<head>
4+
<title>Socket.IO Latency</title>
5+
<link rel="stylesheet" href="/static/style.css" />
6+
</head>
7+
<body>
8+
<h1>Socket.IO Latency <span id="latency"></span></h1>
9+
<h2 id="transport">(connecting)</h2>
10+
<canvas id="chart" height="200"></canvas>
11+
12+
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"></script>
13+
<script src="//cdnjs.cloudflare.com/ajax/libs/smoothie/1.27.0/smoothie.js"></script>
14+
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
15+
<script>
16+
// socket
17+
var socket = io.connect('http://' + document.domain + ':' + location.port);
18+
var char = $('chart').get(0);
19+
socket.on('connect', function() {
20+
if (chart.getContext) {
21+
render();
22+
window.onresize = render;
23+
}
24+
send();
25+
});
26+
socket.on('pong_from_server', function() {
27+
var latency = new Date - last;
28+
$('#latency').text(latency + 'ms');
29+
if (time)
30+
time.append(+new Date, latency);
31+
setTimeout(send, 100);
32+
});
33+
socket.on('disconnect', function() {
34+
if (smoothie)
35+
smoothie.stop();
36+
$('#transport').text('(disconnected)');
37+
});
38+
39+
var last;
40+
function send() {
41+
last = new Date;
42+
socket.emit('ping_from_client');
43+
$('#transport').text(socket.io.engine.transport.name);
44+
}
45+
46+
// chart
47+
var smoothie;
48+
var time;
49+
function render() {
50+
if (smoothie)
51+
smoothie.stop();
52+
chart.width = document.body.clientWidth;
53+
smoothie = new SmoothieChart();
54+
smoothie.streamTo(chart, 1000);
55+
time = new TimeSeries();
56+
smoothie.addTimeSeries(time, {
57+
strokeStyle: 'rgb(255, 0, 0)',
58+
fillStyle: 'rgba(255, 0, 0, 0.4)',
59+
lineWidth: 2
60+
});
61+
}
62+
</script>
63+
</body>
64+
</html>

examples/aiohttp/latency.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from aiohttp import web
2+
3+
import socketio
4+
5+
sio = socketio.AsyncServer(async_mode='aiohttp')
6+
app = web.Application()
7+
sio.attach(app)
8+
9+
10+
async def index(request):
11+
with open('latency.html') as f:
12+
return web.Response(text=f.read(), content_type='text/html')
13+
14+
15+
@sio.on('ping_from_client')
16+
async def ping(sid):
17+
await sio.emit('pong_from_server', room=sid)
18+
19+
20+
app.router.add_static('/static', 'static')
21+
app.router.add_get('/', index)
22+
23+
24+
if __name__ == '__main__':
25+
web.run_app(app)
File renamed without changes.

0 commit comments

Comments
 (0)