The Websocket server cannot send a message to the client, and the error is interrupted

Recently, I use python write websocket server, the handshake is OK, and the server can receive a message from the client, but while doing this, when the server sends a message to the client, the server will encounter an error like a broken channel, I check the code carefully and cannot find a way so someone 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() 
+4
source share

Source: https://habr.com/ru/post/1494883/


All Articles