web-dev-qa-db-ja.com

localhostでアプリケーションを実行しようとするときにnode.jsがアップグレードを必要とするのはなぜですか?

Localhostサーバーで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>
12
riadh zar

Upgrade Requiredは、クライアント(ブラウザなど)とサーバーの間でWebSocket接続を確立するときに送信されるヘッダーへの参照です。

コメントで述べた@Prinzhornのように、静的htmlページであるWebSocketサーバーに接続するクライアントアプリケーションが必要です。 このWebSocketの概要 を読んで、WebSocketの仕組みをよりよく理解することをお勧めします。

10

クライアントHTMLファイルをlocalhost URLとして開かずに、ファイルを直接開きます。

Webソケットサーバーを実行した後、

localhost:[port]/client.html->「アップグレードが必要です」というメッセージが表示されます。

file:///[folder]/client.html-> HTMLファイルが表示されます。

webソケットを備えたWebサーバーがないか、Webソケット用にWebサーバーを構成しなかったためです。したがって、ファイルシステムを使用する必要があります。

最も簡単な方法は、クライアントファイルを右クリックして、お気に入りのブラウザで開くことです。

4
fairisle

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;
}
0
mgukov

問題は、Webソケットサーバーがポート80で実行されているため、ブラウザーを使用してHTMLテンプレートを開くと、実際にはWebソケットサーバーを開いていることになります。これは、ブラウザーで開いているWebページがデフォルトでポート80を使用するためです。

これを修正するには、Webソケットサーバーのポートを3000などに設定します。

ws = new WebSocketServer({port: 3000})

次に、ブラウザーでページを開くと、Webソケットサーバーではなく実際のHTMLページが開きます。

0
mikias