NodeJS,WebSockets(WS)一个Openshift

我试图用NodeJS,WS和Openshift创build一个简单的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 – 连接ws://something.rhcloud.com:8000

我有:

 connected (press CTRL+C to quit) disconnected 

源代码有什么问题?

谢谢

在(docker之前的)OpenShift中,你的应用程序通过监听process.env.OPENSHIFT_NODEJS_PORT连接到系统负载均衡器。

OpenShift的负载均衡器会在四个不同的端口上从外部公开您的应用程序:

  1. 80 – 基本的http连接可用
  2. 443 – 基本的https连接可用
  3. 8080 – http和ws连接可用
  4. 8443 – https和ws连接可用

不幸的是,在OpenShift的pre-docker版本中,ws连接升级(从http或https)只能在端口80808443上正常工作。

您可以通过包含客户端检查来testing服务器主机名是否包含string“rhcloud.com”来解决此问题。 如果是这样,则需要使用备用端口号build立客户端的套接字连接。

较新的基于Docker的OpenShift版本包括在标准Web端口上的完整websocket支持。