2012-03-23 144 views
0

以下是在一个端口上侦听HTTP请求并将请求包发送到端口80上运行的服务器的代码,获取响应并发送数据返回给客户端。现在,一切都正在执行罚款,但下面的代码行:sock.recv()在python代码中执行时间太长

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,)) 

回答

0

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

我不确定在python中做什么最好的方法是什么,但是如果你花费5分钟的谷歌搜索,你会发现一个完美的HTTP代理库。

+0

其实这是我的项目,所以我不能使用任何库。我将不得不使用套接字来做到这一点。另外,当我从客户端收到请求时,我一次只收到一个HTTP GET请求。 – vedarthk 2012-03-23 15:26:37

+0

发送完整消息后,您的客户端必须在套接字上执行write shutdown操作,否则您的recv将继续阻塞...还请注意,我没有说您应该使用库,您可以检查*来源* – 2012-03-23 15:47:15

+0

行。很抱歉对于这个误会。 – vedarthk 2012-03-23 16:40:25