Tag: socket.io

将一个函数绑定到多个套接字

io.on('connection', function(socket) { socket.join('myRoom'); if(condition){ bindFunctions(); } }); 假设第四个sockets连接时condition为真。 下面的代码成功地将.on处理程序绑定到myRoom所有套接字。 bindFunctions(){ for(var socketId in io.sockets.adapter.rooms["myRoom"]){ var socket = io.sockets.connected[socketId]; socket.on('my event',function(submit){ console.log(socket.myVariable); //This is always the same property, no matter who calls this function. }); } } 但是,当'my event'触发时,无论哪个客户端触发它, socket对象始终是连接的第4个套接字。 它总是调用bindFunctions的套接字。 我会认为处理程序套接字应该是相同的function内的套接字。 所以我有两个问题: 为什么'my event'函数中的套接字是调用bindFunctions而不是触发事件的套接字的套接字? 我可以做什么,而不是在函数内部访问名为'my event'的套接字的属性?

当页面重新加载节点Js和Socket.io时,获取socket.id

接近时间。 我尝试使用节点Js和Socket.io编写聊天应用程序,我有1页login.html,1页chat.html和server.js文件。 当我用UserAlogin时,我将发送电子邮件并传递给服务器并进行validation。 之后,转到页面chat.html。 在这里,我显示列表用户,但是当我尝试刷新页面chat.html,socket.id改变。 我有解决scheme保存在数据库MongoDb中刷新后的socket.id,但是当我用UserB其他浏览器login,刷新UserA后,但UserB的socket.id更改,而不是用户A. 对不起我的英语不好。 这是login.html页面 <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <body> <div class="container"> <form class="form-signin" id="formLogin"> <h2 class="form-signin-heading">Please sign in</h2> <label for="inputEmail" class="sr-only">Email address</label> <input type="email" id="inputEmail" class="form-control" placeholder="Email address" required="" autofocus=""> <label for="inputPassword" class="sr-only">Password</label> <input type="password" id="inputPassword" class="form-control" placeholder="Password" required=""> <div class="checkbox"> <label> <input type="checkbox" value="remember-me"> Remember me </label> </div> <button […]

Socket.io – 多个用户的一个对象

我正在使用socket.io在node.js中构build一个应用程序,我希望人们能够对问题进行投票,并将计时器包括在内,这将为他们提供回答问题的时间限制。 我遇到的问题(我将在下面重点介绍)是,每次有人连接到页面时,它都会logging秒表对象的记号。 即使在人们离开之后,每当有人连接时也会继续logging一次。 这是我迄今为止的项目代码。 Stopwatch.js: function Stopwatch() { if (false === (this instanceof Stopwatch)) { return new Stopwatch(); } this.hour = 3600000; this.minute = 60000; this.second = 1000; this.time = this.hour; this.interval = undefined; events.EventEmitter.call(this); _.bindAll(this, 'start', 'stop', 'reset', 'onTick'); }; util.inherits(Stopwatch, events.EventEmitter); Stopwatch.prototype.start = function() { console.log("Starting the Timer!"); this.interval = setInterval(this.onTick, this.second); this.emit('start'); […]

套接字IO使用长轮询而不是套接字

我只是重新开始使用Node和Socket IO。 我正在使用socket.io v1.3.7。 我可以加载套接字IO客户端,但它是长轮询,而不是使用套接字。 上一次我使用socketIO它工作正常。 我认为这是0.9.x的分支。 http://sockettest.dev:3000/socket.io/?EIO=3&transport=polling&t=1447350154198-2&sid=eW7B_kpSat6WfGQSAAAC 这是代码 服务器 – app.js var server = require('http').createServer(); var io = require('socket.io')(server); io.on('connection', function(socket) { socket.emit('connection', 'connected'); socket.on('disconnect', function() { socket.emit('disconnection', 'not connected'); }); }); server.listen(3000); 客户端 – index.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="//recently.dev:3000/socket.io/socket.io.js"></script> <script> var socket = io.connect('<?php echo '//' . $_SERVER['HTTP_HOST'] […]

快递,为每个用户保留variables

我在Express / Node上使用socket.io 现在我正在使用这个方法: // get room name from URL var requestRoom; app.get('/editor/:room', function(req, res) { requestRoom = req.params.room; res.render('editor/editor', { title: 'Editor' }); }); // use that room name for private rooms within socket.io io.on('connection', function(socket) { socket.join(requestRoom); // rest of socket.io code…. 从类似于sitename.io/editor/[room-name]的url抓取room-name 。 然后,我使用requestRoom作为requestRoom socket.to(requestRoom).broadcast..的variables,用于将套接字数据包发送到特定的房间。 问题 每当新用户访问该应用程序时, requestRoom都会被重新填充以供所有用户使用 ,而不仅仅是刚刚join的用户。 有没有办法为每个“会话”启动一个新的“实例”与自己的variables? 我在这里错过了什么?

绘制多个套接字实例以在移动(多人)上进行canvas和更新

计划 我决定开始尝试使用Node.js和Socket.io,然后开始制作一个游戏(或者只是一个大厅,将每个玩家画成一个块)。 每当一个客户端join时,服务器就应该接受这个类,并用服务器给出的玩家详细信息实例化一个新的对象(Random)。 然后,服务器将使用socket.io并将新对象发送到连接的客户端,以便他们可以拥有该对象,然后可以使用它(在这种情况下移动)。 客户端应该做的第一件事就是将所有用户绘制到canvas上,然后将当前客户端绘制到canvas上。 问题 我已经到了事情正在工作的地步,服务器做了一个新的播放器对象,然后发送给客户端,然后客户端将能够绘制自己的canvas与属性,但我似乎不能有客户端发送在其他用户的canvas上绘制,直到我移动播放器。 当我打开多个浏览器选项卡,然后按预期的方式工作,如下所示绘制客户端: 但是当我移动其中的一个,那么一个客户端会成功吸引到其他客户端,但是其他客户端都会失去那个时候给予他们的对象,直到他们移动,然后在其他地方顺利移动,但其他客户端都丢失屏幕状态,你可以看到他们所在的位置。 总之,他们都在屏幕上,并相应地移动到所有浏览器中的正确位置,但是当发生这种情况时,您从不会看到所有的玩家,而只会一次显示一个玩家,而且是一个移动的玩家(在您第一次join之后也只有看到自己,直到有人移动,但你看到所有的球员只有最后一次移动,直到有人或你移动)。 在下面查看图像 以上显示了我关注中间选项卡和移动,日志显示发生了什么(注意其他球员都消失了,只有移动的显示) 代码 我只有2个文件,我正在使用,他们填充如下。 服务器 – nodejs var express = require('express'), app = express(), http = require('http').createServer(app), io = require('socket.io').listen(http); http.listen(8000); //server connections and routing app.use(express.static(__dirname + '/public'), function(request, response){ if(request.url !== '/public') { response.sendFile( __dirname +'/error/index.html'); console.log('Error 404 request, User tried accessing: ' + […]

Node.js可写入stream创build错误的文件(更大和不可读)

我正在写一段代码,通过Socket.io将文件从Angular.js客户端发送到Node.js服务器。 客户端将文件分块并通过Socket.io发送到服务器。 该文件在客户端使用JavaScript的FileReader读取: var chunkSize = 524288, // 0.5mb reader = new FileReader(); reader.onload = function(e) { // ok, this one is very simplified so that I don't have to copy // all of my code here, but basically I send files with an offset // like: // file.data.substr(offset, Math.min(chunkSize, file.size – offset)); // for […]

socket.io不能调用未定义的方法“emit”(使用node.js和express,jade)

我正在跟着那个有点老的聊天的例子,但是我从这开始。 但是,所有在该页面中描述的工作后,我得到错误如下: TypeError: Cannot call method 'emit' of undefined at /Users/juneyoungoh/Documents/Nodejs/ChatSample/app.js:109:29 at Array.forEach (native) at userJoined (/Users/juneyoungoh/Documents/Nodejs/ChatSample/app.js:108:33) at Socket.<anonymous> (/Users/juneyoungoh/Documents/Nodejs/ChatSample/app.js:62:7) at Socket.EventEmitter.emit (events.js:98:17) at Socket.onevent (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/lib/socket.js:330:8) at Socket.onpacket (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/lib/socket.js:290:12) at Client.ondecoded (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/lib/client.js:193:14) at Decoder.Emitter.emit (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20) at Decoder.add (/Users/juneyoungoh/Documents/Nodejs/ChatSample/node_modules/socket.io/node_modules/socket.io-parser/index.js:247:12) 源代码的问题部分是 function userJoined(uName) { Object.keys(socketsOfClients).forEach(function(sId){ io.sockets.sockets[sId].emit('userJoined ', {'userName' : uName}); }); } 所以我跟踪对象io.sockects和我在屏幕上得到的是下面 { name: '/', server: […]

用npm安装socket.io

我安装了Python 2.7(3.4),并解决了一个错误。 然后,我安装了Windows 7 SDK,解决了另一个错误,但没有运气…我在这里读到,我不必安装Visual Studio以及…有人能给我一个解决scheme吗? 截图:

(nodejs上的Socket.io)使用mysql数据更新div不会显示错误

我为我的新项目使用socket.io,而我完全是新的。 经过大量的研究,我可以达到我想要的程度。 我有dynamic填充从MySQL数据的div。 所以我在我的server.js上做的是使用setInterval来每秒查询数据,并向客户端发送消息(updateItem)。 我的代码: function updateitems(){ pool.getConnection(function(err,connection){ if (err) { console(err); connection.release(); return; } connection.query("SELECT * FROM items",function(err,rows){ if(!err) { var items= []; for (var i = 0; i < rows.length; i++) { items.push(rows[i]); } io.sockets.emit('updateItems', items); }else{ console.log(err); } }); connection.on('error', function(err) { console.log(err); return; }); }); } 接着: setInterval(updateitems, 1000); 事情是,大约30或40秒后div停止更新,服务器控制台不显示任何错误信息或任何东西,VPS上的水平是好的,没有高负荷或任何东西。 它只是停止…任何build议? […]