Python代理HTTP非常慢

Python代理HTTP非常慢,python,http,proxy,Python,Http,Proxy,我正在尝试使用Python创建HTTP代理 尽管如此,当我使用此代理配置浏览器并尝试连接到http网站时,加载速度非常慢 这是我的代理代码: #!/usr/bin/env python import socket import thread import sys def get_line(field, data) : lines = data.split("\n") for line in lines : if line.split(":")[0] == fi

我正在尝试使用Python创建HTTP代理

尽管如此,当我使用此代理配置浏览器并尝试连接到http网站时,加载速度非常慢

这是我的代理代码:

#!/usr/bin/env python

import socket
import thread
import sys

def get_line(field, data) :
    lines = data.split("\n")
    for line in lines :
        if line.split(":")[0] == field :
            return line
    return ""

def get_host(data) :
    host_line = get_line("Host", data);
    port = 80
    if len(host_line.split(" ")) > 1 :
        host = host_line.split(" ")[1]
        arr = host.split(":")
        if len(arr) > 1 :
            host = arr[0]
            port = arr[1]
        else :
            host = host[:-1]
    else :
        host = ""
        port = 0
    return (host, port)

def http_proxy(conn, data, client_addr) :
    (host, port) = get_host(data)
    if host != "" :
        try :
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((socket.gethostbyname(host), int(port)))
            s.send(data)
            while 1 : 
                reply = s.recv(8192)
                test = reply
                if (len(reply) > 0) :
                    conn.send(reply)
                    print "Send %d bytes from %s" % (len(reply), host)
                else :
                    conn.close()
                    s.close()
                    break
        except socket.error, (value, message) :
            s.close()
            conn.close()
            print value, message
            sys.exit(1)

def main():
    try :
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('', 8080))
        s.listen(100)
    except socket.error, (value, message) :
        if s : 
            s.close()
        print "Socket error : ", message
    while 1 :
        conn, client_addr = s.accept()
        data = conn.recv(8192)
        thread.start_new_thread(http_proxy, (conn, data, client_addr))
    s.close()

if __name__ == "__main__" :
    main()
我认为这些延迟是由于一些HTTP请求没有被我的代理考虑在内,所以浏览器在发送回它们之前会等待一段时间


如果这就是问题所在,我不明白为什么会发生这种情况。

首先要尝试的事情是:去掉socket.gethostbyname(主机)调用。此外,您的接收/发送呼叫使用不可靠;您的代码没有考虑recv()可能不会返回所请求的所有8192字节,同样,send也可能不会发送所请求的所有字节。阅读他们的API。(它们返回实际接收/发送的字节数)。谢谢您的回答。我已尝试将这一行:s.connect((socket.gethostbyname(host),int(port))替换为:s.connect((host,int(port)),但仍然存在问题。我已经阅读了recv的文档:在我看来,recv并没有返回接收到的字符数。我还尝试将这一行:if(len(reply)>0):替换为:if reply:(类似示例),但问题仍然存在。不幸的是,那里的示例过于简单化,它们忽略了套接字I/o的许多低级方面。您可能应该仔细阅读实际的套接字函数以及它们如何在低级别上工作。此外,HTTP是一个复杂的协议,因此创建一个工作的代理服务器涉及许多复杂的问题