关于 websockets 异步 IO 的一个菜鸟疑问

查看 70|回复 4
作者:QiShine   
对一个 websockets ,在 client 上依次发出
await ws.send("read A")
A=await ws.recv()
await ws.send("read B")
B=await ws.recv()
await ws.send("read C")
C=await ws.recv()
如果服务器并不是按照请求顺序来回复,比如服务器发出
Data B
Data A
Data C
那么客户端能保证,A 的内容是"Data A"而不是"Data B" 吗?
给每个请求和回复一个相同的 ID,但是我不想在 recv 过后,还需要检查 ID,为啥没有 await cecv(ID),只获取指定 ID 的响应吗?

await, Data, read, WebSockets

ChefIsAwesome   
搞个 id 啊
Zhuzhuchenyan   
第一,websockets 作为一个单纯的协议并不应该关心客户端和服务端双方是如何对具体信息交互的,对于你的需求,唯一的方法就是自己封装一个更上层的解决方案来维护消息自身逻辑的收发有序性。
第二,从你给的代码,在第一次发送之后,在收到服务器回应之前,第二次信息不会被发送,自然也就不存在你所说的问题,我猜你想描述的是以下这种情况
await ws.send("read A")
await ws.send("read B")
await ws.send("read C")
# 此时如何保证 A ,B ,C 分别是 Data A ,B ,C
A=await ws.recv()
B=await ws.recv()
C=await ws.recv()
beyondstars   
您好,ws 自身的确无法保证 recv 和 send 的顺序一致。
ws 是为了解决什么问题呢?它主要是为了解决: 1 ) framing (因为 tcp 连接是一个 stream, tcp 连接是 boundless 的); 2 )连接复用; 3 )双向通信(让 server 也可以主动给 web client 发消息)。这些都跟顺序没关系。
你需要自己再在 ws 之上实现一层。
009694   
你服务端乱序返回关 ws 协议啥事? ws 接收时本身严格遵循发送顺序 当你应用层本身乱了 就得靠应用层自己排序
您需要登录后才可以回帖 登录 | 立即注册

返回顶部