4

recently I use python write websocket server, handshake is OK, and the server can accept message from client, but so wired, when the server send message to client, the server will encounter an error like broken pipe, I check the code thoroughly and can't find the way, so anyone can help me? here is my server code. Thanks in advance!

def SendData(pData, client, add): 

    if(pData == False):  
        return False  
    else:  
        #pData = str(pData)
        pData = pData.encode("utf-8")  
    token = "\x81"  
    length = len(pData)  
    if length < 126:  
        token += struct.pack("B", length)  
    elif length <= 0xFFFF:  
        token += struct.pack("!BH", 126, length)  
    else:  
        token += struct.pack("!BQ", 127, length)  
    pData = '%s%s' % (token, pData)
    if client is not None: 
        #client.sendto(pData, add)
        client.send(pData) 
        time.sleep(0.5) 
    return True


def RecvData(nNum, client):

    try:  
        pData = client.recv(nNum)  
        if not len(pData):  
            return False  
    except:  
        return False  
    else:  
        code_length = ord(pData[1]) & 127  
        if code_length == 126:  
            masks = pData[4:8]  
            data = pData[8:]  
        elif code_length == 127:  
            masks = pData[10:14]  
            data = pData[14:]  
        else:  
            masks = pData[2:6]  
            data = pData[6:]
        raw_str = ""  
        i = 0  
        for d in data:  
            raw_str += chr(ord(d) ^ ord(masks[i%4]))  
            i += 1  
    return raw_str


class WebSocket(threading.Thread):

    def __init__(self, conn, remote, path="/"):
        threading.Thread.__init__(self)
        self.conn = conn
        self.remote = remote
        self.path = path
        self.buffer = ""

    def generate_key(self, raw_key):
        return base64.b64encode(hashlib.sha1(raw_key.replace(" ", "")+\
        '258EAFA5-E914-47DA-95CA-C5AB0DC85B11').digest())    

    def run(self):
        print 'Socket Start!'
        headers = {}
        self.handshaken = False
        while True:
            if self.handshaken == False:
                print 'Socket Start Handshaken with %s!' % str(self.remote)
                self.buffer += self.conn.recv(1024)
                if self.buffer.find('\r\n\r\n') != -1:
                    header, data = self.buffer.split('\r\n\r\n', 1)
                    for line in header.split("\r\n")[1:]:
                        key, value = line.split(":", 1)
                        headers[key] = value
                    headers["Location"] = 'ws://%s%s' %\
                    (headers["Host"].replace(" ", ""), self.path)
                    key = self.generate_key(headers["Sec-WebSocket-Key"])
                    print key
                    handshake = 'HTTP/1.1 101 Switching Protocols\r\n\
Upgrade: websocket\r\n\
Connection: Upgrade\r\n\
Sec-WebSocket-Accept: %s\r\n\
Sec-WebSocket-Origin: null\r\n\
Sec-WebSocket-Location: %s\r\n\r\n\
                    ' %(key, headers["Location"])
                    print handshake
                    self.conn.send(handshake)
                    self.handshaken = True
                    print 'Socket Handshaken with %s success!' % \
                    str(self.remote)
            else:
                    receive = RecvData(64, self.conn)
                    print type(receive)
                    print receive
                    time.sleep(0.5)
                    #self.conn.send('hello')
                    SendData('This is from server!', self.conn, self.remote)
                    receive = ""


class WebSocketServer(object):

    def __init__(self):
        self.socket = None

    def begin(self):
        print "WebSocketServer Ready!"
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind(("192.168.71.128", 9876))
        self.socket.listen(50)
        while True:
            conn, add = self.socket.accept()
            newSocket = WebSocket(conn, add)
            newSocket.run()

if __name__ == "__main__":
        server = WebSocketServer()
        server.begin()

0 Answers0