Tag: 套接字

实时多人游戏 – 地区广播

我正在编写一个实时的多人游戏 (使用Nodejs,socket.io),我想问你的帮助来优化一个点。 我实现了一个更新循环60次/秒和广播循环20次/秒 ,客户端预测和插值的权威服务器。 然后,在广播循环中,我尝试了导致性能问题的区域广播 。 为了极简主义,服务器有数组: 玩家实体(id +位置) 食品实体(ID +职位) 让我们在一个大的地图(如agar.io)中产生1000个食物 ,在服务器的数组server.foods中。 玩家只需要知道他的视口中的食物状态(比方说200种可见的食物 )。 所以,服务器只发送一个包含200个可见食物(id +职位)的包给玩家。 然后,为了让服务器知道,我们将200个可见食物放入播放器对象( player.foods )中的一个数组中, 但玩家可以移动,所以其他的包必须被发送: initFoods是一系列食物(id +职位)初始化(只有当新食物对玩家可见: distFoodPlayer <500 ) removeFoods是一系列的食物(ID +职位)删除(只有当新的食物是不可见的球员: distFoodPlayer> 600 ) 要知道这些信息,我做了这样的事情: for (var i = server.foods.length; i–;) { //Edit: added the next line if (distPlayerFood < 900) { var food = server.foods.entities[i]; var inPlayerFoods […]

只允许连接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}); } }) } […]

在内存中的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或其他数据库连接的磁盘上。 谢谢

套接字IO:RangeError:超出最大调用堆栈大小

每次客户端连接到我的nodejs服务器,我的服务器崩溃的错误“RangeError:最大调用堆栈大小超过”。 我相信我必须在某个地方有一个recursion的问题,但是它正在逃避我。 我的服务器: require('monitor').start(); var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); var allClients = []; io.on('connection', function(socket){ console.log('user joined: ' + socket.request.connection.remoteAddress + ':' + socket.request.connection.remotePort); socket.address = socket.request.connection.remoteAddress; socket.port = socket.request.connection.remotePort; socket.name = ''; socket.xPos = 0; socket.yPos = 0; //io.emit('new user', […]

有没有更好的方法来监听节点JS中的表更改,而不使用setInterval()函数

我正在学习与Codeigniter Node JS集成。 这个过程正在完善。 我在数据库(MySql)发生某些更改时显示一些实时通知 现在我正在使用setInterval()函数,时间为5秒。 这将每5秒钟调用一次数据库查询。 有没有更好的方式来监听没有setInterval()function的数据库更改? 我的代码示例是 io.on('connection', function(socket){ setInterval(check_new_notification, 5000); }); socket.on('check_new_notification', function(user,time){ check_new_notification(user,time); }); function check_new_notification(user,time){ if(user == '' || typeof user == 'undefined' || user == null){ user = user_id; } if(time == '' || typeof time == 'undefined'){ time=0; } if(user != '' && typeof user != 'undefined' && […]

在再次写入之前等待socket_write完成

我需要从PHP服务器发送一些数据到节点服务器。 以下是我目前在PHP方面的一个简化版本: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, '127.0.0.1', '3000'); socket_write($socket, "Hello World", 11); socket_close($socket); 运行此代码成功发送消息到我的节点服务器并输出。 不过,我需要发送多个消息回到套接字。 我实际上需要发送几千个响应。 但是,如果我要像这样在循环内调用socket_write()函数: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $result = socket_connect($socket, '127.0.0.1', '3000'); for($i=0;$i<1000;$i++){ socket_write($socket, "Hello World", 11); } socket_close($socket); 它似乎将所有数据附加在一起,并在脚本的末尾一次性发送。 我需要实时发回数据。 有什么办法可以在PHP中做到这一点?

编辑节点js文件,根本不需要重新启动服务器

我正在研究nodeJs'AI',并使用套接字与我们的其他应用进行通信。 我想知道是否有一种方法来更新nodeJs应用程序而不重新启动它,所以我们的代码更新,但我们的套接字永远不会closures? 我看到了一些模块来监视更改并重新启动服务器,但是如果我使用类似的东西,我的套接字将会closures,我将不得不重新启动其他应用程序。 感谢您的帮助

基于回合的多人游戏实现定时器的最佳方法是什么?

我正在使用Node.js实现多人回合制游戏,用于服务器端脚本。 游戏就像垄断 ,多房间和单人房间有多个玩家。 我想实现所有房间的计时器,我已经经历了很多文章,我有两个select,如下所示: 1}我会立刻用当前的时间发送给每个玩家,他们会处理计时器,并在轮到时间或之后发送到服务器。 2}我可能在服务器pipe理定时器,并在每秒发射,但它会创build负载到服务器,也混淆为Node.js 单线程,那么我将如何pipe理多个房间的setInterval() 。 它会增加队列,并会造成延迟。 所以请协助我最好的select。

什么超时types是由net.connect.setTimeout – 连接或套接字?

我正在读一本书,那里有一段话: 默认情况下,套接字没有超时。 这可能是不好的,因为如果networking或远程主机发生故障,连接将无限期地闲置。 但是,您可以使用setTimeout()方法在套接字上定义一个超时值。 setTimeout()的这个版本以毫秒为单位超时作为第一个参数。 如果套接字空闲了这段时间,就会发出超时事件。 以下是我在网上阅读的内容: 连接超时仅在启动TCP连接时发生。 这通常发生在远程机器没有应答的情况下。 这意味着服务器已closures,您使用错误的IP / DNS名称或服务器的networking连接已closures。 套接字超时专用于监视连续传入的数据stream。 如果数据stream在指定的超时时间内中断,连接将被视为停止/中断。 等待单个数据包时是超时。 这是一个常见的误解,套接字超时是接收完整响应的超时。 所以,如果套接字超时为1秒,响应包含3个IP数据包,每个响应数据包需要0.9秒才能到达,总响应时间为2.7秒,则不会有超时。 所以我们正确地假设在Node.js net.connect.setTimeout使用的net.Socket实际上是一个套接字超时 ?