如何在服务器和客户端上同步套接字 SID?

问题描述

我在客户端有 python_socketio 5.0.4,在服务器有 Flask-SocketIO 5.0.1。当客户端连接到服务器时,我想在客户端和服务器之间同步客户端的 SID。但是,当我在客户端打印 SID 时,它与在服务器上打印的 SID 不同。

有什么办法可以让服务器上的客户端的 SID 和客户端上的一样吗?

这是客户端的代码

import socketio

sio = socketio.Client()
sio.connect("http://localhost:5000")
print(sio.sid)  # czNJ6NXIAXP9-vgmAAAK
sio.emit("test_event")

这里是服务器:

from flask import Flask,request
from flask_socketio import SocketIO

app = Flask(__name__)
sio = SocketIO(app)

@sio.on("test_event")
def test_event():
    print(request.sid)  # ukJhK9ZIiXY_gTMAAAL   <---   this is different SID

sio.run(app)

解决方法

问题在于,您在客户端以 sid 的身份访问您的 sio.sid。 Socket.IO 客户端的 sid 属性是私有的,不应使用。

相反,使用 sio.get_sid() 方法获取 sid。这曾经不是问题,但是在 Socket.IO 协议的最新版本中,每个命名空间都需要有不同的 sid,因此应该使用 get_sid() 方法来获取正确的 sio.get_sid(namespace='/my-namespace')您的命名空间。

如果您使用的是非默认命名空间,则可以将其作为参数传递,如下所示:request for "https://server:8080/service/exec/": sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target] org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://server:8080/service/exec/": sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:741) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:684) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:600) ..... ..... Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1596) ... 53 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)