Saya mengalami masalah saat mengirimkan berbagai informasi dari client.js saya ke server node menggunakan permintaan http POST. Setelah beberapa hari saya pikir saya telah mempersempitnya.
Pengaturan saya saat ini adalah sebagai berikut:
pelayan
- Setelah jangka waktu X, server akan mulai meminta klien untuk mengirimkan data yang dikumpulkan.
- Server hanya mengirimkan satu permintaan pada satu waktu, menunggu untuk menerima informasi klien sebelum mengirim permintaan ke klien berikutnya
Klien
- Klien menerima permintaan dari server
- Barang Http untuk mengirim permintaan POST sudah diatur
- Data array dikonversi ke json
- 1000ms ditunggu sebelum mengirim permintaan posting http
pelayan
- Permintaan posting diterima & data tersebut ditambahkan ke array lokal
Server saya.js
var http = require('http')
, connect = require('connect')
, io = require('socket.io')
, fs = require('fs')
, uuid = require('node-uuid')
, _ = require('lodash');
// omitted event handers & pubnub setup
var app = connect().use(connect.static(__dirname)).use(connect.directory(__dirname));
var server = http.createServer(app);
server.listen(8888);
io = io.listen(server);
// Following handles sending request to clients
function phaseTwo() {
var count = 0;
setTimeout(function() {
pubnub.publish({
channel: 'channel' + viewers[count],
message: { message: 'measurements',
uuid: 'Server',
receiver: viewers[count] }
});
// set up server to listen for http POST
app.use(function(req, res) {
if (req.method == 'POST') {
count++;
req.on('data', function(chunk) {
// add that array into one main array
latencyData.push.apply(latencyData, chunk);
dataCollected++;
});
pubnub.publish({
channel: 'channel' + viewers[count],
message: { message: 'measurements',
uuid: 'Server',
receiver: viewers[count] }
});
}
}); // end app.use
}, msDuration);
}
klien
if (message.message == 'measurements') {
console.log(' Received measurements event');
var http = new XMLHttpRequest();
var url = 'http://localhost:8888/';
http.open('POST', url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// http.setRequestHeader("Content-length", latency.length);
// http.setRequestHeader("Connection", "close");
var myJsonString = JSON.stringify(latency);
setTimeout( function() {
http.send(myJsonString);
}, 1000);
}
Masalahnya adalah tanpa penundaan 1000ms di sisi klien, server tidak menerima semua data klien. Lebih buruk lagi, ketika mencoba meningkatkan beberapa ratus klien, tidak ada lagi posting http yang dikirim ke server setelah 240 klien mengirimkan info mereka (ada cukup ram untuk mereka)
Tanpa penundaan pada klien yang membuat permintaan POST, server harus menunggu klien saat ini mengirimkan informasinya sebelum melanjutkan. Masalah lainnya adalah bahkan dengan kurang dari 240 klien, katakanlah menguji 200 klien, bahkan tanpa penundaan hanya sekitar 10% dari data mereka yang diterima (hal ini ditulis ke file teks di bagian akhir)
Saya sangat baru dalam menggunakan http post/get stuff jadi menurut saya itulah masalahnya. Apakah ada yang salah dari pengalaman seseorang dengan http atau nodejs?
sunting: Saya menemukan satu kesalahan. Kembali ke sisi server, pada permintaan posting, data apa pun yang diperoleh dari server langsung ditambahkan ke array lokal di server tanpa terlebih dahulu memastikan itu adalah array. Saya tidak sepenuhnya yakin apakah ini akan cukup merusak dan menjadi sumber masalah saya