server端:

#-*- coding:utf8 -*-

import threading
import hashlib
import socket
import base64

class websocket_thread(threading.Thread):
    def __init__(self, connection):
        super(websocket_thread, self).__init__()
        self.connection = connection
    
    def run(self):
        print 'new websocket client joined!'
        reply = '我草拟妹,终于握手成功'
        length = len(reply)
        while True:
            data = self.connection.recv(1024)
            print parse_data(data)
            self.connection.send('%c%c%s' % (0x81, length, reply))
            
def parse_data(msg):
    v = ord(msg[1]) & 0x7f
    if v == 0x7e:
        p = 4
    elif v == 0x7f:
        p = 10
    else:
        p = 2
    mask = msg[p:p+4]
    data = msg[p+4:]
    
    return ''.join([chr(ord(v) ^ ord(mask[k%4])) for k, v in enumerate(data)])
    
def parse_headers(msg):
    headers = {}
    header, data = msg.split('\r\n\r\n', 1)
    for line in header.split('\r\n')[1:]:
        key, value = line.split(': ', 1)
        headers[key] = value
    headers['data'] = data
    return headers

def generate_token(msg):
    key = msg + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
    ser_key = hashlib.sha1(key).digest()
    return base64.b64encode(ser_key)
            
if __name__ == '__main__':
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('192.168.1.163', 8098))
    sock.listen(50)
    
    while True:
        connection, address = sock.accept()
        try:
            data = connection.recv(1024)
            headers = parse_headers(data)
            token = generate_token(headers['Sec-WebSocket-Key'])
            connection.send('\
HTTP/1.1 101 WebSocket Protocol Hybi-10\r\n\
Upgrade: WebSocket\r\n\
Connection: Upgrade\r\n\
Sec-WebSocket-Accept: %s\r\n\r\n' % token)
            thread = websocket_thread(connection)
            thread.start()
        except socket.timeout:
            print 'websocket connection timeout'


client端:

        this.ws = new WebSocket("ws://192.168.1.163:8097");
        console.log(this.ws.readyState)
        this.ws.onopen = function (event) {
            console.log(event.data);
        };
        this.ws.onmessage = function (event) {
            console.log("response text msg: " + event.data);
        };
        this.ws.onerror = function (event) {
           
            console.log("Send Text fired an error");
            
        };
        this.ws.onclose = function (event) {
            console.log("WebSocket instance closed.");
        };
        console.log(WebSocket.OPEN)
        // this.ws.send("Hello WebSocket, I'm a text message.")
        setTimeout(function () {
            if (self.ws.readyState === WebSocket.OPEN) {
                self.ws.send("Hello WebSocket, I'm a text message.");
                console.log(event);
            }
            else {
                console.log("WebSocket instance wasn't ready...");
                // self.ws.send("Hello WebSocket, I'm a text message.");
            }
        }, 3);