Articles of 套接字

在io.sockets.on()之外的socket.send

我有一个循环,连续查询数据库。 当查询返回结果时,node.js应用程序将通过socket.io v0.8向连接到节点服务器的每个客户端发送消息。 问题: io.sockets.broadcast.send('msg')在setInterval()循环的中间被调用,所以它不在io.sockets.on()的callback函数中,因此这是行不通的。 当使用io.sockets.send('msg') ,似乎没有消息发送到客户端。 Node.js代码 setInterval(function() { util.log('Checking for new jobs…'); dbCheckQueue(function(results) { if (results.length) { io.sockets.broadcast.send('hello'); } }); }, 10*1000); 但是,如果要从io.sockets.on('connection',..)调用setInterval ,则每个连接的客户端都将创build一个额外的循环! Node.js代码 io.sockets.on('connection', function(socket) { setInterval(function() { util.log('Checking for new jobs…'); dbCheckQueue(function(results) { if (results.length) { io.sockets.send('hello'); } }); }, 10*1000); }); 客户JS socket.on('hello', function() { console.log('HELLO received'); }) *如何获得一个单循环运行,但仍然能够发送消息到所有连接的客户端?

PHP的Socket服务器与node.js:networking聊天

我想要使​​用长时间的HTTP请求(Comet),ajax和websockets(取决于使用的浏览器)来编写HTTP WebChat。 用户数据库是在MySQL中。 聊天是用PHP编写的,除了也可以用javascript(node.js)写的聊天stream本身: 我不想为每个用户启动一个php进程,因为在这些php孩子之间没有好的方式发送聊天消息。 所以我想写一个自己的套接字服务器在PHP或node.js应该能够处理超过1000个连接(聊天用户)。 作为一个纯粹的Web开发人员(PHP)我不太熟悉套接字,因为我通常让Web服务器关心连接。 聊天消息不会被保存在磁盘上,也不会保存在mysql中,而是保存在RAM中作为数组或对象以获得最佳的速度。 据我所知,在单个php进程(套接字服务器)中,无法同时处理多个连接,但是您可以接受大量的套接字连接,并在循环中连续处理它们(读取和写入;传入消息 – >写入所有套接字连接)。 问题是,最有可能是一个滞后的约1000用户和MySQL操作可以放慢整个事情,这将影响所有的用户。 我的问题是:node.js可以处理性能更好的套接字服务器吗? Node.js是基于事件的,但我不确定它是否可以同时处理多个事件(不需要multithreading?),或者只有一个事件队列。 有了事件队列,它就像php:用户之后的进程用户。 我也可以在每个聊天室产生一个php进程(用户less得多),但是afaik有单线程的IRC服务器,它们也能够处理成千上万的用户。 (用C ++或其他)写的,所以也许这也可能在PHP中。 我宁愿使用PHP,而不使用Node.js,因为那样的话,这个项目将只是php而不是编程语言的混合体。 但是,如果节点可以同时处理连接,我可能会select它。

是否可以将React Native与socket.io结合使用

我正在开发一个Phonegap + React.js和Socket.io的应用程序。 然而,那么React-Native就被释放了,原生的感觉是惊人的。 我试图让socket.io客户端与React Native工作,但不幸的是没有太多的成功。 我做了一些研究,并得到了与本问题中所述完全相同的错误: https : //github.com/facebook/react-native/issues/375 关于这个问题的评论说,尝试使用获取API来获取JS模块,但我认为我做错了: var socketScript; fetch('https://cdn.socket.io/socket.io-1.2.0.js') .then(function(response) { socketScript = response._bodyText; }).done(function() { var socket = socketScript.io(); }); 这返回一个undefined不是一个函数 。 有什么办法让socket.io-client与React Native一起工作吗? 还是我看着这个错误的方式? 也许还有其他更合适的解决scheme?

在forEach循环中调用socket.disconnect实际上并不会在所有套接字上调用断开连接

我是新来的JavaScript世界。 最近我正在研究nodejs中的一个聊天应用程序。 所以我有一个叫做gracefulshutdown的方法如下。 var gracefulShutdown = function() { logger.info("Received kill signal, shutting down gracefully."); server.close(); logger.info('Disconnecting all the socket.io clients'); if (Object.keys(io.sockets.sockets).length == 0) process.exit(); var _map = io.sockets.sockets, _socket; for (var _k in _map) { if (_map.hasOwnProperty(_k)) { _socket = _map[_k]; _socket.disconnect(true); } } …code here… setTimeout(function() { logger.error("Could not close connections in time, […]

如何从NodeJs中的tcp套接字断开连接

我使用以下命令连接到NodeJs中的套接字服务器: client = net.createConnection() 那我怎么才能正常断开与服务器的连接呢? 我试过client.end()甚至client.destroy() 但是当我使用netstat检查连接状态时,它显示连接处于状态FIN_WAIT2。 我怎样才能closures和摧毁连接?

在node.js webserver中写入错误后

由于“write after end”错误,我正在为自己的node.js爱好项目苦苦挣扎。 我创build了一个node.jsnetworking服务器,其中包括使用以下代码将从HTML页面接收的命令发送到另一个进程: var netSocket = require('net').Socket(); netSocket.connect(9090); netSocket.write(messages); netSocket.end(); 这个工作,直到stream量开始增加(即消息的数量和消息的大小)。 在这一点上,我得到以下错误: Error: write after end at writeAfterEnd (_stream_writable.js:132:12) at Socket.Writable.write (_stream_writable.js:180:5) at Socket.write (net.js:615:40) at Socket.<anonymous> (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/speech_module/web_server_HTTPS.js:66:15) at Socket.emit (events.js:95:17) at Socket.onevent (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/socket.js:327:8) at Socket.onpacket (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/socket.js:287:12) at Client.ondecoded (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/client.js:193:14) at Decoder.Emitter.emit (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20) 我的猜测是,9090的服务器正在被stream量所淹没,导致错误。 作为node.js世界中的一个完整的新手,我真的很感激我如何解决这个问题的任何提示。 还要注意的是,networking服务器通过SSL提供页面(如果有任何区别的话)。 感谢您抽时间阅读! 标记

Socket.io连接恢复到轮询,从不触发'连接'处理程序

我正在尝试将socket.io添加到我现有的node.js应用程序上。 我已经在服务器端添加了socket.io库,如下所示(直接跟在http://socket.io/get-started/chat/ )之后: var express = require('express') , http = require('http') , path = require('path') , fs = require('fs'); var app = express(); var http = http.Server(app); var io = require('socket.io')(http); // Express settings […] // Express routes […] // Socket.io Communication io.on('connection', function(socket) { console.log('a user connected'); }); // Start server app.listen(config.port, function () […]

什么是我可以扩展我的nodejs应用程序的最佳方式?

基础 现在我的一些朋友正在尝试开发一个用nodejs制作的浏览器游戏。 这是一个多人自上而下的射手,大部分的客户端和服务器端的代码是在JavaScript中。 我们有一个很好的总体方向,我们希望进入,我们正在开发游戏很有趣。 我们做这个游戏的目标之一就是尽可能的努力去作弊。 这样做,我们有所有的游戏逻辑处理服务器端。 客户端只通过web套接字将他们的input发送到服务器,服务器用游戏中正在发生的事情更新客户端(也是web套接字)。 这是我们问题的开始。 所有的服务器端math都变得相当沉重,我们发现我们需要以某种方式扩展来处理超过10个玩家(我们希望能够承载更多)。 起初我们认为我们可以根据需要垂直扩展,但由于nodejs是单线程的,因此只能利用一个内核。 这意味着获得更强大的服务器将不会帮助解决这个问题。 我们唯一的解决scheme是水平扩展。 为什么我们在这里问 我们还没有find如何扩展nodejs游戏的好例子。 我们的用例是非常特别的,虽然我们已经尽我们所能做到了这一点,但我们真的可以从外部的意见和build议中受益 细节 我们已经在如何解决这个问题上投入了大量的思想。 我们已经研究了一个多星期了。 以下是我们迄今所做的一切: 四种types的服务器 我们正在将任务分成4个不同的“服务器types”。 每个人都将完成一个特定的任务。 代理服务器 代理服务器将坐在整个堆栈的前端,并成为唯一可以从互联网上直接访问的服务器(可能会有更多这样的服务器)。 它会有haproxy,它会将所有连接路由到Web服务器。 我们selecthaproxy是因为它具有丰富的function集,可靠性和几乎无与伦比的速度。 Web服务器 Web服务器将收到Web请求,并提供所有的Web页面。 他们还将处理大堂的创build/pipe理和游戏创build/pipe理。 要做到这一点,他们会告诉游戏服务器他们有什么游说,大厅里有什么用户,以及他们将要玩的游戏的信息。 然后,networking服务器将更新关于用户input的游戏服务器,并且游戏服务器将更新游戏中正在发生的事件的networking服务器(谁将更新客户端)。 Web服务器将使用TCP套接字与游戏服务器进行任何types的pipe理,并且在进行关于游戏更新的通信时使用UDP套接字。 这将全部使用nodejs完成。 游戏服务器 游戏服务器将处理所有的游戏math和关于游戏的可变更新。 游戏服务器还与数据库服务器进行通信,以logging关于游戏中玩家的很酷的统计数据。 这将使用nodejs完成。 数据库服务器 数据库服务器将托pipe数据库。 这个部分实际上是最简单的,因为我们发现rethinkdb ,有史以来最酷的分贝。 这很容易扩展,奇怪的是,成为扩展应用程序的最简单的部分。 其他一些细节 如果您在整个调查过程中遇到困难,请仔细阅读,这是我们如何进行扩展的半精确图表。 如果你只是好奇,或者认为看看我们的游戏可能是有帮助的,那么目前它在这里是以非缩放状态托pipe的。 有些事情我们不想要 我们不想使用nodejs的集群模块。 这是不稳定的( 在这里说),它不扩展到其他服务器,只有其他处理器。 我们希望能够跨越水平缩放。 我们的问题总结 我们希望我们朝着正确的方向前进,我们已经做好了功课,但是我们并不确定。 我们当然可以就如何以正确的方式做到这一点提出一些build议。 谢谢 我意识到这是一个相当长的问题,做一个深思熟虑的答案并不容易,但我真的很感激。 […]

Node.js请求获取ETIMEDOUT和ESOCKETTIMEDOUT的模块

我正在爬取与请求模块的许多链接与asynchronous模块的组合并行。 我注意到ETIMEDOUT和ESOCKETTIMEDOUT错误的很多,虽然链接是可及的,并且使用chrome快速响应。 我已经将请求选项中的maxSockets限制为2, timeout为10000。 我使用限制为2的async.filterLimit() ,每次甚至将并行性降低到2个请求。 所以我有2个套接字,2个请求,10秒的超时等待从服务器的标题响应,但我得到这些错误。 这里的请求configuration我使用: { … pool: { maxSockets: 2 }, timeout: 10000 , time: true … } 以下是我用于fecth链接的代码片段: var self = this; async.filterLimit(resources, 2, function(resource, callback) { request({ uri: resource.uri }, function (error, response, body) { if (!error && response.statusCode === 200) { … } else { self.emit('error', resource, error); […]

使用node.js来侦听2个不同的端口

我目前正在使用Sockets.io与客户端进行通信,从端口发送JSON和什么。 这一切都运作良好,但我想要做的是同时听另一个端口创build一个pipe理页面types的testing目的。 例如,页面将有一个button来为所有在另一个端口上连接的客户端发送特定types的JSON。 如果这不是理想的,那么对其他简单解决scheme的帮助就会很大。