嗨,我一直在测试websockets,到目前为止我已经把它连接起来了。但是当我开始向服务器发送数据时,我得到了一堆奇怪的字符。在
(从搜索中得到这些代码)
这是服务器:
import socket
import re
from base64 import b64encode
from hashlib import sha1
websocket_answer = (
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
'Sec-WebSocket-Accept: {key}\r\n\r\n',
)
GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8999))
s.listen(1)
client, address = s.accept()
text = client.recv(1024)
print "RECV----------------------------------"
print text
key = (re.search('Sec-WebSocket-Key:\s+(.*?)[\n\r]+', text)
.groups()[0]
.strip())
response_key = b64encode(sha1(key + GUID).digest())
response = '\r\n'.join(websocket_answer).format(key=response_key)
print "SEND----------------------------------"
print response
client.send(response)
while 1:
try :
print "SEND----------------------------------"
client.sendall('hello from server')
print "RECV----------------------------------"
print client.recv(1024)
except :
print "except"
break
客户如下:
^{pr2}$点击“连接”按钮后,我得到的是:
RECV----------------------------------
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:8999
Origin: null
Sec-WebSocket-Protocol: echo-protocol
Sec-WebSocket-Key: v6Fu1rJURofc7iIPbeaw0Q==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
Cookie: BG_PREFS=searches_includeapocrypha@no&fontsize@medium&language@en&default_version_display@all&default_version@SND&default_
version_overrides@no&quicksearch_search@&pslookup_language1@en&pslookup_language2@&pslookup_language3@&pslookup_language4@&pslooku
p_language5@&pslookup_showmoresearches@closed&pslookup_showversions@open&pslookup_showmoreversions@closed&pslookup_showoptions@ope
n&pslookup_showfootnotes@yes&pslookup_showxrefs@no&pslookup_showwoj@no&pslookup_showversenums@yes&pslookup_showheadings@yes&pslook
up_showindent@no&pslookup_multilayout@columns&pslookup_multisort@passage&pslookup_embed-versenum@true&pslookup_embed-xref@false&ps
lookup_embed-footnote@false&pslookup_embed-heading@false&keysearch_search@&keysearch_language1@en&keysearch_language@en&
SEND----------------------------------
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Protocol: echo-protocol
Sec-WebSocket-Accept: qVkmFtRs1w8OUwZSe5nMpTWNxbI=
SEND----------------------------------
RECV----------------------------------
keysearch_bookset@&keysearch_spanbegin@1&keysearch_spanend@73&keysearch_limit@none&keysearch_startnumber@1&keysearch_searchtype@al
l&keysearch_showversions@open&keysearch_showmoreversions@closed&keysearch_showoptions@open&keysearch_displayas@long&keysearch_resu
ltspp@25&keysearch_sort@bookorder&keysearch_wholewordsonly@no&commentary_source@1&topindex_source@1&topindex_search@&topindex_sear
ch_type@any&topindex_resultspp@25&audio_source@3&audio_book@&audio_chapter@&dict_source@1&dict_search@&dict_search_type@any&pslook
up_search@>>>>&pslookup_version@NIV>>>>&undefined&keysearch_version@31>>>>; CoreID6=83844698672113373932637&ci=90320803; __atuvc=2
|20
握手似乎很好,是有联系的。 然后当我从客户端发送文本“test”时,我得到了这个。在
üäQk╩¼%♫╣╪
这跟字符编码有关吗? 我无法获取发送到服务器的“test”字符串。 我在客户端也没有得到任何消息。在
注: 我在chrome19上测试了客户端。在
根据RFC,客户机发送的不是文本数据,而是binary frames。在
WebSockets是一种框架协议。它具有与原始套接字相似的延迟,但数据不会通过网络进行原始发送:
头:帧的开头有一个双字节的头。如果有效负载分别大于125字节或65535字节,则也可以是4字节或10字节的报头。
二进制或文本:标题还指示数据是二进制还是文本。在您的例子中,数据是文本。要发送二进制数据,必须从Javascript发送ArrayBuffer或Blob。如果你发送一个字符串,那么数据将是文本。如果服务器发送二进制帧,则onmessage事件将接收blob或arraybuffer,具体取决于WebSocket.binaryType字段。
屏蔽:必须屏蔽从客户端(浏览器)到服务器的所有数据。这是为了解决行为不端的缓存中介的理论问题。从服务器到客户端的数据不能被屏蔽。报头有一个位指示有效负载是否被屏蔽。如果它被屏蔽,那么头后面的前四个字节就是掩码。这将作为一个正在运行的XOR应用于有效负载数据,以取消对它的屏蔽。
你发送了一个字符串“你的测试”。服务器接收到10个字节的数据:2个字节的头,4个字节的掩码,4个字节的屏蔽负载。在
请参见section 5.2 of the IETF 6455 WebSocket protocol specification查看框架如何工作以及头中字段的位级细分。在
相关问题 更多 >
编程相关推荐