net模块有一个createServer函数,允许您创建网络包装器。这在Nodejs的本地运行时很好,但在Bluemix中运行时,它无法确定主机地址。服务器似乎被创建,但进一步检查后,我找到了服务器。地址为空
var tls = require('tls');
var fs = require('fs');
var net = require('net');
var tunnelHost = (process.env.VCAP_APP_HOST || 'localhost');
var tunnelPort = 8888;
var server;
var gatewayOptions = {
host: 'http://cap-sg-prd-5.integration.ibmcloud.com/',
port: '15133',
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem'),
ca: fs.readFileSync('ca.pem')
};
console.log("starting createSecureTunnel");
//create a server end point to use as a network wrapper for the secure gateway
server = net.createServer(function (connListener){
console.log('net server created');
connListener.on('end', function() {
console.log('client disconnected');
});
connListener.on('uncaughtException', function(err){
console.log('exception caught: ' + JSON.stringify(err));
});
//connect to farside, local/private server
connectFarside(connListener, function(err, remoteSocket){
if (err){
console.log(err);
}
console.log('connection made');
remoteSocket.pipe(connListener);
console.log('remote socket connecte to local connListener');
connListener.pipe(remoteSocket);
console.log('local connListener connected to remote socket');
});
});
//setup listener for network wrapper
server.listen(tunnelPort, tunnelHost, function(){
console.log('tunnel created at: ' + tunnelHost +":"+ tunnelPort); //.address +":"+ server.address().port);
});
//createa a TLS connection to the secure gateway
function connectFarside(conn, callback) {
console.log("starting connectFarside");
try {
console.log("initiating farside connection");
var socket = tls.connect(gatewayOptions, function(){
console.log("tunnel connected to " + gatewayOptions.host +":"+ gatewayOptions.port);
callback(null, socket);
});
socket.on("error", function(err){
console.log("Socket error: " + JSON.stringify(err));
});
} catch(err) {
console.log(err);
callback(err);
}
}
Bluemix为你的应用程序提供了一个运行端口,这就是它不能在Bluemix中工作的原因。你开始在8888
端口上启动你的应用程序,使用下面的代码行。
var tunnelPort = 8888;
应该改成
var tunnelPort = process.env.VCAP_APP_PORT || 8888;
上面一行将读取一个名为VCAP_PORT
的环境变量,其中Bluemix为您的应用程序分配了一个端口,如果它没有运行Bluemix,它将运行在端口8888
上。
您的应用程序将在端口80
和443
上通过web访问。Bluemix将为您的应用程序实现负载平衡。
可以在监听服务器时指定服务器地址
var net = require('net')
var server = net.createServer(handler)
server.listen(port, address)
试试address = '0.0.0.0'
,看看是否有效
使用cf-autoconfig模块部分解决。它有助于重新配置模块,以便在Cloud Foundry平台上使用。通过将此作为应用程序的第一行,它基本上可以工作。它不使用端口号。但至少我可以访问包装器。
所以我添加了这个作为第一行
require("cf-autoconfig");
然后我换了服务器。听听这个
//setup listener for network wrapper
server.listen(tunnelPort, function(){
console.log('tunnel created at: ' + tunnelHost +":"+ tunnelPort); //.address +":"+ server.address().port);
});
现在,如果我使用我的应用程序名称,我可以连接到由net.createServer()创建的服务器。
我仍然想知道如何让端口工作,所以这可以在web应用程序内部使用,以提供隧道。