Websocket客户端不能在握手后发送,除非收到另一个消息

本文关键字:消息 另一个 不能 客户端 Websocket | 更新日期: 2023-09-27 18:17:21

我已经在c# Websocket服务器上工作了一段时间了,现在有一个问题我已经解决了,但从未解决或找到它存在的适当原因。

在我测试的环境中,在过去一年左右的时间里,我一直在Windows XP和Windows 7上使用谷歌的Chrome浏览器。我的服务器已经在两个操作系统上测试过了。

我注意到的问题只发生在浏览器在Windows XP下运行时。在Websocket握手完成后,浏览器/客户端不能向服务器发送数据,除非服务器先向客户端发送消息。

我所做的,只是在Ping帧上标记到服务器握手和所有预期的功能的结束。我也测试了其他帧,只要服务器发送消息,客户端就会正常进行。

来自服务器的消息也不需要是即时的。如果客户端试图发送消息,它可以无限期地等待。一旦服务器向客户端发送消息,客户端就继续执行。

现在,我想我在Websocket服务器上做了一些不正确的事情,但如果是这样的话,那么当浏览器在Windows 7下运行时,为什么一切都像预期的那样工作?我不需要在客户端向服务器释放消息之前向客户端发送消息。

作为一个非常基本的例子,这里是服务器代码将永远不会完成,如果Chrome从XP机器连接;

byte[] textPound = {0x81, 0x01, 0x23};
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 56100);
server.Bind(ip);
server.Listen(100);
byte[] buffer = new byte[1000];
Socket client = server.Accept();
int rec = client.Receive(buffer);
Handshake(buffer, ref rec);//custom function returns the handshake to the buffer
client.Send(buffer, rec, SocketFlags.None);
//client.Send(textPound);
rec = client.Receive(b);
client.Close();

只要。send()被注释掉。receive()将永远不会完成,如果Chrome在XP机器上运行,无论你如何从浏览器发送消息。如果在。receive()之前启动一个线程,该线程将在x时间后发出。send(),则该进程在此发生后完成。

有人经历过这种情况吗,或者知道为什么会这样吗?

EDIT—对于那些不知道WebSocket协议是什么的人;

协议文档API文档

Websocket客户端不能在握手后发送,除非收到另一个消息

如果你正在编写一个新的WebSocket实现,你可以看看AutobahnTestsuite

AutobahnTestsuite提供了一个完全自动化的测试套件,用于验证WebSocket协议的客户端和服务器实现的规范一致性和实现健壮性。

它被几十个项目使用,是某种测试的"事实上的标准"。

披露:我是Autobahn的原作者,为Tavendo工作。

相关文章: