在Firefox中使用websocket时的碎片GET请求

时间:2014-06-19 11:27:23

标签: c# google-chrome firefox websocket handshake

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

我主要使用Mozilla和Microsoft的代码(分别为herethere)。不幸的是,当我尝试从浏览器连接到我的基本服务器时(脚本来自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,那么服务器应该删除任何错误的请求。

有什么建议吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

这完全没问题。也许Firefox以某种方式发送信息(较慢),您必须读取两次网络缓冲区,但这没关系。它似乎是发送永远不会改变的公共信息,并且在关于websocket的信息(必须每次都必须生成)之后,可能会缩短第一个字节的时间"。

关于HTTP协议,当有空行时标题结束,所以只要你没有得到一个并且网络缓冲区包含信息(readed!= 0),你就可以继续读取标题。

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