Node.js BlueMix websocket-VCAP\u应用程序\u端口错误

Node.js BlueMix websocket-VCAP\u应用程序\u端口错误,node.js,websocket,ibm-cloud,Node.js,Websocket,Ibm Cloud,我已经创建了一个NodeJSWebSocket服务器和客户端 服务器: //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'

我已经创建了一个NodeJSWebSocket服务器和客户端

服务器:

//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 !!!');

});
//处理程序客户端
app.get('/client',函数(req,res){
//var url='ws://localhost:8888';//local
var url='ws://.mybluemix.net';//BlueMix
var WebSocket=require('ws')
,ws=新的WebSocket(url);
log('客户端:调用url:%s',url);
ws.on('open',function(){
ws.send('hello');
});
ws.on('message',函数(message){
console.log('客户端:收到:%s',消息);
});
res.send('CLIENT-WebSocket调用完成-检查日志!!!');
});
我的期望是使用BlueMix上的env VCAP_APP_端口/端口提供的端口。但我得到了服务器错误:监听并使用。这是合理的原因,因为它是从NodeJS运行时服务器使用的端口

本地所有其他端口均可工作(80/443/8888/5555/XXXX等),但客户端调用必须在该端口上完成:

本地测试:

  • 服务器localhost:6007-端口80>OK--客户端调用ws://localhost>OK

  • 服务器localhost:6007-端口433>OK——客户端调用ws://localhost:443>OK

  • 服务器localhost:6007-端口8888>OK--客户端调用ws://localhost:8888>OK

  • 服务器localhost:6007-端口5555>OK——客户端调用ws://localhost:5555>OK

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

BLUEMIX上的测试:

  • 服务器VCAP_应用程序_端口(62577-62045)>服务器错误:使用

  • 服务器端口80/443>服务器错误:侦听EACCES(权限被拒绝)

  • 服务器端口8888>正常--客户端调用ws://myapp.mybluemix.net:8888>错误:connect-ECONNREFUSED

  • 服务器端口8888>正常--客户端调用ws://myapp.mybluemix.net>错误:意外的服务器响应(500)

  • 服务器端口5555>正常--客户端调用ws://myapp.mybluemix.net>错误:意外的服务器响应(500)

  • 服务器端口5555>正常--客户端调用ws://myapp.mybluemix.net:5555>错误:connect

一,。BlueMix上必须使用哪个端口?
2.客户端呼叫必须在80/443上工作,Websocket是为在80(http)和443(https)端口上处理传入呼叫而创建的


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

从其中,使用服务器参数而不是端口创建WebSocketServer对象。请参见下面的示例

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

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) }); var server=require('http')。createServer() ,url=require('url') ,WebSocketServer=require('ws')。服务器 ,wss=newWebSocketServer({server:server}) ,express=require('express')) ,app=express() ,端口=4080; 应用程序使用(功能(请求、恢复){ res.send({msg:“hello”}); }); wss.on('connection',function connection(ws){ var location=url.parse(ws.upgradeReq.url,true); //您可以使用location.query.access\u令牌来验证或共享会话 //或ws.upgradeReq.headers.cookie(请参阅http://stackoverflow.com/a/16395220/151312) ws.on('message',函数传入(message){ console.log('接收到:%s',消息); }); ws.send('something'); }); server.on('request',app); listen(端口,函数(){console.log('Listening on'+server.address().port)});
使用现有的Express应用程序启动WebSocket服务器需要共享连接实例,而不是直接打开

从其中,使用服务器参数而不是端口创建WebSocketServer对象。请参见下面的示例

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

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) }); var server=require('http')。createServer() ,url=require('url') ,WebSocketServer=require('ws')。服务器 ,wss=newWebSocketServer({server:server}) ,express=require('express')) ,app=express() ,端口=4080; 应用程序使用(功能(请求、恢复){ res.send({msg:“hello”}); }); wss.on('connection',function connection(ws){ var location=url.parse(ws.upgradeReq.url,true); //您可以使用location.query.access\u令牌来验证或共享会话 //或ws.upgradeReq.headers.cookie(请参阅http://stackoverflow.com/a/16395220/151312) ws.on('message',函数传入(message){ console.log('接收到:%s',消息); }); ws.send('something'); }); server.on('request',app); listen(端口,函数(){console.log('Listening on'+server.address().port)});
非常感谢@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) })
var server=require('http')。createServer()
,url=require('url')
,WebSocketServer=require('ws')。服务器
,wss=newWebSocketServer({server:server})
,express=require('express'))
,app=express()
,端口=(process.env.port | | 4080);
//---------------------------------------------------------------------------
wss.on('connection',function connection(ws){
var location=url.parse(ws.upgradeReq.url,true);
//您可以使用location.query.access\u令牌来验证或共享会话
//或ws.upgradeReq.headers.cookie(请参阅http://stackoverflow.com/a/16395220/151312)
ws.on('message',函数传入(message){
console.log('服务器:在消息上-收到:%s',消息);
});
log('server:waiting connection');
发送(