节点 HTTP 和 WS 服务器未按预期升级连接

Node HTTP and WS server doesn't upgrade connection as expected

编辑: 修改问题和示例,尝试缩小范围。在本地开发中,我通过让 wshttp 每个都由自己的服务器在自己的端口上处理来避免这个问题,而且我 运行 遇到了一些试图在 OpenShift 上设置的问题,我仅限于一个端口。

我正在尝试使用 OpenShift 上的 Node 设置一个简单的基于 Websocket 的聊天系统,但我显然做错了什么 - 我设置了一个简单的服务器,它按预期提供了我的索引页面,但是当该页面请求 Websocket 连接,服务器尝试将其作为常规 HTTP 请求进行响应,而不是按预期升级连接。

Live Version

服务器:

var ip = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';
var port = process.env.OPENSHIFT_NODEJS_PORT || 8080;

var ws = require( 'ws' ).Server;
var http = require( 'http' );
var path = require( 'path' );
var fs = require( 'fs' );

// Create main HTTP server for the application
var httpServer = http.createServer( function( request, response ){
 
 console.log( 'REQUEST: ' + request.url );
 
 var filename = path.join( process.cwd(), request.url );
 fs.exists( filename, function( exists ){
  fs.readFile( filename, 'binary', function( err, file ){
   
   if ( err ){
    console.log( 'FILE ERROR: ' + request.url );
    response.writeHead( 500, {"Content-Type": "text/plain"} );
    response.write( "500 - File Error\n" + err + "\n" );
    response.end();
    return;
   }
      
   response.writeHead( 200 );
   response.write( file, 'binary' );
   response.end();
    
  } );
 } );
 
} ).listen( port, ip, function(){
 
 console.log( 'Server is listening at http://' + ip + ':' + port );

} );

// Create WebSocket server and begin listening
wsServer = new ws( { server: httpServer } );
wsServer.on( 'connection', function( connection ){

 console.log( 'New websocket connection...' );
 connection.on( 'message', function( message ){
  connection.set( 'Received: ' + message );
 } );
 connection.send( 'welcome!' );
 
});

客户/索引页:

<!DOCTYPE html>
<html>
 <head>
  <script>
  
   window.addEventListener( "load", function( event ){
    var socket = new WebSocket( 'ws://exalted-instanttabletop.rhcloud.com');
   } );
   
  </script>
 </head>
 <body>
  <div id="log">Connecting...</div>
 </body>
</html>

这是一个非常简单的示例应用程序的 link,它使用相同的 Node.js 服务器来接受和处理 WS 和 HTTP 连接。这应该有助于您入门:https://github.com/openshift-quickstart/openshift-nodejs-http-and-websocket-example

var ipaddress = process.env.OPENSHIFT_NODEJS_IP || "127.0.0.1";
var port = process.env.OPENSHIFT_NODEJS_PORT || 8080;
var WebSocketServer = require('ws').Server
var http = require('http');

var server = http.createServer(function (request, response) {
    console.log((new Date()) + ' Received request for ' + request.url);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write("Welcome to Node.js on OpenShift!\n\n");
    response.end("Thanks for visiting us! \n");
});

server.listen(port, ipaddress, function () {
    console.log((new Date()) + ' Server is listening on port 8080');
});

wss = new WebSocketServer({
    server: server,
    autoAcceptConnections: false
});

wss.on('connection', function (ws) {
    console.log("New connection");
    ws.on('message', function (message) {
        ws.send("Received: " + message);
    });
    ws.send('Welcome!');
});

console.log("Listening to " + ipaddress + ":" + port + "...");

事实证明,我在这里遇到的问题是 Openshift 已经预定义 websocket 连接必须进入端口 8000,然后转发到端口 8080在我的设备上,所以我的服务器需要在与我的客户端明确连接到的端口不同的端口上侦听,这是非常违反直觉的。

一个列出细节的 mostly unrelated question I found on here ultimately lead me to an article from Openshift