websocket handshake problem

后端 未结 2 2140
孤城傲影
孤城傲影 2021-02-06 08:32

I\'m using python to implement a simple websocket server. The handshake I\'m using comes from http://en.wikipedia.org/w/index.php?title=WebSockets&oldid=372387414.

T

相关标签:
2条回答
  • 2021-02-06 08:38

    I tested your code on Firefox 4 and got the same error upon hitting send, however before that I got

    Firefox can't establish a connection to the server at ws://localhost:8888/.

    which is probably why the WebSocket object was destroyed. I suspect your handshake response is missing something, so Firefox is closing the socket.

    From the Wikipedia article on Websockets:

    The Sec-WebSocket-Key1 and Sec-WebSocket-Key2 fields and the eight bytes after the fields are random tokens which the server uses to construct a 16 byte token at the end of its handshake to prove that it has read the client's handshake.

    Your server's response does not have this special number at the bottom, So I think we need to figure out how to generate it, and include it.

    EDIT: How to generate that number

    Lets start with key1, key2, and the 8 bytes at the end of the handshake

    key1 = "18x 6]8vM;54 *(5:  {   U1]8  z [  8"
    key2 = "1_ tx7X d  <  nw  334J702) 7]o}` 0"
    end8 = "Tm[K T2u"
    

    We make a number for each key by ignoring every character that is not a digit 0-9. In Python:

    def numFromKey(key):
        return int(filter(lambda c: c in map(str,range(10)),key))
    

    next we divide that number by the number of spaces in the original key string, so here is a is a function that counts the spaces in a string.

    def spacesIn(key):
        return len(filter(lambda c: c==' ',key))
    

    The two numbers resulting from the keys are:

    pkey1 = numFromKey(key1)/spacesIn(key1)
    pkey2 = numFromKey(key2)/spacesIn(key2)
    

    Now we need to concatenate the bytes of pkey1, pkey2, and end8. The processed keys need to be represented as 32 bit Big-Endian numbers.

    from struct import pack
    catstring = pack('>L',pkey1) + pack('>L',pkey2) + end8
    

    Then we take the md5 hash of those bytes to get the magic number that we tack on the end of the handshake

    import md5
    magic = md5.new(catstring).digest()
    

    Thats how I think it works at least

    0 讨论(0)
  • 2021-02-06 08:43

    As of Version 8, this protocol is deprecated please refer to:

    http://tools.ietf.org/id/draft-ietf-hybi-thewebsocketprotocol-12.txt

    for the new version of the protocol.

    0 讨论(0)
提交回复
热议问题