0

我正在使用服务器端的 python 实现和 JS 客户端构建一个 socket.io 应用程序。

当我在我的机器上测试我的应用程序时,一切正常,我可以连接多个客户端并与服务器交换数据。
该应用程序也可以工作,当我从本地网络中的其他机器访问它时,我将应用程序托管在我的桌面上并从我的笔记本电脑和智能手机访问它。

当我在我的一台服务器(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!");
        }
    });
});

编辑---
这是来自服务器的日志。我连接了一个客户端,同时运行没有反向代理的服务器。当客户端连接时,服务器会向它们发送更新事件。在这个测试中,Server 还没有数据,所以 update 中的数据是空的。

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