我正在尝试在托管服务“dotcloud”上托管一个nodejs应用程序。
我的nodejs使用包“websocket”来处理通信。
IE。 npm安装websocket

当我的应用程序在笔记本电脑上的localhost上运行时,它的运行效果很好。但是,当我在dotcloud上部署应用程序时,它无法正常工作。

这是怎么回事:您将浏览器指向dotcloud上的URL:
pirate-captainlonate.dotcloud.com

然后,express使用express.get('/'.......){}处理GET请求。
express如您所愿,将.html页面提供给客户端。 .html文件
依次尝试与服务器建立websocket连接。再一次我可以得到
这在我的本地计算机上可以正常工作。但是,没有建立连接。
具体来说,dotcloud肯定为我提供了.html文件,但是.html文件并未与服务器建立websocket连接。但是,也没有调用connection.onerror。有点奇怪。

这是一些代码,以帮助您了解我在做什么:

客户端:

this.connection = new WebSocket('ws://pirate-captainlonate.dotcloud.com:1337');

this.connection.onerror = function (error) {
        console.log("ERROR with the connection *sadface*");
    };

**** Note that I note the onerror function here to show that I do indeed have it set up, but it's not being called. It would seem that no error is being thrown.

服务器端:
var webSocketServer = require('websocket').server; // websocket
var server = require('http').createServer();
var expr = require("express"); // load the express module
var xpress = expr(); // xpress now holds the server object

// Helps Node serve the game.html page upon a get request
xpress.configure(function() {
    xpress.use(expr.static(__dirname + "/public"));
     xpress.set("view options", {layout: false});
});

// All requests to root serve the game.html page
xpress.get('/', function(req, res) {
    res.sendfile(__dirname + '/public/game.html');
});

// What ports to listen on
var webSocketsServerPort = 1337;
xpress.listen(8080);
server.listen(webSocketsServerPort, function() {
    console.log((new Date()) + " Server is listening on port " + webSocketsServerPort);
});

// WebSocket Server
var wsServer = new webSocketServer({
    httpServer: server
});

那应该足够的代码向大家展示它是如何工作的。现在你们中的一个可能会问,“>> dotcloud logs”显示了什么?
[www.0] ==> /var/log/supervisor/app.log <==
[www.0] Sat Feb 16 2013 02:57:59 GMT+0000 (UTC) Server is listening on port 1337
[www.0] ==> /var/log/supervisor/supervisord.log <==
[www.0] 2013-02-16 02:57:57,946 WARN Included extra file "/home/dotcloud/current/supervisord.conf" during parsing
[www.0] 2013-02-16 02:57:58,033 INFO RPC interface 'supervisor' initialized
[www.0] 2013-02-16 02:57:58,033 WARN cElementTree not installed, using slower XML parser for XML-RPC
[www.0] 2013-02-16 02:57:58,033 CRIT Server 'unix_http_server' running without any HTTP authentication checking
[www.0] 2013-02-16 02:57:58,038 INFO daemonizing the supervisord process
[www.0] 2013-02-16 02:57:58,039 INFO supervisord started with pid 140
[www.0] 2013-02-16 02:57:59,048 INFO spawned: 'app' with pid 154
[www.0] 2013-02-16 02:58:00,290 INFO success: app entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
[db.0] ==> /var/log/mongodb/mongodb.log <==
[db.0] Sat Feb 16 01:45:02 [conn4] end connection 127.0.0.1:51326 (0 connections now open)

好吧,好吧,我真的很想开始工作。我一直在这里。让我知道你们还有什么需要帮助我回答我的问题的。

谢谢,

-内森(Nathan)

附录:这是服务器发送html文件的方式。
xpress.get('/', function(req, res) {
    res.sendfile(__dirname + '/public/game.html');
});

最佳答案

您似乎正在尝试使用2个http端口来提供服务,而dotCloud仅支持1个开箱即用,因此您需要通过在dotcloud.yml中添加一个小片段来让他们知道您想要另一个

这是一个示例dotcloud.yml,它要求第二个tcp端口服务器

app:
    type: nodejs
    ports:
       server: tcp
    config:
       node_version: v0.8.x

添加并推送后,将为您的服务器提供一个可用于服务器的第二个TCP端口,您只需从环境文件中获取值即可找出哪个端口。

这是一个片段,将从ENV获取您的端口,如果不存在,它将默认为4242,因此您仍然可以在本地运行。
var webSocketsServerPort = process.env['PORT_SERVER'] || 4242;

如果您想知道我如何获得ENV变量名,这很简单。它将是PORT_,然后是dotcloud.yml中名称的大写字符串。因为我在上面使用了服务器,所以它变成了 PORT_SERVER ,如果我使用的 Node 是PORT_NODE,那么请输入所需的内容,但要确保这些值匹配。

客户:

为了找出您需要在客户端上连接到哪个端口,您需要再次返回到环境变量。这次,您正在寻找一个类似于DOTCLOUD_APP_SERVER_PORT的变量。 重要:您的变量名称可能不同

我如何获得该环境变量名称?

变量名看起来像这样DOTCLOUD_{{app_name}}_{{port_name}}_PORT大写。将{{variable}}替换为以下信息。
{{app_name}} = dotcloud.yml中应用程序的名称,在上面的示例中为app{{port_name}} =端口名称,上面dotcloud.yml示例中的server

要找到它,您可以从应用程序environment.jsonenvironment.yml文件,shell ENV变量中获取它,或登录dotCloud仪表板,单击您的应用程序,然后单击Environment选项卡以查看您的应用程序变量列表。

如果进行了这三个更改,您的问题将消失。

如果您需要更多的代码示例,请查看此github存储库,该操作与您尝试执行的操作类似。

https://github.com/3on/node-tcp-on-dotcloud

09-11 19:16