2015-12-29 2 views
1

Я пытаюсь создать простое приложение с WebSocket NodeJS, WS и OpenShiftNodeJS, WebSockets (WS) OpenShift

Это мой код: 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": "[email protected]", 
    "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" 
} 

приложение. ЯШ:

#!/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 

Что плохого в исходном коде?

Благодаря

ответ

1

В (предварительно Докер) OpenShift, приложение подключается к балансиру нагрузки системы путем прослушивания process.env.OPENSHIFT_NODEJS_PORT.

балансировка нагрузки OpenShift в то выставляет заявку внешне на четыре различных портов:

  1. 80 - основных соединения HTTP доступных
  2. 443 - соединения основного HTTPS доступных
  3. 8080 - HTTP и соединения WS доступны
  4. 8443 - https и ws соединения доступны

К сожалению, в версиях OpenShift до докеров обновление соединения ws (от http или https) будет работать только правильно на портах 8080 и 8443.

Вы можете обойти эту проблему, включив проверку на стороне клиента, чтобы проверить, содержит ли имя хоста сервера строку «rhcloud.com». Если это так, вам нужно установить соединение сокета вашего клиента с использованием номера альтернативного порта.

Новые выпуски OpenShift, основанные на докере, включают полную поддержку websocket на стандартных веб-портах.

Смежные вопросы