问题描述
我在客户端有 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)
。