自己用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
