做http转发出现net::ERR_CONNECTION_RESET?
自己用tcp写了个http转发,出现了个奇怪的问题: 采用超时轮询方法:轮询小程序请求(即客户端请求)和服务器应答,能够正常转发双方通信,服务器应答后断开,转发口也断开请求端连接,一切工作正常。 逻辑:读取客户端数据,有数据就发给服务器,超时没数据,读取服务端数据,有数据就发给客户端,超时没数据, 循环此逻辑有异常(连接断开也算异常)就退出,超时设置0.01秒。 但如果用双线程方法:各自一直读取双方数据,收到数据就转发,前面工作正常,小程序的http图片也能显示,但在服务器应答后断开,转发口也断开请求端连接,这时候小程序图片就没了,报错Failed to load image <URL> net::ERR_CONNECTION_RESET ,请问这个怎么处理?应该不是网上说的网络问题,本机调试,模拟器和真机都这现象。 逻辑:线程1一直接收客户端数据,收到就转发,异常退出;线程2一直接收服务器数据,收到就转发,异常退出; 轮询的代码: while(True): #互相转发 try: transit_socket.settimeout(0.01) request_data = transit_socket.recv(22048) if(request_data==None): print('receive data none') break if(len(request_data)>0): #print('receive server',len(request_data)) client_socket.settimeout(None) client_socket.send(request_data) else: #print('receive server',0) break except Exception as ex: if('timed out' in str(ex)): pass else: #print('receive server error',ex) break try: client_socket.settimeout(0.01) request_data = client_socket.recv(22048) if(request_data==None): print('receive data none') break if(len(request_data)>0): #print('receive app',len(request_data)) transit_socket.settimeout(None) transit_socket.send(request_data) else: #print('receive app',0) break except Exception as ex: if('timed out' in str(ex)): pass else: #print('receive app error',ex) break 双线程方法:(不轮询等待超时,认为可以提升转发速度,在文件下载的时候有用) handle_transit_process = threading.Thread(target=server_process_transit_2, args=(client_socket,transit_socket)) handle_transit_process.start() while(True): try: #client_socket.settimeout(0.2) request_data = client_socket.recv(2048) if(request_data==None): #print('receive data none') break if(len(request_data)>0): #print('receive app',len(request_data)) #transit_socket.settimeout(None) transit_socket.send(request_data) else: #print('receive app',0) break except Exception as ex: if('timed out' in str(ex)): pass else: #print('receive app error',ex) break try: client_socket.close() except: pass try: transit_socket.close() except: pass def server_process_transit_2(client_socket,transit_socket): #print('server_process_transit_2') while(True): try: #transit_socket.settimeout(0.2) request_data = transit_socket.recv(2048) if(request_data==None): #print('receive data none') break if(len(request_data)>0): #print('receive server',request_data) #client_socket.settimeout(None) client_socket.send(request_data) else: #print('receive server',0) break except Exception as ex: #print('receive server error1',ex) if('timed out' in str(ex)): pass else: #print('receive server error2',ex) break try: client_socket.close() except: pass try: transit_socket.close() except: pass