我只是想尝试使用WebSockets。我在python中编写了服务器代码。服务器运行正常但是当尝试使用浏览器连接到套接字时,我收到错误
“与'ws:// localhost:9876 /'的WebSocket连接失败:已收到 意外的延续框架“
在互联网上引用时,我知道它与从服务器发送的数据框架有关。我在发送数据时试图遵循these(rfc6455)标准,即使我无法实现websocket连接。几乎类似的问题被问到here,但这是一个老帖子,解决方案也不清楚。
这是我非常简单的服务器代码..
import socket
def handle(s):
print repr(s.recv(4096))
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
s.bind(('',9876))
s.listen(2)
handshakes='\
HTTP/1.1 101 Web Socket Protocol Handshake\r\n\
Upgrade: WebSocket\r\n\
Connection: Upgrade\r\n\
Sec-WebSocket-Origin: null\r\n\
Sec-WebSocket-Location: ws://localhost:9876/\r\n\
'
def handshake(hs):
hslist = hs.split('\r\n')
body = hs.split('\r\n\r\n')[1]
key = ''
cc = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
for h in hslist:
if h.startswith('Sec-WebSocket-Key:'):
key = h[19:]
else:
continue
import hashlib
import base64
s = hashlib.sha1()
s.update(key+cc)()
h = s.digest()
return base64.b64encode(h)
def sender(data, conn):
first_byte = chr(0x00)
payload = data.encode('utf-8')
pl = first_byte + payload + chr(0xFF)
conn.send(pl)
while True:
c,a = s.accept()
msg = c.recv(4096)
if(msg):
print msg
print 'sending handshake ...'
handshakes += 'Sec-WebSocket-Accept: '+str(handshake(msg))+'\r\n\r\n'
print handshakes
c.send(handshakes)
sender("Hello", c)
break;
和html,index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Web Socket Example</title>
<meta charset="UTF-8">
<script>
window.onload = function() {
var s = new WebSocket("ws://localhost:9876/");
s.onopen = function(e) { alert("opened"); }
s.onclose = function(e) { alert("closed"); }
s.onmessage = function(e) { alert("got: " + e.data); }
};
</script>
</head>
<body>
<div id="holder" style="width:600px; height:300px"></div>
</body>
</html>
我正在运行这样的代码..
./server.py & python -m SimpleHTTPServer 8888
运行服务器后,当我使用浏览器点击localhost:8888时,它会在“关闭”(连接已关闭)警报“关闭”(连接已关闭)并在控制台上显示上述错误时发出警告“打开”(意味着握手已完成)。
不太清楚如何调试此问题。
我正在使用浏览器Chrome(版本:41),Python 2.7,Websocket 13。
答案 0 :(得分:0)
当我像这样更改发件人功能时,它会起作用。
...
def sender(data, conn):
length = len(data)
if length <= 125:
ret = bytearray([129, length])
for byte in text.encode("utf-8"):
ret.append(byte)
conn.send(ret)
...