在Firefox中使用websocket时,出现GET请求碎片

本文关键字:出现 GET 请求 碎片 websocket Firefox | 更新日期: 2023-09-27 18:09:13

我目前正在用c#开发一个小型的websocket服务器来处理来自浏览器的连接。

我主要使用来自Mozilla和Microsoft的代码(分别在这里和那里)。不幸的是,当我尝试从浏览器连接到我的基本服务器时(脚本取自websocket.org), GET请求似乎是碎片化的…

我想理解为什么GET请求被分成两部分。让我向您展示我的代码以及从中得到的输出。

代码:

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
    {
        data = Encoding.UTF8.GetString(bytes,0,i);
        Console.WriteLine("Received: {0}", data);
    }
输出:

Received: GET / HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Received: 
Sec-WebSocket-Version: 13
Origin: null
Sec-WebSocket-Key: 2QYy54zGPPKAkNyPgFjkbw==
Connection: keep-alive, Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

我也尝试在Chrome上看看它会有多大的不同,并通过在浏览器中运行相同的代码和相同的脚本,我得到以下输出:

Received: GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: mp5oLqe/YaQAxRksoVZWKg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_
Received: max_window_bits, x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36

我在Chrome的输出中没有看到任何错误,所以我真的不明白为什么使用firefox时请求是分开的…我可以合并请求的两个部分在一起,但如果我正确理解RFC6455,任何错误的请求应该被服务器丢弃。

任何建议吗?

在Firefox中使用websocket时,出现GET请求碎片

完全可以。也许Firefox发送信息的方式(较慢),你必须读取两倍的网络缓冲区,但这是可以的。它似乎是发送的共同信息,永远不会改变的第一个,和关于websocket的信息(必须每次生成)最后,可能是为了减少"时间为第一个字节"。

根据HTTP协议,报头结束时,有一个空行,所以只要你没有得到一个网络缓冲区包含信息(读取!=0),你可以继续读取报头

通常,在进行网络编程时,您会经常发现这种情况。你必须继续阅读,直到网络流显示已读=0。