Skip to content

Commit 6d8f7d4

Browse files
committed
Refactoring websocket client
1 parent 290b778 commit 6d8f7d4

File tree

10 files changed

+104
-99
lines changed

10 files changed

+104
-99
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
"http-client": "babel-node src/clients/http/http_client.js",
77
"axios-client": "babel-node src/clients/http/axios_client.js",
88
"fetch-client": "babel-node src/clients/http/fetch_client.js",
9-
"superagent-client": "babel-node src/clients/http/superagent_client.js"
9+
"superagent-client": "babel-node src/clients/http/superagent_client.js",
10+
"socketio-client": "babel-node src/clients/ws/socketio_client.js",
11+
"websocket-client": "babel-node src/clients/ws/websocket_client.js"
1012
},
1113
"repository": {
1214
"type": "git",

src/clients/config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export const {
66
iters = 10000
77
} = argv
88

9-
export const serverUrl = `http://${host}:${port}/greeting`
9+
export const httpApi = `http://${host}:${port}/greeting`
10+
export const wsApi = `ws://${host}:${port}/greeting`

src/clients/http/axios_client.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import axios from 'axios'
2-
import { host, port, serverUrl, iters } from '../config'
2+
import { host, port, httpApi, iters } from '../config'
33
import PerformanceTimer from '../PerformanceTimer'
44
import { randomName } from '../utils'
55

@@ -12,10 +12,10 @@ export async function runTest() {
1212

1313
timer.start()
1414

15-
// async loop
1615
let i = iters
1716
await (async function asyncLoop() {
18-
const response = await axios.post(serverUrl, { name: randomName() })
17+
const postData = { name: randomName() }
18+
const response = await axios.post(httpApi, postData)
1919
const { greeting } = response.data
2020

2121
if (--i === 0) {

src/clients/http/fetch_client.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import fetch from 'node-fetch'
2-
import { host, port, serverUrl, iters } from '../config'
2+
import { host, port, httpApi, iters } from '../config'
33
import PerformanceTimer from '../PerformanceTimer'
44
import { randomName } from '../utils'
55

@@ -8,8 +8,7 @@ export async function runTest() {
88

99
const requestInit = {
1010
method: 'POST',
11-
headers: { 'Content-Type': 'application/json' },
12-
body: JSON.stringify({ name: randomName() })
11+
headers: { 'Content-Type': 'application/json' }
1312
}
1413

1514
const timer = new PerformanceTimer()
@@ -18,10 +17,10 @@ export async function runTest() {
1817

1918
timer.start()
2019

21-
// async loop
2220
let i = iters
2321
await (async function asyncLoop() {
24-
const response = await fetch(serverUrl, requestInit)
22+
const body = JSON.stringify({ name: randomName() })
23+
const response = await fetch(httpApi, {...requestInit, body})
2524
const data = await response.json()
2625
const { greeting } = data
2726

src/clients/http/http_client.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import http from 'http'
2-
import { host, port, serverUrl, iters } from '../config'
2+
import { host, port, iters } from '../config'
33
import PerformanceTimer from '../PerformanceTimer'
44
import { Deferred, randomName } from '../utils'
55

@@ -41,8 +41,6 @@ export async function runTest() {
4141
method: 'POST',
4242
headers: { 'Content-Type': 'application/json' }
4343
}
44-
45-
const postData = JSON.stringify({ name: randomName() })
4644

4745
const timer = new PerformanceTimer()
4846

@@ -52,6 +50,7 @@ export async function runTest() {
5250

5351
let i = iters
5452
await (async function asyncLoop() {
53+
const postData = JSON.stringify({ name: randomName() })
5554
const data = await request(reqOptions, postData)
5655
const { greeting } = data
5756

src/clients/http/superagent_client.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import superagent from 'superagent'
2-
import { host, port, serverUrl, iters } from '../config'
2+
import { host, port, httpApi, iters } from '../config'
33
import PerformanceTimer from '../PerformanceTimer'
44
import { randomName } from '../utils'
55

@@ -12,12 +12,12 @@ export async function runTest() {
1212

1313
timer.start()
1414

15-
// async loop
1615
let i = iters
1716
await (async function asyncLoop() {
17+
const postData = { name: randomName() }
1818
const response = await superagent
19-
.post(serverUrl)
20-
.send({ name: randomName() })
19+
.post(httpApi)
20+
.send(postData)
2121
const { greeting } = response.body
2222

2323
if (--i === 0) {

src/clients/ws/socketio_client.js

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,48 @@
11
#!/usr/bin/env node
22

3-
const { PerformanceObserver, performance } = require('perf_hooks')
4-
const io = require('socket.io-client')
5-
import { randomName } from '../utils'
6-
7-
const host = process.env.HOST || '0.0.0.0'
8-
const port = process.env.PORT || 5000
9-
const server = process.env.SERVER || 'unknown'
10-
const wsApi = `ws://${host}:${port}/greeting`
11-
12-
let iters = 10000
3+
import io from 'socket.io-client'
4+
import { host, port, httpApi, iters } from '../config'
5+
import PerformanceTimer from '../PerformanceTimer'
6+
import { Deferred, randomName } from '../utils'
137

148
async function runTest() {
15-
console.log(`SocketIO client <===> ${server} server on ws://${host}:${port}/greeting`)
9+
console.log(`SocketIO client connecting to http://${host}:${port}`)
1610

17-
const socket = io(wsApi, { transports: ['websocket'] })
11+
const timer = new PerformanceTimer()
12+
const connect = new Deferred()
13+
const socket = io(httpApi, { transports: ['websocket'] })
14+
15+
socket.on('connect', () => connect.resolve())
16+
socket.on('connect_error', err => connect.reject(err))
17+
18+
try {
19+
await connect.promise
1820

19-
socket.on('connect', () => {
2021
console.log(`Running test with ${iters} iterations...`)
2122

22-
function requestGreeting() {
23-
socket.send({ name: randomName() })
24-
}
25-
23+
const requestGreeting = () => socket.send({ name: randomName() })
24+
2625
socket.on('message', data => {
2726
const { greeting } = data
28-
27+
2928
if (--iters > 0) {
3029
requestGreeting()
3130
} else {
32-
performance.mark('END')
33-
performance.measure('START to END', 'START', 'END')
34-
31+
console.log(`Last greeting: ${greeting}`)
32+
timer.end()
3533
socket.close()
3634
}
3735
})
38-
39-
performance.mark('START')
40-
36+
37+
timer.start()
38+
4139
requestGreeting()
42-
})
43-
}
4440

45-
const obs = new PerformanceObserver(items => {
46-
console.log('End test')
47-
console.log(`Duration: ${items.getEntries()[0].duration}`)
48-
performance.clearMarks()
49-
})
50-
51-
obs.observe({ entryTypes: ['measure'] })
41+
} catch(err) {
42+
console.error('Error connecting')
43+
socket.close()
44+
}
45+
}
5246

5347
if (require.main === module) {
5448
runTest()
File renamed without changes.

src/clients/ws/websocket_client.js

Lines changed: 48 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,70 @@
11
#!/usr/bin/env node
22

3-
const { PerformanceObserver, performance } = require('perf_hooks')
4-
const WebSocketClient = require('websocket').client
5-
import { randomName } from '../utils'
3+
import { client as WebSocketClient} from 'websocket'
4+
import { host, port, wsApi, iters } from '../config'
5+
import PerformanceTimer from '../PerformanceTimer'
6+
import { Deferred, randomName } from '../utils'
67

7-
const host = process.env.HOST || '0.0.0.0'
8-
const port = process.env.PORT || 5000
9-
const server = process.env.SERVER || 'unknown'
10-
const wsApi = `ws://${host}:${port}/greeting`
8+
function createRequester(connection) {
9+
const requester = {
10+
incoming: null,
11+
greeting(data) {
12+
// new incoming message on the way
13+
const incoming = requester.incoming = new Deferred()
14+
connection.sendUTF(JSON.stringify(data))
15+
return incoming.promise
16+
}
17+
}
1118

12-
let iters = 10000
19+
return requester
20+
}
1321

1422
async function runTest() {
15-
console.log(`websocket client <===> ${server} server on ws://${host}:${port}/greeting`)
23+
console.log(`websocket client connecting to ws://${host}:${port}/greeting`)
1624

25+
const timer = new PerformanceTimer()
26+
const connect = new Deferred()
1727
const client = new WebSocketClient()
1828

19-
client.on('connect', connection => {
29+
client.on('connect', connection => connect.resolve(connection))
30+
client.on('connectFailed', err => connect.reject(err))
31+
32+
client.connect(wsApi)
33+
34+
try {
35+
const connection = await connect.promise
36+
2037
console.log(`Running test with ${iters} iterations...`)
21-
22-
function requestGreeting() {
23-
connection.sendUTF(JSON.stringify({ name: randomName() }))
24-
}
25-
26-
connection.on('message', message => {
38+
39+
const requester = createRequester(connection)
40+
41+
connection.on('message', message => requester.incoming.resolve(message))
42+
43+
let i = iters
44+
await (async function asyncLoop() {
45+
const sendData = { name: randomName() }
46+
const message = await requester.greeting(sendData)
2747
const data = JSON.parse(message.utf8Data)
2848
const { greeting } = data
2949

30-
if (--iters > 0) {
31-
requestGreeting()
32-
} else {
33-
performance.mark('END')
34-
performance.measure('START to END', 'START', 'END')
35-
36-
// https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
37-
connection.close(1000, 'Done testing')
50+
if (--i === 0) {
51+
console.log(`Last greeting: ${greeting}`)
52+
return
3853
}
39-
40-
})
54+
55+
await asyncLoop()
56+
})()
4157

42-
performance.mark('START')
58+
timer.end()
4359

44-
requestGreeting()
45-
})
60+
// https://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number
61+
connection.close(1000, 'Done testing')
4662

47-
client.connect(wsApi)
63+
} catch(err) {
64+
console.error('Error connecting')
65+
}
4866
}
4967

50-
const obs = new PerformanceObserver(items => {
51-
console.log('End test')
52-
console.log(`Duration: ${items.getEntries()[0].duration}`)
53-
performance.clearMarks()
54-
})
55-
56-
obs.observe({ entryTypes: ['measure'] })
57-
5868
if (require.main === module) {
5969
runTest()
6070
}

src/servers/ws/eventlet_server.py

100644100755
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#!/usr/bin/env python
22

3+
import json
34
import eventlet
4-
from eventlet import wsgi, websocket
55
import argparse
6-
import json
6+
from eventlet import wsgi, websocket
7+
from src.servers.config import host, port
8+
from src.servers.utils import random_greeting
79

810
@websocket.WebSocketWSGI
911
def greeting_handle(ws):
@@ -12,7 +14,7 @@ def greeting_handle(ws):
1214
if message is None: break
1315

1416
data = json.loads(message)
15-
ws.send(json.dumps({ 'greeting': data['name'] }))
17+
ws.send(json.dumps({ 'greeting': random_greeting(data['name']) }))
1618

1719
def site(env, start_response):
1820
if env['PATH_INFO'] == '/greeting':
@@ -21,12 +23,10 @@ def site(env, start_response):
2123
start_response('200 OK', [('Content-Type', 'text/plain')])
2224
return ['Eventlet running...']
2325

24-
if __name__ == '__main__':
25-
parser = argparse.ArgumentParser()
26-
parser.add_argument('-l', '--host', default='0.0.0.0')
27-
parser.add_argument('-p', '--port', default=5000, type=int)
26+
def run_test():
27+
# print('Server starting at: ' + 'ws://{}:{}'.format(host, port))
28+
listener = eventlet.listen((host, port))
29+
wsgi.server(listener, site)
2830

29-
args = parser.parse_args()
30-
print('Server starting at: ' + 'ws://{}:{}'.format(args.host, args.port))
31-
listener = eventlet.listen((args.host, args.port))
32-
wsgi.server(listener, site)
31+
if __name__ == '__main__':
32+
run_test()

0 commit comments

Comments
 (0)