Websocket连接因错误“收到意外的延续帧”而关闭。

时间:2015-03-11 07:01:09

标签: python websocket

我只是想尝试使用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。

1 个答案:

答案 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)

...