实际上,process.env.VCAP_APP_PORT
环境变量为您提供了端口,Cloud Foundry L7 路由器 (nginx) 根据您的应用程序路由将您的 HTTP 流量重定向到该端口(例如 nodejsapp.vcap.me:80 被重定向到process.env.VCAP_APP_PORT
虚拟机上的端口) ,所以你绝对不应该将它用于 TCP 连接。此端口应用于侦听 HTTP 流量。这就是为什么您的示例在本地工作而不在 Cloud Foundry 上工作的原因。
对我有用的方法是使用 HTTP 服务器侦听 CF 提供的端口,然后将 Websocket 服务器(在下面的示例中为 websocket.io)附加到它。我创建了可以在本地和 CF 中运行的示例回显服务器。我命名的 Node.js 文件的内容example.js
是
var host = process.env.VCAP_APP_HOST || "localhost";
var port = process.env.VCAP_APP_PORT || 1245;
var webServerApp = require("http").createServer(webServerHandler);
var websocket = require("websocket.io");
var http = webServerApp.listen(port, host);
var webSocketServer = websocket.attach(http);
function webServerHandler (req, res) {
res.writeHead(200);
res.end("Node.js websockets.");
}
console.log("Web server running at " + host + ":" + port);
//Web Socket part
webSocketServer.on("connection", function (socket) {
console.log("Connection established.");
socket.send("Hi from webSocketServer on connect");
socket.on("message", function (message) {
console.log("Message to echo: " + message);
//Echo back
socket.send(message);
});
socket.on("error", function(error){
console.log("Error: " + error);
});
socket.on("close", function () { console.log("Connection closed."); });
});
依赖库websocket.io
可以安装npm install websocket.io
在同一目录中运行命令。还有一个manifest.yml
描述 CF 部署参数的文件:
---
applications:
- name: websocket
command: node example.js
memory: 128M
instances: 1
host: websocket
domain: vcap.me
path: .
所以,cf push
从这个目录运行部署的应用程序到我的本地 CFv2 实例(在cf_nise_installer的帮助下设置)为了测试这个 echo websocket 服务器,我使用了简单的index.html
文件,它连接到服务器并发送消息(一切都登录到控制台):
<!DOCTYPE html>
<head>
<script>
var socket = null;
var pingData = 1;
var prefix = "ws://";
function connect(){
socket = new WebSocket(prefix + document.getElementById("websocket_url").value);
socket.onopen = function() {
console.log("Connection established");
};
socket.onclose = function(event) {
if (event.wasClean) {
console.log("Connection closed clean");
} else {
console.log("Connection aborted (e.g. server process killed)");
}
console.log("Code: " + event.code + " reason: " + event.reason);
};
socket.onmessage = function(event) {
console.log("Data received: " + event.data);
};
socket.onerror = function(error) {
console.log("Error: " + error.message);
};
}
function ping(){
if( !socket || (socket.readyState != WebSocket.OPEN)){
console.log("Websocket connection not establihed");
return;
}
socket.send(pingData++);
}
</script>
</head>
<body>
ws://<input id="websocket_url">
<button onclick="connect()">connect</button>
<button onclick="ping()">ping</button>
</body>
</html>
剩下要做的就是在Index
页面的文本框中输入服务器地址(在我的例子中是 websocket.vcap.me),按下连接按钮,我们就可以通过 TCP 进行 Websocket 连接,这可以通过发送 Ping 和接收回显来测试。这在 Chrome 中运行良好,但是 IE 10 和 Firefox 存在一些问题。
“TRUE” TCP 套接字怎么样,没有确切的信息:根据最后一段 ,您不能使用除 80 和 443(HTTP 和 HTTPS)之外的任何端口从 Cloud Foundry 外部与您的应用程序通信,这让我认为 TCP套接字无法实现。但是,根据这个答案,您实际上可以使用任何其他端口......似乎需要对这个问题进行一些深入的调查......