【问题标题】:Why node.js requires an upgrade while trying to run an application on the localhost?为什么 node.js 在尝试在 localhost 上运行应用程序时需要升级?
【发布时间】:2016-02-29 11:10:47
【问题描述】:

当我尝试在 localhost 服务器上运行我的 node.js 应用程序时,它没有运行并且需要进行必要的升级。我尝试运行代码,但出现以下错误:

服务器代码

 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。
  • 不,我的应用程序中没有 http 服务器。
  • 您将如何显示您发布的 HTML(客户端代码)?
  • 我会将 http 服务器添加到我的代码中
  • 如果您有任何解决方案,请告诉我们?

标签: javascript node.js websocket real-time


【解决方案1】:

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

就像@Prinzhorn 在他的评论中所说,您需要一个连接到您的 WebSockets 服务器的客户端应用程序,这可能是一个静态 html 页面。我建议您阅读 this introduction to websockets 以更好地了解 WebSocket 的工作原理。

【讨论】:

    【解决方案2】:

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

    运行您的网络套接字服务器后,

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

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

    因为您没有任何带有网络套接字的网络服务器,或者您没有为网络套接字配置网络服务器。所以,你应该使用你的文件系统。

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

    【讨论】:

      【解决方案3】:

      您需要结合基于 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! 消息,但仍然是同样的问题
      【解决方案4】:

      问题是您的 Web 套接字服务器在端口 80 上运行,因此当您使用浏览器打开 html 模板时,您实际上是在打开 Web 套接字服务器。这是因为在浏览器中打开的网页默认使用端口 80。

      要解决此问题,请将您的 Web 套接字服务器的端口设置为 3000 之类的其他端口。

      ws = new WebSocketServer({port: 3000})

      然后,当您在浏览器中打开页面时,它将打开实际的 html 页面,而不是 Web 套接字服务器。

      【讨论】:

        猜你喜欢
        • 2012-10-03
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        相关资源
        最近更新 更多