クライアントからの状態とブロードキャストイベントの変更を処理するために、複数のクライアントとnode.jsサーバーを使用してリアルタイムWebアプリケーションを構築しています。クライアントとサーバー間の転送メカニズムとしてSocket.ioを実装しました。クライアントが特定のアクションを実行すると、イベントがサーバーに送信され、ネットワーク上の他のクライアントにブロードキャストされます。
ただし、サーバーが一連のイベントを受信すると、サーバーはそれをブロードキャストせず、代わりに送信側クライアントに送り返すか、送信側クライアントを含むすべての接続されたソケットに送信する場合があります。
これは、基本的にクライアントイベントをリッスンし、2秒ごとにブロードキャストされる配列にそれらを収集するサーバー実装のスニペットです。
必要に応じて、クライアント実装からの関連するスニペットを含めることができます。
// Require HTTP module (to start server) and Socket.IO
var http = require('http'), io = require('socket.io'), users = require('./users');
// Commands to client
var USER_LOGIN = 0,
USER_LIST = 1,
USER_CONNECTED = 2,
USER_DISCONNECTED = 3,
COMMAND = 4,
COMMAND_SETNICKNAME = 0,
COMMAND_POSITION = 1,
COMMAND_MOUSEDOWN = 2,
var array = [];
var activeUsers = {};
// Start the server at port 8080
var server = http.createServer(function(req, res){
res.writeHead(200,{ 'Content-Type': 'text/html' });
});
server.listen(8080);
// Create a Socket.IO instance, passing it our server
var io = io.listen(server);
// Add a connect listener
io.sockets.on('connection', function(client){
console.log("started");
// Create periodical which ends a JSON message to the client every 2 seconds
var interval = setInterval(function() {
if(array.length >0) {
console.log("Sending to clients " + array);
//client.send(JSON.stringify(array));
client.broadcast.send(JSON.stringify(array));
array = [];
}
},2000);
// Success! Now listen to messages to be received
client.on('message',function(event){
console.log("--Reading event " + event);
var eventArray = JSON.parse(event);
for(var i = 0; i < eventArray.length; i++) {
var dataArray = eventArray[i];
var userId = parseInt(dataArray[0]);
var position = 1;
console.log("current element in array " + dataArray);
switch (parseInt(dataArray[position++])) {
case USER_LOGIN:
// Log in user with USERID.
var username = dataArray[position++];
console.log("Attempting to log in with user " + username);
// If valid, send USER_LOGIN broadcast to clients
if(login(username)) {
array.push([0, USER_LOGIN, login(username)]);
}
break;