以下是在端口上侦听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, ))
答案 0 :(得分:0)
客户端可以在一个连接中执行多个命令(例如:GET)。您不能等待客户端发送所有命令,因为根据您返回的内容,它可以请求更多(例如:网页图像)。您必须解析请求的部分(命令),找到边界,将该请求转发给服务器并将答案写回客户端。所有这一切都不会阻碍阅读客户端。
我不确定在 python 中执行此操作的最佳方式是什么,但如果您花费5分钟的Google搜索,您将找到一个完美的HTTP代理库。