def readResponse(self): # 收命令,要做的事情, stream = QDataStream(self.socket) print('--------------------') print('服务器响应') stream.setVersion(QDataStream.Qt_5_7) while True: self.nextBlockSize = 0 if self.nextBlockSize == 0: if self.socket.bytesAvailable() < SIZEOF_UINT16: print('没有内容了') break self.nextBlockSize = stream.readUInt16() else: print('错误') # 客户端主动断开时,去掉字典中的对应,在这里做一部分操作。 # 客户端主动断开的时候,要将其从self.myParent.sockeIdToSocketDict self.myParent.fixIdToSocketIdDict 中删掉 break if self.socket.bytesAvailable() < self.nextBlockSize: print("错误2") if (not self.socket.waitForReadyRead(60000) or self.socket.bytesAvailable() < self.nextBlockSize): break state = stream.readQString() # 读命令 sendModel print('state==' + state) if state == 'SENDFILE': filename = stream.readQString() # 读文件名 fileSize = stream.readInt() # 读文件大小 with open('../TEST/' + filename, 'ab') as f: while self.nextBlockSize > 0: fileBytes = stream.readBytes() # 读文件部分字节 f.write(fileBytes) print(fileBytes.__len__()) self.nextBlockSize = stream.readUInt64() print('self.nextBlockSize:' + str(self.nextBlockSize)) state = stream.readQString() filename = stream.readQString() # 读文件名 fileSize = stream.readInt() # 读文件大小 print('filename:' + filename) print('fileSize:' + str(fileSize)) elif state == 'test': print(stream.readQString()) elif state == 'ORDER': # 收到一条命令 要执行的命令 order = stream.readQString() # 读是什么命令 if order: # shou dao doThing self.doSomeThing.emit(order)
def run(self): print('-----------------------') socket = QTcpSocket() count = 0 if not socket.setSocketDescriptor(self.socketId): # 可能是分配的东西,具体作用不知道 # self.emit(SIGNAL("error(int)"), socket.error()) self.error.connect(socket.error) return while socket.state() == QAbstractSocket.ConnectedState: nextBlockSize = 0 stream = QDataStream(socket) stream.setVersion(QDataStream.Qt_5_8) sockeIdToSocketDict[self.socketId] = socket # print(sockeIdToSocketDict) # 将所有连接上来的socket保存起来 # print(fixIdToSocketIdDict) aim_ip = socket.peerAddress().toString() # 获得连上来的IP地址 # print(aim_ip) if (socket.waitForReadyRead() and socket.bytesAvailable() >= SIZEOF_UINT64): print('wait') nextBlockSize = stream.readUInt64() else: print('错误') # 客户端主动断开时,去掉字典中的对应,在这里做一部分操作。 # 客户端主动断开的时候,要将其从self.myParent.sockeIdToSocketDict self.myParent.fixIdToSocketIdDict 中删掉 sockeIdToSocketDict.pop(self.socketId) # 客户端主动断开的时候删掉。 fixIdToSocketIdDict.pop(fixID) threadDict.pop(self.socketId) self.popDeviceSignal.emit(fixID) self.sendError(socket, "Cannot read client request") return if socket.bytesAvailable() < nextBlockSize: print("错误2") if (not socket.waitForReadyRead(60000) or socket.bytesAvailable() < nextBlockSize): self.sendError(socket, "Cannot read client data") return # 这段数据流上 第一个是state 根据state判断接下来的状态, # 发送成功的状态,发送来 success 日期 信号类型 识别结果 识别开始时间 识别时间 state = stream.readQString() # 读状态 print('#61 ' + state) if state == 'successResult': # 如果状态是success,说明下一个发来的是识别的结果 resultBytes = stream.readBytes() try: Thread.lock.lockForRead() finally: Thread.lock.unlock() resultObject = pickle.loads(resultBytes) # print(fixID) # print(resultObject.dateNow) # print(resultObject.kind) # print(resultObject.result) # print(resultObject.startTime) # print(resultObject.usedTime) if resultObject.kind == "HDMI" and self.hdmi_old_result != resultObject.result: # 自动采集的不需要时间,他需要 日期 时间识别结果 发走的信息只有 类型 识别结果 ip地址 全是strhandleSql.pushResultInfo('123425','HDMI','北京卫视','2018-12-23 12:23:21',12) self.pushResultInfoSignal.emit( fixID, resultObject.kind, resultObject.result, resultObject.startTime, int(resultObject.usedTime )) # 发射信号,携带了信号类型,识别结果,aim_ip(当做区分控件的id)结果从这里发出去 self.hdmi_old_result = resultObject.result elif resultObject.kind == 'AV' and self.av_old_result != resultObject.result: self.pushResultInfoSignal.emit( fixID, resultObject.kind, resultObject.result, resultObject.startTime, int(resultObject.usedTime) ) # 发射信号,携带了信号类型,识别结果,aim_ip(当做区分空间的id) getMessgetMessageAllTcpageAllTcp self.av_old_result = resultObject.result elif state == 'sendImage': # 如果状态是wait_to_recognize,说明下一端是图片的16位整数# 图片的暂时不考虑,因为还不知道发给谁 kind = stream.readQString() # 读台标信号类型 try: Thread.lock.lockForRead() finally: Thread.lock.unlock() file = stream.readBytes() with open('image.jpg', 'wb') as f: f.write(file) elif state == 'deviceInfo': # 收到deviceInfo对象 deviceInfoByte = stream.readBytes() try: Thread.lock.lockForRead() finally: Thread.lock.unlock() # pictureSizeByte = stream.readBytes() deviceInfo = pickle.loads(deviceInfoByte) # pictureSize = pickle.loads(pictureSizeByte) fixID = deviceInfo['deviceFixId'] fixIdToSocketIdDict[fixID] = self.socketId print(deviceInfo['pictureSize']) self.pushDeviceInfoSignal.emit(deviceInfo['deviceFixId'], deviceInfo['regionProvince'], deviceInfo['regionCity'], deviceInfo['regionArea']) print("___________________________") print(deviceInfo['fileInfo']) self.pushPictureSizeSignal.emit(str(deviceInfo['pictureSize']), deviceInfo['deviceFixId'], deviceInfo['kind']) self.pushFileInfoSignal.emit(str(deviceInfo['fileInfo']), deviceInfo['deviceFixId']) elif state == 'sendFile': # 准备接受 文件 fileName = stream.readQString() # 读取文件名称 fileSize = stream.readQString() # 读取文件大小 fileBytes = stream.readBytes() # 读取文件部分字节 try: Thread.lock.lockForRead() finally: Thread.lock.unlock() # print(fileSize) with open('../TEST/' + fileName, 'ab') as f: f.write(fileBytes) count = count + fileBytes.__len__()