Javascript 节点HTTP和WS-server没有';无法按预期升级连接

Javascript 节点HTTP和WS-server没有';无法按预期升级连接,javascript,node.js,web-services,websocket,openshift,Javascript,Node.js,Web Services,Websocket,Openshift,编辑:全面检查问题和示例,尝试缩小范围。在本地开发中,我避免了这个问题,让ws和http在各自的端口上由各自的服务器处理,我在尝试设置OpenShift时遇到了一些问题,因为我只限于一个端口 我正试图使用OpenShift上的Node建立一个简单的基于Websocket的聊天系统,但我显然做错了什么-我已经建立了一个简单的服务器,它可以按预期提供我的索引页面,但是当该页面请求Websocket连接时,服务器尝试以常规HTTP请求的形式响应该请求,而不是按预期升级连接 服务器: var ip=

编辑:全面检查问题和示例,尝试缩小范围。在本地开发中,我避免了这个问题,让
ws
http
在各自的端口上由各自的服务器处理,我在尝试设置OpenShift时遇到了一些问题,因为我只限于一个端口

我正试图使用OpenShift上的Node建立一个简单的基于Websocket的聊天系统,但我显然做错了什么-我已经建立了一个简单的服务器,它可以按预期提供我的索引页面,但是当该页面请求Websocket连接时,服务器尝试以常规HTTP请求的形式响应该请求,而不是按预期升级连接

服务器:

var ip=process.env.OPENSHIFT_NODEJS|u ip |'127.0.0.1';
var port=process.env.OPENSHIFT_NODEJS|u port | 8080;
var ws=require('ws').Server;
var http=require('http');
var path=require('path');
var fs=要求('fs');
//为应用程序创建主HTTP服务器
var httpServer=http.createServer(函数(请求、响应){
log('REQUEST:'+REQUEST.url);
var filename=path.join(process.cwd(),request.url);
存在(文件名,函数(存在){
readFile(文件名,'binary',函数(err,file){
如果(错误){
log('文件错误:'+request.url);
writeHead(500,{“内容类型”:“text/plain”});
write(“500-文件错误\n”+错误+”\n”);
response.end();
返回;
}
书面答复(200);
write(文件'binary');
response.end();
} );
} );
})。侦听(端口、ip、函数(){
log('服务器正在侦听http://'+ip+':'+port);
} );
//创建WebSocket服务器并开始侦听
wsServer=newws({server:httpServer});
wsServer.on('connection',函数(connection){
log('newwebsocketconnection…');
connection.on('message',函数(message){
connection.set('Received:'+消息);
} );
连接。发送('welcome!');

});这里是指向一个非常简单的示例应用程序的链接,该应用程序使用同一个Node.js服务器来接受和处理WS和HTTP连接。这将帮助您开始:


下面是一个指向一个非常简单的示例应用程序的链接,该应用程序使用同一个Node.js服务器来接受和处理WS和HTTP连接。这将帮助您开始:


事实证明,我在这里遇到的问题是Openshift预定义了
websocket
连接必须在端口
8000
上,但随后会转发到我的设备上的端口
8080
,因此我的服务器需要监听的端口与我的客户端显式连接的端口不同,这是超反直觉的


我在这里找到的A最终会引导我找到一个列出详细信息的A。

事实证明,我在这里遇到的问题是Openshift预定义了
websocket
连接必须在端口
8000
上,然后在我的设备上转发到端口
8080
,因此,我的服务器需要监听的端口与我的客户端显式连接的端口不同,这非常违反直觉


我在这里找到的A最终会引导我找到一个列出详细信息的A。

您是否理解webSocket连接从一个带有一些自定义头的HTTP请求开始,然后当双方同意时,协议从HTTP切换到webSocket?因此,您只需要一个处理程序来查看websocket升级头的所有传入HTTP请求,然后就可以将该套接字传递给您的websocket代码。如果您在客户机和服务器中都使用socket.io,它只需连接到http服务器即可为您处理所有这一切。您本身并不创建单独的webSocket服务器。我从一般意义上理解应该这样做,但我只找到了上面链接的一个示例,我不清楚我做错了什么-我最初的
ws://
请求命中了HTTP服务器的标准响应部分,我想弄清楚的是,我应该做些什么来让它正确升级。完全更新了问题,以澄清我面临的问题,并给出了一个更简单但更完整的代码示例。您是否理解webSocket连接从带有一些自定义头的HTTP请求开始,然后在双方同意的情况下,协议从HTTP切换到webSocket?因此,您只需要一个处理程序来查看websocket升级头的所有传入HTTP请求,然后就可以将该套接字传递给您的websocket代码。如果您在客户机和服务器中都使用socket.io,它只需连接到http服务器即可为您处理所有这一切。您本身并不创建单独的webSocket服务器。我从一般意义上理解应该这样做,但我只找到了上面链接的一个示例,我不清楚我做错了什么-我最初的
ws://
请求命中了HTTP服务器的标准响应部分,我想弄清楚的是,我应该做些什么来让它正确升级。完全更新了问题,以澄清我遇到的问题,并给出了一个更简单但更完整的代码示例。感谢提供额外的示例。我以非常简单的形式对服务器进行了破坏和重建,试图找出区别,但迄今为止还没有成功——问题已经用我最新的版本更新了。我遇到了与以前相同的问题-尝试打开websocket连接被作为常规HTTP请求进行响应,而不是按照预期进行升级。感谢提供额外的示例。我以非常简单的形式对服务器进行了破坏和重建,试图找出区别,但迄今为止还没有成功——问题已经用我最新的版本更新了。我要去看电影
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 + "...");