为什么在本地主机上运行应用程序时,node.js需要升级?

20
当我尝试在本地主机上运行我的node.js应用程序时,它无法运行并要求进行必要的升级。我尝试运行代码,但出现以下错误:

screenshot

服务器代码
 var WebSocketServer = require('ws').Server,
    ws = new WebSocketServer({port: 80}),
    CLIENTS=[];


**new connection etablished**
 ws.on('connection', function(conn) {
         CLIENTS.push(conn);
         conn.on('message', function(message) {
         console.log('received:  %s', message);
         sendAll(message);

    });


 console.log("new connection");
         conn.send("NOUVEAU CLIENT CONNECTE");

                **if you close connection**
         conn.on('close', function() {
           console.log("connection closed");
           CLIENTS.splice(CLIENTS.indexOf(conn), 1);
         });

    });
    **send messeages vers all clients**

function sendAll (message) {
    for (var i=0; i<CLIENTS.length; i++) {
      var j=i+1;
      CLIENTS[i].send("Message pour le client "+j+": "+message);
    }
}

客户端代码

      <p>
        Result :<output name="" type="text" id="result" value"readonly"></output>
      </p>
      <input type="text" onchange="ws.send(this.value);">
      </body>
      <script>
          var ws =new WebSocket('ws://localhost:80');
          ws.onmessage=function(event){
              document.getElementById("result").value=event.data;
          }
      </script>

你是否也有一个HTTP服务器来提供HTML呢?因为看起来你试图使用浏览器导航到WebSocket。 - Prinzhorn
不,我的应用程序中没有HTTP服务器。 - riadh zar
你打算如何展示你发布的HTML(客户端代码)? - Prinzhorn
我会在我的代码中添加HTTP服务器。 - riadh zar
如果您有任何解决方案,请告诉我们吧? - Sandip Lawate
4个回答

16

Upgrade Required是在客户端(即浏览器)和服务器之间建立WebSocket连接时发送的标头的参考。

正如@Prinzhorn在他的评论中所说,您需要一个连接到WebSockets服务器的客户端应用程序,它可以是静态html页面。我建议您阅读这篇关于WebSockets介绍,以更好地了解WebSockets的工作原理。


11

不要将本地客户端HTML文件作为localhost URL打开,而是直接打开文件。

运行您的Web Socket服务器后,

localhost:[端口号]/client.html -> 您将收到消息“需要升级”。

file:///[文件夹]/client.html -> 您可以看到您的HTML文件。

因为您没有任何带有Web Socket的Web服务器或未配置Web服务器以用于您的Web Socket。因此,您应该使用文件系统。

最简单的方法是右键单击客户端文件并使用您喜欢的浏览器打开它。


0
问题在于您的Web套接字服务器正在端口80上运行,因此当您使用浏览器打开HTML模板时,实际上是在打开Web套接字服务器。这是因为在浏览器中打开的网页默认使用端口80。
要解决此问题,请将Web套接字服务器的端口设置为其他端口,例如3000。 ws = new WebSocketServer({port: 3000}) 然后,当您在浏览器中打开页面时,它将打开实际的HTML页面,而不是Web套接字服务器。

0
你需要将基于WebSocket的服务器和静态HTML生成器Express结合起来。 例如:
var express = require('express')
var expressWs = require('express-ws')

var app = express()
expressWs(app)

app.ws('/echo', (ws, req) => {

    ws.on('connection', function (connection) {
        //...
    })

    ws.on('close', function () {
        //...
    })
})

app.use(express.static('public'))
app.listen(3000, function () {
    console.log('Example app listening on port 3000!')
})

在客户端代码中

var ws = new WebSocket('ws://localhost:3000/echo');
ws.onmessage=function(event){
   document.getElementById("result").value=event.data;
}

我正在使用你的代码,在控制台中收到了 Example app listening on port 3000! 的消息,但问题仍然存在。 - Muhammad Hassaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接