sock.recv()花费了太多时间在python代码中执行

时间:2012-03-23 15:12:38

标签: python sockets httpservice

以下是在端口上侦听HTTP请求并将请求数据包发送到在端口80上运行的服务器的代码,获取响应并将数据发送回客户端。现在,一切正常,但以下代码行:

data = req_soc.recv(1024)

花费了太多时间来执行,我观察到,它需要很长时间才能执行/收到最后一个数据包。我也使用select.select()尝试了相同的代码,但结果是一样的。由于我想处理来自客户端和实际HTTP服务器的数据(原始),我别无选择,只能使用套接字。

import socket
import thread

def handle_client(client):
    data = client.recv(512)
    request = ''
    request += data
    print data

print '-'*20
spl = data.split("\r\n")

print spl[0]
print spl[1]

if len(request):
    req_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    req_soc.connect(('localhost', 80))
    req_soc.send(request)

    response = ''
    data = req_soc.recv(1024)
    while data:
        response += data
        print 1
        data = req_soc.recv(1024)
    req_soc.close()
    print response
    if len(response):
        client.send(response)
client.close()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 4422))
server.listen(5)

print("Server is running...\n")

MSGLEN = 1024

while 1:

    client, address = server.accept()
    thread.start_new_thread(handle_client, (client, ))

1 个答案:

答案 0 :(得分:0)

客户端可以在一个连接中执行多个命令(例如:GET)。您不能等待客户端发送所有命令,因为根据您返回的内容,它可以请求更多(例如:网页图像)。您必须解析请求的部分(命令),找到边界,将该请求转发给服务器并将答案写回客户端。所有这一切都不会阻碍阅读客户端。

我不确定在 python 中执行此操作的最佳方式是什么,但如果您花费5分钟的Google搜索,您将找到一个完美的HTTP代理库。

相关问题