-
-
Save Bamieh/6fe35aff7c2ddf93d56554471d2decf7 to your computer and use it in GitHub Desktop.
Node http vs net modules
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This makes two connections, one to a tcp server, one to an http server (both in server.js) | |
// It fires off a bunch of connections and times the response | |
// Both send strings. | |
const net = require(`net`); | |
const http = require(`http`); | |
function parseIncomingMessage(res) { | |
return new Promise((resolve) => { | |
let data = ``; | |
res.on(`data`, (chunk) => { | |
data += chunk; | |
}); | |
res.on(`end`, () => resolve(data)); | |
}); | |
} | |
const testLimit = 5000; | |
/* ------------------ */ | |
/* -- NET client -- */ | |
/* ------------------ */ | |
function testNetClient() { | |
const netTest = { | |
startTime: process.hrtime(), | |
responseCount: 0, | |
testCount: 0, | |
payloadData: { | |
type: `millipede`, | |
feet: 100, | |
test: 0, | |
}, | |
}; | |
function handleSocketConnect() { | |
netTest.payloadData.test++; | |
netTest.payloadData.feet++; | |
const payload = JSON.stringify(netTest.payloadData); | |
this.end(payload, `utf8`); | |
} | |
function handleSocketData() { | |
netTest.responseCount++; | |
if (netTest.responseCount === testLimit) { | |
const hrDiff = process.hrtime(netTest.startTime); | |
const elapsedTime = hrDiff[0] * 1e3 + hrDiff[1] / 1e6; | |
const requestsPerSecond = (testLimit / (elapsedTime / 1000)).toLocaleString(); | |
console.info(`net.Server handled an average of ${requestsPerSecond} requests per second.`); | |
} | |
} | |
while (netTest.testCount < testLimit) { | |
netTest.testCount++; | |
const socket = net.connect(8888, handleSocketConnect); | |
socket.on(`data`, handleSocketData); | |
} | |
} | |
/* ------------------- */ | |
/* -- HTTP client -- */ | |
/* ------------------- */ | |
function testHttpClient() { | |
const httpTest = { | |
startTime: process.hrtime(), | |
responseCount: 0, | |
testCount: 0, | |
}; | |
const payloadData = { | |
type: `centipede`, | |
feet: 100, | |
test: 0, | |
}; | |
const options = { | |
hostname: `localhost`, | |
port: 8080, | |
method: `POST`, | |
headers: { | |
'Content-Type': `application/x-www-form-urlencoded`, | |
}, | |
}; | |
function handleResponse(res) { | |
parseIncomingMessage(res).then(() => { | |
httpTest.responseCount++; | |
if (httpTest.responseCount === testLimit) { | |
const hrDiff = process.hrtime(httpTest.startTime); | |
const elapsedTime = hrDiff[0] * 1e3 + hrDiff[1] / 1e6; | |
const requestsPerSecond = (testLimit / (elapsedTime / 1000)).toLocaleString(); | |
console.info(`http.Server handled an average of ${requestsPerSecond} requests per second.`); | |
} | |
}); | |
} | |
while (httpTest.testCount < testLimit) { | |
httpTest.testCount++; | |
payloadData.test = httpTest.testCount; | |
payloadData.feet++; | |
const payload = JSON.stringify(payloadData); | |
options[`Content-Length`] = Buffer.byteLength(payload); | |
const req = http.request(options, handleResponse); | |
req.end(payload); | |
} | |
} | |
/* -- Start tests -- */ | |
// flip these occasionally to ensure there's no bias based on order | |
setTimeout(() => { | |
console.info(`Starting testNetClient()`); | |
testNetClient(); | |
}, 50); | |
setTimeout(() => { | |
console.info(`Starting testHttpClient()`); | |
testHttpClient(); | |
}, 2000); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This sets up two servers. A TCP and an HTTP one. | |
// For each response, it parses the received string as JSON, converts that object and returns a string | |
const net = require(`net`); | |
const http = require(`http`); | |
function renderAnimalString(jsonString) { | |
const data = JSON.parse(jsonString); | |
return `${data.test}: your are a ${data.type} and you have ${data.feet} feet.`; | |
} | |
/* ------------------ */ | |
/* -- NET server -- */ | |
/* ------------------ */ | |
net | |
.createServer((socket) => { | |
socket.on(`data`, (jsonString) => { | |
socket.end(renderAnimalString(jsonString)); | |
}); | |
}) | |
.listen(8888); | |
/* ------------------- */ | |
/* -- HTTP server -- */ | |
/* ------------------- */ | |
function parseIncomingMessage(res) { | |
return new Promise((resolve) => { | |
let data = ``; | |
res.on(`data`, (chunk) => { | |
data += chunk; | |
}); | |
res.on(`end`, () => resolve(data)); | |
}); | |
} | |
http | |
.createServer() | |
.listen(8080) | |
.on(`request`, (req, res) => { | |
parseIncomingMessage(req).then((jsonString) => { | |
res.end(renderAnimalString(jsonString)); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment