我试图使用NodeJS,WS和Openshift创建一个简单的websocket应用程序
这是我的代码: 的package.json:
{
"name": "OpenShift-Sample-App",
"version": "1.0.0",
"description": "OpenShift Sample Application",
"keywords": [
"OpenShift",
"Node.js",
"application",
"openshift"
],
"author": {
"name": "John Smith",
"email": "example123@example.com",
"url": "http://www.google.com"
},
"homepage": "http://www.openshift.com/",
"repository": {
"type": "git",
"url": "https://github.com/openshift/origin-server"
},
"engines": {
"node": ">= 0.6.0",
"npm": ">= 1.0.0"
},
"dependencies": {
"express": "^4.12.3",
"socket.io" : "0.9.16",
"ws" : "0.4.31"
},
"devDependencies": {},
"bundleDependencies": [],
"private": true,
"main": "server.js"
}
app.js:
#!/bin/env node
// OpenShift sample Node application
var express = require('express');
var fs = require('fs');
var WebSocketServer = require('ws').Server;
var SampleApp = function () {
// Scope.
var self = this;
var url = '127.0.0.1:27017/' + process.env.OPENSHIFT_APP_NAME;
self.setupVariables = function () {
// Set the environment variables we need.
self.ipaddress = process.env.OPENSHIFT_NODEJS_IP;
self.port = process.env.OPENSHIFT_NODEJS_PORT || 8080;
if (typeof self.ipaddress === "undefined") {
// Log errors on OpenShift but continue w/ 127.0.0.1 - this
// allows us to run/test the app locally.
console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
self.ipaddress = "127.0.0.1";
}
;
};
self.populateCache = function () {
if (typeof self.zcache === "undefined") {
self.zcache = {'index.html': ''};
}
// Local cache for static content.
self.zcache['index.html'] = fs.readFileSync('./index.html');
};
self.cache_get = function (key) {
return self.zcache[key];
};
self.terminator = function (sig) {
if (typeof sig === "string") {
console.log('%s: Received %s - terminating sample app ...',
Date(Date.now()), sig);
process.exit(1);
}
console.log('%s: Node server stopped.', Date(Date.now()));
};
self.setupTerminationHandlers = function () {
// Process on exit and signals.
process.on('exit', function () {
self.terminator();
});
// Removed 'SIGPIPE' from the list - bugz 852598.
['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
].forEach(function (element, index, array) {
process.on(element, function () {
self.terminator(element);
});
});
};
self.createGetRoutes = function () {
self.getRoutes = {};
self.getRoutes['/'] = function (req, res) {
res.setHeader('Content-Type', 'text/html');
res.send(self.cache_get('index.html'));
};
};
self.initializeServer = function () {
self.createGetRoutes();
self.app = express();
// Add handlers for the app (from the routes).
for (var r in self.getRoutes) {
self.app.get(r, self.getRoutes[r]);
}
}
self.initialize = function () {
self.setupVariables();
self.populateCache();
self.setupTerminationHandlers();
// Create the express server and routes.
self.initializeServer();
};
self.start = function () {
var wss = new WebSocketServer({ server: self.app
})
wss.on('connection', function connection(ws) {
console.log(".....Connected");
var location = url.parse(ws.upgradeReq.url, true);
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
self.app.listen(self.port, self.ipaddress, function () {
console.log('%s: Node server started on %s:%d ...',
Date(Date.now()), self.ipaddress, self.port);
});
};
};
var zapp = new SampleApp();
zapp.initialize();
zapp.start();
我跑的时候: wscat --connect ws://something.rhcloud.com:8000
我得到了:
connected (press CTRL+C to quit)
disconnected
源代码有什么问题?
由于
答案 0 :(得分:1)
在(pre-docker)OpenShift中,您的应用程序通过监听process.env.OPENSHIFT_NODEJS_PORT
连接到系统负载均衡器。
OpenShift的负载均衡器然后在四个不同的端口上外部公开您的应用程序:
80
- 可用的基本http连接443
- 可用的基本https连接8080
- http和ws连接可用8443
- https和ws连接可用不幸的是,在OpenShift的pre-docker版本中,ws连接升级(来自http或https)只能在端口8080
和8443
上正常工作。
您可以通过包含客户端检查来测试服务器主机名是否包含字符串“rhcloud.com”来解决此问题。如果是,则需要使用备用端口号建立客户端的套接字连接。
较新的基于docker的OpenShift版本包括标准Web端口上的完整websocket支持。