实际上,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."); });
});
可以在同一目录中运行npm install websocket.io 命令安装依赖库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 套接字怎么样,没有确切信息:根据最后一段 here,您不能使用除 80 和 443(HTTP 和 HTTPS)之外的任何端口从 Cloud Foundry 外部与您的应用程序通信,这让我觉得 TCP 套接字无法实现。但是,根据this的回答,你实际上可以使用任何其他端口...看来需要对这个问题进行一些深入的调查...