Node.JS と Socket.IO を使用してデータを取引しています。次の「スキーマ」があります。
- 各反復で異なるデータをブロードキャストする 10 秒の setInterval を持つ「ローカル」Socket.IO サーバー。
- 「グローバル」Socket.IO サーバーは、HTML クライアントからの要求に応じて「ローカル」サーバーからデータを受信し (次のコードの ioLocal 変数は socket.io-client)、渡された番号でデータを変更します。 HTML クライアント要求を送信し、クライアントに送信します。
問題は、HTML クライアントが間違ったデータを受信していることです。タイムスタンプの場合、ローカル サーバーがメッセージ「2」をブロードキャストするとします。一方、2 つの異なる HTML クライアントがデータを要求します。最初のクライアントは "2" で、2 番目のクライアントは "3" です。最初のものは "4" (2*2) を受け取り、2 番目のものは "6" (2*3) を受け取りますが、機能していません。代わりに、最初のものは "4" を受け取り、2 番目のものは "12" (4*3) を受け取ります。「2」を送信する 3 番目のクライアントがあった場合、「24」(12*2) を受信します。
クライアントごとに異なるvarを作成しようとしました.socket.setとsocket.get、socket.idの配列を使用しましたが、これらのソリューションはどれも機能しませんでした。
これの何が問題なのですか?範囲の問題ですか?御時間ありがとうございます。
「グローバル」サーバー
var ioGlobal = require('socket.io').listen(9090);
ioGlobal.set('log level', 1);
ioGlobal.enable('browser client minification'); // send minified client
ioGlobal.enable('browser client etag'); // apply etag caching logic based on version number
ioGlobal.enable('browser client gzip'); // gzip the file
ioGlobal.set('transports', [ 'websocket', 'xhr-polling' ]);
ioGlobal.set("polling duration", 10);
ioGlobal.set('sync disconnect on unload', true);
var ioLocal = require('socket.io-client').connect('http://10.0.0.219:9091', {
'connect timeout' : 1500,
'reconnect' : true,
'reconnection delay' : 500,
'max reconnection attempts' : 20
});
ioGlobal.sockets.on('connection', function(iSocket) {
debug && console.log('Client '+iSocket.id+' connected.');
iSocket.on('disconnect', function() {
debug && console.log("Client "+iSocket.id+" disconnected.");
});
iSocket.on('data_rt', function(num) {
ioLocal.on('data_broadcast', function(data) {
//do something to data with num
data = data*num;
iSocket.emit('rsp_data_rt', data);
});
});
});
「ローカル」サーバー
var ioLocal = require('socket.io').listen(9091);
ioLocal.sockets.emit('data_broadcast', 2);
HTML クライアント
<!DOCTYPE html5>
<html>
<head>
<title>Socket.IO MultiClient Test</title>
<script type="text/javascript" src="http://10.0.1.180:3000/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://10.0.0.219:9090');
function go(){
var message = document.getElementById('message').value;
socket.emit('data_rt', message);
};
socket.on('rsp_data_rt', function(num){
document.getElementById('result').innerHTML = num;
})
</script>
</head>
<body>
<h1>Socket.IO Multiclient</h1>
Message: <input type="text" id="message"><br />
<button type="button" onclick='go()'>Send</button>
Result: <span id="result"></span>
</body>
</html>