Tag: 套接字

Socket.IO 1.2.1和Flash ping超时

我正在使用NodeJS和Socket.IO(v 1.2.1)作为服务器后端和Flash客户端的多玩家游戏。 用Flash我用这个连接到Socket.IO( https://github.com/redannick/FlashSocket.IO/tree/1.0.x )。 我遇到的主要问题是,在10分钟左右的游戏过程中,有些客户端由于ping超时而断开连接。 我做了NodeJS的打印日志,我得到的是: engine:ws writing "3" +0ms socket.io:client client close with reason ping timeout +40.2m socket.io:socket closing socket – reason ping timeout +40.2m socket.io:client ignoring remove for l7G1SDolb60nG3XRAAAA +1ms User disconnected. Reason: ping timeout 在Flash控制台中类似的东西: pong – 20:23:41 – stop pong – 22:12:8 – start webSocketFatal: Server Timed Out!! 通常我每个房间有5个玩家,只有2 – […]

原因socket.io不发送消息?

我正在使用angular度/节点应用程序,人们可以使用socket.io和btford的angular度sockets模块( https://github.com/btford/angular )与其他用户(如Whatsapp,无组群)进行1:1聊天-socket-io )。 现在A)一个客户端join一个socket.io房间使用发射。 客户端代码是: mySocket.emit('joinroom', room); 服务器代码是: socket.on('joinroom', function (room){ socket.join(room); }); B)聊天消息通过发送发送到服务器。 客户端代码是 mySocket.emit('sendmsg', data, function(data){ console.log(data); }); 和C)服务器应通过广播将消息发送给房间中的其他人。 服务器代码是: socket.on('sendmsg', function (text, room, sender, recipient, timestamp) { // Some code here to save message to database before broadcasting to other users console.log('This works'); socket.broadcast.to(room).emit('relaymsg', msg); }); 客户端代码是 $scope.$on('socket:relaymsg', function(event, data) { […]

netcat不发送最终的FIN来closures连接

我正在玩自制的nodejs tcp服务器,并在Linux下testingnetcat的行为。 在build立连接时,服务器发送“Test”string并closures套接字。 我期望netcat通过发送适当的tcp数据包来closures它的连接,但是它不会! 这是我做的: nc -v localhost 9000 之后,整个谈话看起来像这样: netcat –> server (SYN) netcat <– server (SYN, ACK) netcat –> server (ACK) netcat <– server (PSH, ACK) netcat –> server (ACK) netcat <– server (FIN, ACK) netcat –> server (ACK) 在这一点上,我期望netcat发送FIN,但它永远不会。 连接挂在FIN-WAIT-2的一边,CLOSE-WAIT挂在另一边。 如果我用telnet尝试同样的事情: telnet localhost 9000 它的行为如预期,并收到“testing”string后终止连接。 问题是为什么netcat的行为不同?

Socket.IO:重新连接导致服务器连接代码运行两次

每当我断开使用socket.disconnect(); 然后使用socket.connect();重新连接socket.connect(); ,服务器运行我的握手代码两次。 奇怪的是,即使服务器连接代码运行两次,重新连接后,我的数组中只有一个连接。 这发生在意外中断,故意中,或者即使服务器重新启动。 代码位: io.on('connection', OnConnect); function OnConnect(socket) { var connection = { socket: socket, realIp: ip, token: GenerateConnToken() }; connections.push(connection); console.log('Connected'); // Client will respond to this by emitting "client-send-info". // This is emitted once on initial connect, but twice on reconnect. socket.emit('acknowledge', connection.token); socket.on('client-send-info', function() { console.log('Client Sent Info'); }); socket.on('disconnect', […]

如何在Sails.js v0.11中触发自定义套接字事件?

Sails.js和套接字有问题。 他们的大部分工作很好。 我能够订阅客户端(Sails套接字客户端和AngularJS)上的套接字,并在使用Blueprint更新logging时从服务器接收消息。 但是,当我尝试去更多的自定义方法,我不能得到套接字事件触发。 我可以通过订阅他们如下隔离客户… // Listen for game model event io.socket.on('game', function(e) { console.log('Game Socket Event'); }); // Subscribe to model record io.socket.get('/game/' + gameId); 同样,这对订阅工作正常,但是对于一些更复杂的任务,我必须针对控制器操作。 这些通常涉及许多logging查询,可能是一个服务的调用,最后写一个logging(或更多)。 在链的最后,当一切都解决了,我想发出一个套接字消息只有特定的客户端。 我想我可能会使用像… Game.findOne({ id: data.gameId }).exec(function(err, gameData) { // Subscribe to the record Game.subscribe(req.socket, gameData, ['create', 'update', 'destroy']); // Various calls and updates to game model and […]

用socket.io-redis和RedisToGo在Heroku上扩展到2+ dynos

我正在尝试使用socket.io-redis来将我的Heroku应用程序扩展到2个dynos(或更多)。 这里是我的代码(config.redis只是一个包含RedisToGo端口,主机和传递值的对象): var redisApp = require('redis'); var redis = require('socket.io-redis'); if(process.env.NODE_ENV === 'production') { var socketpub = redisApp.createClient(config.redis.port, config.redis.host, {auth_pass: config.redis.pass, return_buffers: true}); var socketsub = redisApp.createClient(config.redis.port, config.redis.host, {auth_pass: config.redis.pass, detect_buffers: true}); var client = redisApp.createClient(config.redis.port, config.redis.host, {auth_pass: config.redis.pass, return_buffers: true}); socketio.adapter(redis({ pubClient: socketpub, subClient: socketsub, redisClient: client })); } 在客户端我有: var ioSocket = io('', […]

Node.js集群模块不释放http.Server.close()上的套接字/端口

在Node.js脚本中,我试图打开一些端口/套接字,然后再closures它们。 使用Node.js集群模块时遇到麻烦。 它似乎没有以不使用群集模块时相同的代码相同的方式closures端口。 例如,下面的代码创build5个http.Server,每个都在它自己的端口上,然后closures除最后一个(第五个)之外的所有其他端口。 'use strict'; var http = require('http'); function goGoGadget(i) { console.log('var i = ', i); var httpServer = http.createServer(); var nextPort = 4000 + i; console.log('about to listen on port', nextPort); httpServer.listen(nextPort); if (i < 5) { httpServer.on('listening', function() { console.log('closing port:', nextPort); httpServer.close(function() { console.log('closed server on port:', nextPort); }); }); […]

带有socket.io的Nodejs集群失去连接

我在集群模块中使用node.js来创build多进程socket.io服务器。 使用这个例子,我创build了以下服务器客户端应用程序: 服务器: var cluster = require('cluster'); // Start master process if (cluster.isMaster) { // Create slave workers (in this example there is only one) var worker = cluster.fork(); // Starts a server that will delegate the connection to the worker var routerServer = net.createServer(function(connection) { worker.send({type: 'new_connection'}, connection); }); routerServer.listen(443, "my-ip-address"); } else { […]

Python脚本连接到使用Nodejs创build的socket.io服务器

我使用nodejs在http:// localhost:8090上托pipe了一个HTTP服务器。 app.js文件 var fs = require('fs') , http = require('http') , socketio = require('socket.io'); var server = http.createServer(function(req, res) { res.writeHead(200, { 'Content-type': 'text/html'}); res.end(fs.readFileSync(__dirname + '/index.html')); }).listen(8090, function() { console.log('Listening at: http://localhost:8090'); }); socketio.listen(server).on('connection', function (socket) { socket.on('message', function (msg) { console.log('Message Received: ', msg); socket.broadcast.emit('message', msg); }); }); }); 现在我写一个python脚本来使用套接字编程连接到这个服务器。 client.py文件 #!/usr/bin/python […]

closuresRethinkDB改变之前改变

我似乎无法在rethinkdb文档中find关于在第一次更改被触发之前如何停止更改更改的信息。 这是使这个必要的问题: 客户端通过套接字连接到服务器,套接字开始换货,如下所示: var changeCursors = {}; db('app').table('things').changes().run(cursor, function(err, cursor) { // do something when changed changeCursors[user.id] = cursor }) // later, when the user disconnects changeCursors[user.id].close() 当第一次更改发送时,我可以将光标指定给内存中的一个variables,如果客户端断开,请closures此光标。 但是,如果用户在首次更改之前断开连接,该怎么办? 据我所知,反思不支持调度初始状态,所以光标只有在更改后才可用。 但是,如果用户断开连接,则changeCursors[user.id]是不确定的,并且换货始终处于打开状态。 这可以通过检查换货内部的一个状态对象来解决,并且在第一次改变之后closuresfeed,但是理论上如果没有改变和许多连接的客户端,我们可能会打开很多没有理由吃掉内存的游标将会在更新后立即closures)。 有没有办法让runcallback正在执行的变更饲料的光标? 另外,是否有办法强制重新执行runcallback的初始状态更新?