0

サーバー側と 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 が一致しません。

4

0 に答える 0