サーバー側と JS クライアントで Python 実装を使用して socket.io アプリを構築しています。
自分のマシンでアプリをテストすると、すべてが機能し、複数のクライアントに接続してサーバーとデータを交換できます。
アプリも機能します。ローカル ネットワークの他のマシンからアクセスすると、デスクトップでアプリをホストし、ラップトップとスマートフォンからアクセスします。
サーバーの 1 つ (Hetzner の VPS) でアプリをホストすると、正しく動作しません。アプリにアクセスして、html/js クライアントをロードすることはできます。クライアントはサーバーとの socket.io 接続も開始しconnect
ます。サーバー上でイベントを確認できます。
しかし、その後は何も機能しません。イベントを発行できず、サーバーからデータを受信しません。
ブラウザのネットワーク タブを調べると、いくつかの GET リクエスト (HTML、JS、CSS など) と への定期的な GET リクエストが表示され<myserver>/socket.io/?EIO=4&transport=polling&t=NVPxxx
ます。
これらの GET リクエストのそれぞれがconnect
サーバー上でイベントをトリガーします。接続が実際に完全に行われることはないと思います。
私のサーバーコードは次のようになります。
import socketio
import eventlet
import pandas as pd
sio = socketio.Server()
app = socketio.WSGIApp(sio, static_files={ # The client is served here
'/': './public/'
})
@sio.event
def connect(sid, environ):
print("Connection from: " + sid)
pushstate(sid)
<... more vent handlers etc. ...>
def run():
eventlet.wsgi.server(eventlet.listen(('localhost', 5000)), app)
if __name__ == '__main__':
run()
サーバーは、SSL を処理する nginx リバース プロキシの背後で実行され、(私の知る限り) websocket 接続をプロキシするように正しく構成されています。
プロキシ構成が問題の原因ではないことを確認するために、サーバーも直接実行しました。リバース プロキシがなくても、同じ問題が発生します。
クライアントは次のようになります。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<title>MyApp</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container-fluid">
More HTML here
</div>
<script src="https://cdn.socket.io/3.1.1/socket.io.min.js" integrity="sha384-gDaozqUvc4HTgo8iZjwth73C6dDDeOJsAgpxBcMpZYztUfjHXpzrpdrHRdVp8ySO" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>
<script src="index.js"></script> <!-- Here is the interesting part-->
</body>
</html>
そして index.js の JS 部分:
const sio = io() // Socket.IO conenction
sio.on('update', (data) => {
console.log(data)
update_Data(data) // do all Data updates
});
// example onClick there are more in the actual Code
$("#delete").click(function () {
sio.emit('remove', {name: $("input#Name").val()}, (result) => {
if (!result){
alert("Could not delete!");
}
});
});
編集 ---
サーバーからのログは次のとおりです。リバース プロキシを使用せずにサーバーを実行しているときに、1 つのクライアントに接続しました。クライアントが接続すると、サーバーは更新イベントをクライアントに送信します。このテストでは、サーバーにはまだデータがないため、更新中のデータは空です。
Server initialized for eventlet.
(6129) wsgi starting up on http://0.0.0.0:80
(6129) accepted ('77.21.X.X', 2540)
3c59561367e34bbcbd09361879428671: Sending packet OPEN data {'sid': '3c59561367e34bbcbd09361879428671', 'upgrades': ['websocket'], 'pingTimeout': 60000, 'pingInterval': 25000}
emitting event "update" to 3c59561367e34bbcbd09361879428671 [/]
3c59561367e34bbcbd09361879428671: Sending packet MESSAGE data 2["update",[]]
3c59561367e34bbcbd09361879428671: Sending packet MESSAGE data 0
77.21.X.X - - [26/Feb/2021 16:00:05] "GET /socket.io/?EIO=4&transport=polling&t=NVV4Op5 HTTP/1.1" 200 390 0.004566
f4934759613140be898f2d999767c728: Sending packet OPEN data {'sid': 'f4934759613140be898f2d999767c728', 'upgrades': ['websocket'], 'pingTimeout': 60000, 'pingInterval': 25000}
emitting event "update" to f4934759613140be898f2d999767c728 [/]
f4934759613140be898f2d999767c728: Sending packet MESSAGE data 2["update",[]]
f4934759613140be898f2d999767c728: Sending packet MESSAGE data 0
77.21.X.X - - [26/Feb/2021 16:00:10] "GET /socket.io/?EIO=4&transport=polling&t=NVV4Q2F HTTP/1.1" 200 390 0.005562
34343bbd72e24136a71f94b276e659ad: Sending packet OPEN data {'sid': '34343bbd72e24136a71f94b276e659ad', 'upgrades': ['websocket'], 'pingTimeout': 60000, 'pingInterval': 25000}
emitting event "update" to 34343bbd72e24136a71f94b276e659ad [/]
34343bbd72e24136a71f94b276e659ad: Sending packet MESSAGE data 2["update",[]]
34343bbd72e24136a71f94b276e659ad: Sending packet MESSAGE data 0
77.21.X.X - - [26/Feb/2021 16:00:15] "GET /socket.io/?EIO=4&transport=polling&t=NVV4RGt HTTP/1.1" 200 390 0.005401
^Cwsgi exiting
(6129) wsgi exited, is_accepting=True
localStorage.debug = '*';
クライアントは、デバッグが有効になっている socket.io クライアントを使用しても、コンソールにデバッグ出力を生成しないようです。
これは、Chrome のネットワーク タブのスクリーンショットです。
ログは次々に取得されたため、ID が一致しません。