我正在尝试在托管服务“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.json
,environment.yml
文件,shell ENV变量中获取它,或登录dotCloud仪表板,单击您的应用程序,然后单击Environment选项卡以查看您的应用程序变量列表。如果进行了这三个更改,您的问题将消失。
如果您需要更多的代码示例,请查看此github存储库,该操作与您尝试执行的操作类似。
https://github.com/3on/node-tcp-on-dotcloud