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>
Upgrade Required
は、クライアント(ブラウザなど)とサーバーの間でWebSocket接続を確立するときに送信されるヘッダーへの参照です。
コメントで述べた@Prinzhornのように、静的htmlページであるWebSocketサーバーに接続するクライアントアプリケーションが必要です。 このWebSocketの概要 を読んで、WebSocketの仕組みをよりよく理解することをお勧めします。
クライアントHTMLファイルをlocalhost URLとして開かずに、ファイルを直接開きます。
Webソケットサーバーを実行した後、
localhost:[port]/client.html
->「アップグレードが必要です」というメッセージが表示されます。
file:///[folder]/client.html
-> HTMLファイルが表示されます。
webソケットを備えたWebサーバーがないか、Webソケット用にWebサーバーを構成しなかったためです。したがって、ファイルシステムを使用する必要があります。
最も簡単な方法は、クライアントファイルを右クリックして、お気に入りのブラウザで開くことです。
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;
}
問題は、Webソケットサーバーがポート80で実行されているため、ブラウザーを使用してHTMLテンプレートを開くと、実際にはWebソケットサーバーを開いていることになります。これは、ブラウザーで開いているWebページがデフォルトでポート80を使用するためです。
これを修正するには、Webソケットサーバーのポートを3000などに設定します。
ws = new WebSocketServer({port: 3000})
次に、ブラウザーでページを開くと、Webソケットサーバーではなく実際のHTMLページが開きます。