收藏
回答

做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

回答关注问题邀请回答
收藏
登录 后发表内容