Tag: socket.io

循环节点无意中改变了对象

我有一个angular度的应用程序,谈到一个node.js套接字服务器,谈话node.js应用服务器。 在这个套接字服务器函数中,我想根据哪个用户来清理应用服务器的响应。 我把一个拷贝放到了被擦净的物体的手上,然后把这个拷贝发送给客户端。 它看起来像副本影响的原始对象,因为循环停止后,第一个和其他客户端没有得到消息。 第一个控制台输出显示第二个客户端已连接,并在数据操作之前显示在clientsSockets列表中。 所以我应该只看到“用户没有连接”4次。 第二个控制台输出显示原始对象hand.players在从未调用时正在更改。 这是我的问题。 为什么hand.players只有当emitHand.players在代码中改变时才会改变? 我也尝试了一个forEach(注释掉)无济于事。 socket.on('hand', function(receivedHand) { console.log('clientSockets[56fde5327ee729ac1a37fd1c].userId '+ util.inspect( clientSockets['56fde5327ee729ac1a37fd1c'].userId, false, null)); var hand = null; PostHand(receivedHand).then(function(data) { hand = JSON.parse(data); console.log('hand.players'+util.inspect(hand.players, false,null)); var emitHand=hand; // emitHand.players.forEach(function(player, index, handPlayers) { for(var index in emitHand.players){var player=emitHand.players[index]; if (clientSockets[player.userId]!=null){ ScrubHand(emitHand.players,index).then(function(data) { emitHand.players=data.emitHandPlayers; clientSockets[data.emitHandPlayers[data.index].userId].socket.emit('hand', emitHand); console.log('hand.players'+util.inspect(hand.players, false,null)); }); }else{ console.log('user not […]

只允许连接sails.js中授权的套接字

我正在尝试在sails.js后端(使用0.12.x版本)中为socket.io客户端实现某种安全性。 为了达到这个目的,我试图阻止没有正确的cookie(预先没有授权的会话)的客户握手成功,或者使用passport.js来查看客户端是否被authentication。 在Sails.js文档中,我发现这应该是可能的,但我找不到任何提示,如何真正做到这一点。 另一方面,在互联网上寻找例子,人们大多不使用安全套接字,或使用一些旧版本的sails.js(<0.10)。 到目前为止我发现的最接近的是config/sockets.js : beforeConnect: function(handshake, cb) { if (handshake.headers.cookie) { console.log(handshake); // TODO: check session authorization } else { return cb(null, false); } return cb(null, true); }, 这应该检查与握手发送的cookie,如果它有一个适当的会话。 我很难搞清楚,我怎样才能将cookie中的sid映射到sails.js中的当前会话,以决定是否允许连接。 问题: socket.io最好的安全措施是什么,如果只允许less量的客户端(大约40-50个dynamic生成的用户应该被允许进行连接),还有其他人呢? 如何将cookie中的sails.sid映射到活动会话? 其他的configuration可能是我的目标的捷径(例如设置一些策略,socket.io请求使用与http相同的中间件)? 感谢您的任何提示,链接或build议。

Socket.io不是排放值

我在接收由socket.io发出的值有问题,我不明白问题在哪里。 在这里张贴的代码,请帮我解决这个问题。 var express = require('express'); var app = express(); var http = require('http').Server(app); var io = require('socket.io')(http); var bodyParser = require('body-parser'); var path = require('path'); var fs = require('fs'); var spawnSync = require('child_process').spawnSync; …. app.post('/loadImage',upload.any(),function(req, res) { fs.readFile('/home/pathtofile/file.json','utf8',function(err,data){ if(err){ console.log(err); }else{ //console.log(data); var precjson = JSON.parse(data); var loaded_filename = precjson.Filename; io.emit('emitfilename',{loaded_filename}); } }) } […]

Laravel echo,socket.io和laravel-echo-server将不起作用

这可能是我遇到的最令人沮丧的事情,不幸的是,这可能是我做的一些愚蠢的事情。 以下是我正在使用的三件事的链接: Laravel回声设置 Socket.io(cdn) Laravel Echo服务器 这是我的问题:我的网站不断地击中这条路线: http://192.168.10.10:6001/socket.io : http://192.168.10.10:6001/socket.io : http://192.168.10.10:6001/socket.io 。 我不知道它为什么会碰到这个路由,因为我没有在我的代码中的任何地方定义socket.io部分。 这里是我在我的bootstrap.js中用来实例化Laravel Echo的代码。 import Echo from "laravel-echo" window.Echo = new Echo({ broadcaster: 'socket.io', host: 'http://192.168.10.10:6001' }); 这是我的socket.js文件(node.js)中的代码: var echo = require('laravel-echo-server'); var options = { authHost: 'http://192.168.10.10', authPath: '/broadcasting/auth', host: 'http://192.168.10.10', port: 6001 }; echo.run(options); 到目前为止,这里没有任何事情可能会出错。 这是链接回cdn的错误消息。 奇怪的是,改变window.Echo主机更改域,但我不知道如何更改该socket.io部分。 这让你想知道,是否在Socket.io文件的某个地方被硬编码? 这是我第一次使用Socket.io,所以我无法知道。 也许在我放入cdn之后,我需要做额外的设置? 所有的Laravel文档都要求添加脚本标签,而Laravel则因为拥有出色的文档而闻名。 […]

使用connect.io服务器持久保存数据

我在MongoDB中使用socket.io,并承诺。 我想在会话build立时将一些数据保存在Mongo中,并且在保存这些数据之前不一定能处理更多的套接字事件。 // Simplified code io.sockets.on('connection', function(socket) var req = socket.handshake; mongoDbPromise.then(function (db) { return db.collection('mycollection').insert({some_user_data: req.query.some_user_data}); }).then(function (insertResult) { // do some other work }).catch(function (error) { socket.disconnect(); logger.info(error); }); } 我遇到的问题是connection套接字事件在连接处理程序返回后立即发出,但是当MongoDB的承诺parsing和我的处理程序被调用时,build立连接的工作继续。 在收到connection后立即发出请求的客户端会以不一致的状态查看应用。 我可以看到两种方法来解决这个问题: 1)使用某种callback来控制何时发射connection 。 不过,我还没有看到socket.io文档中有任何签名,可以这样做。 2)而不是使用connection来表示套接字已准备就绪,请使用其他一些自定义事件(让它称为connection_established )并将其发送到then处理程序中。 选项1可能吗? 有没有更好的方法来处理这种情况?

socket.io中的socketvariables是什么

我是Node.js和socket.io的新手。 我去官方网站的socket.io,并尝试一个教程。 http://socket.io/get-started/chat/ 它在我的电脑上正常工作。 但是我根本无法理解它的代码的本质。 问题:什么是下面的代码中的“套接字variables”。 它从哪里来? io.on('connection', function(socket){ socket.on('chat message', function(msg){ io.emit('chat message', msg); }); }); 也许“msgvariables”是stringtypesvariables。 而从客户方面来说,对吗?

在内存中的JS对象中可以容纳多less个socket.io对象,然后才能显着降低性能?

我有一个奇怪的网站devise。 我正在使用socket.io,并且必须维护每个连接的用户的套接字对象,以便从单独的应用程序漏斗响应。 我正在存储这样的sockets: var clients = {}; //further down, in socket.io code: io.sockets.on('connection', function(socket){ clients[socket.id] = socket; …. 当客户端请求进来时,我包含套接字ID并将其发送给另一个应用程序。 当响应进入时,我把连接和: if(returned_object.socketid){ if(clients[d.socketid]){ clients[d.socketid].emit('res', returned_object); } … 实际上,在我注意到性能滞后之前,我可以期待多less并发连接? 我想知道它是在几十,几百还是几千。 显然,我使用delete每个套接字disconnect 。 我还考虑将每个套接字写入到与leveldb或其他数据库连接的磁盘上。 谢谢

使用电子时无法加载socket.io.js文件

我试图使用node.js与电子和socket.io聊天应用程序,但是当我尝试加载/socket.io/socket.io.js,我总是得到错误: 无法加载资源:net :: ERR_FILE_NOT_FOUND 如果我只是在端口3000上启动服务器,并把res.sendFile(__ dirname +“/ index.html”); 可以加载socket.io.js,但如果我使用电子,并把mainWindow.loadURL(“文件:”/ __ dirname +“/index.html”); 那么它给了我上面提到的错误。 这里是我的index.js页面的代码: const electron = require('electron'); const {app, BrowserWindow} = electron; app.on('ready', function(){ var mainWindow = new BrowserWindow({ width: 1400, height: 800 }); mainWindow.loadURL("File://"+__dirname+"/index.html"); mainWindow.toggleDevTools(); }); 这里是我的server.js页面: var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io').listen(server); […]

Socket.io错误传递约定

背景:在Node中,通常在asynchronous调用中将错误对象传递给callback函数,以及由Joyent 在Node.js中的error handling中解释。 标准错误对象包含名称,消息,堆栈跟踪和可能的附加属性。 将string或普通对象传递或抛出为错误被认为是不好的做法。 使用Socket.io ,数据可以通过发送事件并具有可选的响应callback从客户端传输到服务器,反之亦然。 这打开了多种方式来传递和处理错误。 问题:如果来自客户端的socket.io事件在服务器上导致错误,那么通知客户端这个最好的做法是什么? 一个普通的错误对象的响应? 一个单独的错误事件和侦听器? 错误应该如何构造? 是否有像Node一样的最佳实践? 你在用什么? 例如:设想用于login的socket.io。 客户端通过发出如下所示的用户名和密码login: socket.emit('login', {user: 'Foo', pass: 'Bar'}, function (response) { … }); 在成功login时,响应包含会话令牌。 但是,如果用户名或密码不匹配呢? 想到几种方法: 方法1 – 普通错误对象:响应可能包含一个属性error ,其中包含一个普通的类似错误的对象作为其值,标准名称和消息属性以及可能的附加属性: { error: { name: 'InvalidUsernameOrPasswordError', message: 'Username or password was invalid.', usernameExists: false } } 客户端因此testing响应是否包含错误,如果不是,则继续login过程: socket.emit('login', {user: 'Foo', pass: 'Bar'}, function […]

使用Web套接字从数据库到客户端的实时数据更新/更改

我正在尝试使用Web套接字构build一个实时应用程序。 目前我正在使用ajax从客户端拉(每个固定的时间间隔)来获取数据库表的新变化。 我并不完全了解如何使应用程序实时。 当前实施: 在我的应用程序中,我通过从数据库(MariaDB)的ajax轮询获取数据,并在客户端的表中显示它。 预期的行为: 从客户端没有轮询,每当数据库端发生变化,它应该在所有连接的客户端更新。 在我的search过程中,我遇到了一些解决scheme: Node.js + server.io + oracle数据库 RethinkDB 服务器发送事件 连续查询通知 请帮助我find更好的解决scheme。