def send(self, m_client, data): key = m_client.property("key") # self.__logger.info("send message to client [{0}]".format(key)) block = QtCore.QByteArray() stream = QtCore.QDataStream(block, QtCore.QIODevice.WriteOnly) stream.setVersion(QtCore.QDataStream.Qt_4_7) stream.writeUInt64(0) stream << QtCore.QByteArray(data) stream.device().seek(0) stream.writeUInt64(block.size() - ctypes.sizeof(ctypes.c_long)) stream.device().seek(block.size()) stream.writeUInt64(0) s = 0 while s < block.size(): if m_client.state() != QtNetwork.QAbstractSocket.ConnectedState: m_client.warning( "is not connected to server [{0}]".format(key)) break w = m_client.write(block) s += w
def __received(self, m_client): key = m_client.property("key") # self.__logger.info("receive message from client [{0}]".format(key)) stream = QtCore.QDataStream(m_client) stream.setVersion(QtCore.QDataStream.Qt_4_7) if key in self.__client_data: while True: if not self.__client_data[key][1]: if m_client.bytesAvailable() < ctypes.sizeof( ctypes.c_long): break self.__client_data[key][1] = stream.readUInt64() if m_client.bytesAvailable() < self.__client_data[key][1]: break if self.__client_data[key][2] is None: self.__client_data[key][2] = QtCore.QByteArray() self.__client_data[key][3] = QtCore.QDataStream( self.__client_data[key][2], QtCore.QIODevice.ReadWrite) self.__client_data[key][3].setVersion( QtCore.QDataStream.Qt_4_7) self.__client_data[key][3].writeUInt64( self.__client_data[key][1]) data = QtCore.QByteArray() stream >> data if self.__client_data[key][1]: self.__client_data[key][3] << data if self.__client_data[key][2].size() - ctypes.sizeof( ctypes.c_long) == self.__client_data[key][1]: self.__client_data[key][3].device().seek(0) size = self.__client_data[key][3].readUInt64() message = QtCore.QByteArray() self.__client_data[key][3] >> message self.__client_data[key][2] = None self.__client_data[key][3] = None self.__client_data[key][1] = 0 # system = 0 if message[:7] == "system:": # system = 1 if message[:11] == "system:key:" and message.size( ) == 47: try: replace_key = uuid.UUID(str(message[11:])) except: replace_key = key if key != replace_key: # self.__logger.info("update client key from " + repr(key) + " to " + repr(replace_key)) self.__client_data[ replace_key] = self.__client_data[key] del self.__client_data[key] key = replace_key elif message == "system:stop": self.stop() # if system: # self.__logger.info("received system message from client with size " + repr(size) + " [{0}]".format(key)) else: # self.__logger.info("received message from client with size " + repr(size) + " [{0}]".format(key)) self.received.emit(m_client, message)
def __received(self): # self.__logger.info("receive message from server [{0}]".format(self.__key)) if self.__client: stream = QtCore.QDataStream(self.__client) stream.setVersion(QtCore.QDataStream.Qt_4_7) while True: if not self.__client: break if not self.__blocksize: if self.__client.bytesAvailable() < ctypes.sizeof( ctypes.c_long): break self.__blocksize = stream.readUInt64() if self.__client.bytesAvailable() < self.__blocksize: break if self.__blocksize and self.__blockdata is None: self.__blockdata = QtCore.QByteArray() self.__blockstream = QtCore.QDataStream( self.__blockdata, QtCore.QIODevice.ReadWrite) self.__blockstream.setVersion(QtCore.QDataStream.Qt_4_7) self.__blockstream.writeUInt64(self.__blocksize) data = QtCore.QByteArray() stream >> data if self.__blocksize: self.__blockstream << data if self.__blockdata.size() - ctypes.sizeof( ctypes.c_long) == self.__blocksize: self.__blockstream.device().seek(0) size = self.__blockstream.readUInt64() message = QtCore.QByteArray() self.__blockstream >> message self.__blockdata = None self.__blocksize = 0 self.__blockstream = 0 # system = 0 if message[:7] == "system:": # system = 1 if message[:11] == "system:key:" and message.size( ) == 47: self.__key = None try: self.__key = uuid.UUID(str(message[11:])) except: self.stop() elif self.__key is None: self.stop() elif message == "system:stop": self.stop() # if system: # self.__logger.info("received system message from server with size " + repr(size) + " [{0}]".format(self.__key)) else: # self.__logger.info("received message from server with size " + repr(size) + " [{0}]".format(self.__key)) self.received.emit(message)