Tag: 套接字

什么是我可以扩展我的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的帮助就会很大。

Node.js + Socket.io + MongoDB webapps如何真正asynchronous?

我有一个很好的老式LAMPnetworking应用程序。 一个星期前,我需要添加一个推送通知机制。 因此,我所做的是在服务器上添加node.js + socket.io,并每隔10秒使用node.js轮询MySQL数据库以检查是否有新项目:如果是,我将它们发送到客户端s)与socket.io。 我对结果非常满意,即使这不是一个适当的实时通知(因为有10秒的延迟)。 现在,我即将build立一个新的Web应用程序,它也需要推送通知。 我想知道是否要采用与第一个(我认为更稳定和成熟)相同的方法,或者完全不使用PHP和Apache来完全使用Node.js。 至于数据库,我已经决定去MongoDB了。 最后,我的问题是:如果我去Node.js + Socket.io + MongoDB,我会得到一个真正 接近实时的 Web应用程序? 我的意思是,只要一条新logging被插入到MongoDB中,会不会有某种事件触发我可以通过node.js捕获,做一些检查,如果相关的话,把通知发送给客户端? 或者,无论如何,有一些在数据库服务器端和滞后轮询,如我的第一个LAMPnetworking应用程序? 一个相关的问题:你可以在MySQL上build立一个实时的Web应用程序,而不用像我的第一个应用程序那样进行轮询。 还是你需要MongoDB(或Redis)? 我希望这个问题不是太傻 – 对不起,我刚刚开始与Node.js和合作。 谢谢。

是否可以在node.js服务器上设置一个运行(服务器端)的socket.io客户端?

我想在两个或多个不同的node.js应用程序服务器之间启用基于套接字的p2p通信。 我使用socket.io来处理给定的服务器和它所服务的Web应用程序之间的所有这种通信 – 但是我正在寻找的是一种沟通服务器到服务器的方式。 我最初认为它会像这样简单: var io = require("socket.io"); var socket = io.connect("my remote endpoint"); 但是,事实certificate,服务器端的socket.io实现不提供“连接”方法,只有一个监听方法。 为什么是这样? 为什么我不能将节点应用程序服务器作为运行在别处的socket.io服务器的客户端? 有什么办法可以实现这个function吗?

io.on('connection',…)vs io.sockets.on('connection',…)

我正在使用socket.io和平均堆栈的Web应用程序。 我启动了3006端口上的套接字服务器。 var http = require('http').createServer(app); http.listen(3006); var io = require('socket.io').listen(http); 这两个似乎连接工作。 io.on('connection', function (socket) { console.log('Socket succesfully connected with id: '+socket.id); }); 和… io.sockets.on('connection', function (socket) { console.log('Socket succesfully connected with id: '+socket.id); }); io.on和io.sockets.on什么区别,我应该在第一次连接时使用哪一个? 虽然socket.on npm页面使用io.on为什么它为io.sockets.on工作

使用Socket.IO授权和握手

我想知道授权和Socket.IO握手的主要function是什么。 我已经在GitHub上阅读过他们的wiki和授权指南 ,但是我仍然不明白以下内容: 授权如何在Socket.io中工作? 什么是Socket.IO握手? 我可以添加任何东西到handshakeData对象? 我希望你能回答我的问题。 谢谢。

在Socket.io中创build房间

我想请求你的帮助。 我在socket.io的客户端很困难,我想在客户端调用这个代码在socket.io中创build一个空间: var rooms = []; socket.on('create', function (roomname) { rooms[room] = room; socket.room = roomname; socket.join(roomname); subscribe.subscribe(socket.room); }); 我不知道这是否正确,如果不是,请帮我纠正这个家伙。 我不是在节点js和套接字赞成,但我已经阅读他们的维基。 有没有什么办法可以创造空间? 多谢你们。

Node.js / Server.js套接字的实现问题

很难实现一个node.js / server.js设置 我现在有点被卡住了,希望有人能说出点儿意见。 我对套接字相对来说比较陌生,但是已经使用javascript进行了多年的编程,尽pipe只需要尽可能深入地完成手头的任务。 因此,我对JavaScript栈堆和一般套接字的一些概念的理解是有限的。 好的情况如下: 我创build了一个应用程序,旨在简单地增加一个计数器,在几台机器上。 多个用户可以点击“下一步”button,它会立即在所有机器上更新。 当你第一次连接,它检索当前的号码,并吐出本地。 我在这里创build了服务器: var io = require("socket.io"); var sockets = io.listen(8000); var currentlyServing=0; sockets.on("connection", function (socket) { console.log("client connected"); socket.emit("receive", currentlyServing); socket.on("update", function(serving) { currentlyServing=serving; if(currentlyServing>100) currentlyServing=0; if(currentlyServing<0) currentlyServing=99; socket.broadcast.emit("receive", currentlyServing); console.log("update received: "+currentlyServing); }); }); console.log("Server Started"); 这里是相关的(我希望)从客户端摘录: var socket = io.connect("http://www.sampledomain.com:8000"); //function to update the […]

我可以在heroku上设置socket.io聊天吗?

我有一个简单的socket.io聊天应用程序,我已经上传到新的Heroku'雪松'堆栈之一。 现在我几乎有所有的工作,但我已经遇到了一个绊脚石。 在我的本地主机上,我从客户端打开一个到套接字服务器的连接: // lots of HTML omitted socket = new io.Socket('localhost', {port: 8888}); 但是在Heroku上,我显然必须用别的东西替代这些值。 我可以从服务器上的过程对象获取端口,如下所示: port = process.env.PORT || 8888 并传递给视图。 但是,我用什么来代替'localhost'呢?