BlueMix websocket - VCAP_APP_PORT错误EADDRINUSE

时间:2015-09-24 13:15:21

标签: node.js websocket ibm-cloud

我创建了一个NodeJS websocket服务器和客户端

SERVER:

//handler server 
app.get('/server', function (req, res) {

  //test websocket
  console.log("server: starting websocket server...");

  var port = (process.env.PORT || 8888); 

  var WebSocketServer = require('ws').Server;

  wss = new WebSocketServer({port: port});
  wss.on('connection', function(ws) {
      ws.on('message', function(message) {
          console.log('server: received: %s', message);
          ws.send('echo: ' + message);
      });
      ws.send('connected');
  });

  console.log("server: listening  websocket on " + appEnv.url + " - port " + port );
  res.send('SERVER - listening websocket on: ' + appEnv.url + " port " + port);

});

客户端

//handler client 
app.get('/client', function (req, res) {

    //var url = 'ws://localhost:8888';//local
    var url = 'ws://<appname>.mybluemix.net';//BlueMix

     var WebSocket = require('ws')     
          , ws = new WebSocket(url);

     console.log('client: calling url: %s', url);

     ws.on('open', function() {
         ws.send('hello');
     });
     ws.on('message', function(message) {
         console.log('client: received: %s', message);
     });

    res.send('CLIENT - WebSocket call done - check the log !!!');

});

我的期望是使用BlueMix上的env VCAP_APP_PORT / PORT提供的端口。但我得到服务器错误:听EADDRINUSE。这是合理的,因为它是NodeJS运行时服务器使用的端口。

Localy所有其他端口工作(80/443/8888/5555 / XXXX等)但客户端呼叫必须在该端口上完成:

本地测试:

  • SERVER localhost:6007 - 端口80&gt;确定 - 客户端调用ws:// localhost&gt;确定

  • SERVER localhost:6007 - port 433&gt; OK - 客户端调用ws:// localhost:443&gt;确定

  • SERVER localhost:6007 - 端口8888&gt;确定 - 客户端呼叫ws:// localhost:8888&gt;确定

  • SERVER localhost:6007 - port 5555&gt;确定 - 客户端调用ws:// localhost:5555&gt;确定

在BlueMix上使用VCAP_APP_PORT是不可能的,因为该端口是从NodeJS服务器使用的(错误EADDRINUSE)。似乎不允许使用端口80/443(错误EACCES权限被拒绝)。使用所有其他端口在服务器端工作。但BlueMix防火墙在传入呼叫时阻塞了除80/443之外的所有端口(这就是使用Websocket而不是Socket的原因)。

测试BLUEMIX:

  • SERVER VCAP_APP_PORT(62577-62045)&gt;服务器错误:听EADDRINUSE

  • SERVER端口80/443&gt;服务器错误:收听EACCES(权限被拒绝)

  • SERVER端口8888&gt;确定 - 客户呼叫ws://myapp.mybluemix.net:8888&gt;错误:连接ECONNREFUSED

  • SERVER端口8888&gt;确定 - 客户呼叫ws://myapp.mybluemix.net&gt;错误:意外的服务器响应(500)

  • SERVER端口5555&gt;确定 - 客户呼叫ws://myapp.mybluemix.net&gt;错误:意外的服务器响应(500)

  • SERVER端口5555&gt;确定 - 客户呼叫ws://myapp.mybluemix.net:5555&gt;错误:连接ECONNREFUSED

1。必须在BlueMix上使用哪个端口?
2.客户端呼叫必须在80/443上工作,创建Websocket用于处理80(http)和443(https)端口上的来电......?

由于

2 个答案:

答案 0 :(得分:0)

使用现有的Express应用程序启动WebSocket服务器需要您共享连接实例而不是直接打开。

documentation开始,使用 server 参数创建WebSocketServer对象,而不是 port 。请参阅下面的示例。

平台路由器接收的HTTP和WS流量都将使用PORT变量转发到应用程序绑定到的内部端口。

var server = require('http').createServer()
  , url = require('url')
  , WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({ server: server })
  , express = require('express')
  , app = express()
  , port = 4080;

app.use(function (req, res) {
  res.send({ msg: "hello" });
});

wss.on('connection', function connection(ws) {
  var location = url.parse(ws.upgradeReq.url, true);
  // you might use location.query.access_token to authenticate or share sessions
  // or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)

  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('something');
});

server.on('request', app);
server.listen(port, function () { console.log('Listening on ' + server.address().port) });

答案 1 :(得分:0)

非常感谢@James Thomas在BlueMix上按照你的建议尝试了乒乓WS。它有效!!

var server = require('http').createServer()
  , url = require('url')
  , WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({ server: server })
  , express = require('express')
  , app = express()
  , port = (process.env.PORT || 4080);

//---------------------------------------------------------------------------

wss.on('connection', function connection(ws) {
  var location = url.parse(ws.upgradeReq.url, true);
  // you might use location.query.access_token to authenticate or share sessions
  // or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)

  ws.on('message', function incoming(message) {
    console.log('server: on message - received: %s', message);
  });

  console.log('server: waiting connection');
  ws.send('msg from server');
});

//---------------------------------------------------------------------------

app.use(function (req, res) {

    //var url = 'ws://localhost:4080';
    var url = 'ws://<app>.mybluemix.net';

     var WebSocket = require('ws')     
          , ws = new WebSocket(url);

     console.log('client: calling url: %s', url);

     ws.on('open', function() {
         ws.send('msg from client');
         console.log('client: on open - sent msg from client');
     });
     ws.on('message', function(message) {
         console.log('client: on messagge - received: %s', message);
     });

  res.send({ msg: "client call done" });
});

//---------------------------------------------------------------------------

server.on('request', app);
server.listen(port, function () { console.log('Listening on ' + server.address().port) })