def send(self,data_obj): ''' 发送数据,用于长连接模块 发送后不关闭 ''' if self.sock == 0: return False dealdata = deal_packet() data = dealdata.pack(data_obj) try: self.sock.send(data) except Exception as e: if e !="": return "sockerr"
def receive(self): # if self.sock == 0: # return False dealdata = deal_packet() #记录临时长度 temp_len = 0 while True: try: recv_data = self.sock.recv(BUFSIZ) except Exception as e: print e return False if recv_data !="" or recv_data != None or recv_data != False: #ident标识符,length数据流长度,str_result第一次接受的全部数据流,temp_str粘包的数据流 ident,length,str_result,temp_str = dealdata.unpack(recv_data,self.temp_data) if ident == IDENT_MARK: #如果标识长度和数据长度相等,说明接受完整,可以输出 if length == len(str_result): return str_result #如果小于标识长度,说明包不完整 elif length >len(str_result): temp_len += length-len(str_result) self.all_data += str_result continue else: self.temp_data += temp_str self.all_data = str_result return str_result else: #如果标识不相等,说明还有没接收完的包 str_result = dealdata.extend_unpack(recv_data,self.temp_data) #如果接受字节还小于temp_len,说明还有没接收完的包 if (temp_len-len(str_result))>0: temp_len = temp_len-len(str_result) self.all_data +=str_result continue else: #如果temp_len小于或者等于接受的字节,就可以return temp_len = 0 self.all_data +=str_result temp_all_data = self.all_data self.all_data ="" return temp_all_data
def net_recv(self,recv_socket): dealdata = deal_packet() #记录临时长度 temp_len = 0 while True: try: recv_data = recv_socket.recv(BUFSIZ) except Exception as e: print e return False while recv_data !="" or recv_data != None or recv_data != False: #ident标识符,length数据流长度,str_result第一次接受的全部数据流,temp_str粘包的数据流 try: ident,length,str_result,temp_str = dealdata.unpack(recv_data,self.recv_data_temp) self.recv_data_temp ="" except: self.recv_data_temp = recv_data recv_data ="" break if ident == IDENT_MARK: #如果标识长度和数据长度相等,说明接受完整,可以输出 if length == len(str_result) and temp_str =="": self.call(recv_socket,str_result) recv_data = "" break elif length == len(str_result) and temp_str !="": self.call(recv_socket,str_result) recv_data = temp_str continue #标识长度大于结果长度,说明断包 elif length >len(str_result): self.recv_data_temp = recv_data recv_data ="" break else: pass recv_socket.close() return 0
def _call(recv_socket,data): print "_call" dealdata = deal_packet() recv_socket.send(dealdata.pack(data)) print data