我正在开发一个稍大的项目,需要在Python中制作一个本地主机代理。我所写的方式是在本地主机上以8080端口创建了一个基于socket和SOCK_STREAM的TCP服务器。它接受来自本地主机的请求,在通过切片、string.find()和gethostbyname()查找到目标IP地址后,打开另一个TCP套接字,发送请求并收到回复。然后,它将回复传递回本地主机代理,再由代理将其传递回浏览器。这是带有充足调试消息和调试文件的代码,可以收集浏览器请求和收到的回复(请注意,这只是一个原型,因此使用限定循环而不是while 1循环)。
现在我的问题是,似乎前几个请求都没问题,它会获取HTML和一些图像,但在某一点上它总是停在“数据接收”这一点上并退出,因为它没有收到数据,即缓冲区为空。浏览器仍然显示页面元素正在加载,但当它停止并查看文本日志文件时,我发现缓冲区为空,这意味着浏览器没有向代理提交任何内容? 我猜测问题可能出在浏览器提交请求的方式以及我的脚本对此行为反应不当上。
我知道我可以使用Twist框架,但我想学习自己编写这种东西。我一直在阅读有关SocketServer的资料,我可能会使用它,但是我不知道它是否能解决问题,因为实际上我真的不明白问题的原因。我的脚本对浏览器来说太慢了吗?服务器会发送多个答案而我的接收套接字应该监听更多的数据包吗?我的缓冲区大小(4096)太小了吗?
我真的很感谢您能指点一下方向。
谢谢!
import socket
local = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
f = open('test.txt', 'a')
local.bind(('localhost', 8080))
local.listen(5)
for i in xrange(20):
print '=====%d=====\n' % i
out = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
data, addr = local.accept()
print 'Connection accepted'
buffer = data.recv(4096)
print 'data recieved'
f.write('=============================================================\n')
f.write(buffer)
end = buffer.find('\n')
print buffer
#print buffer[:end]
host = buffer[:end].split()[1]
end = host[7:].find('/')
print host[7:(end+7)]
host_ip = socket.gethostbyname(host[7:(end+7)])
#print 'remote host: ' + host + ' IP: ' + host_ip
print 'sending buffer to remote host'
out.connect((host_ip, 80))
out.sendall(buffer)
print 'recieving data from remote host'
reply = out.recv(4096)
out.close()
print 'data recieved from remote host'
f.write('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n')
f.write(reply)
f.write('\n\n\n')
print 'sending data back to local host'
data.sendall(reply)
print 'data sent'
local.close()
out.close()
f.close()
现在我的问题是,似乎前几个请求都没问题,它会获取HTML和一些图像,但在某一点上它总是停在“数据接收”这一点上并退出,因为它没有收到数据,即缓冲区为空。浏览器仍然显示页面元素正在加载,但当它停止并查看文本日志文件时,我发现缓冲区为空,这意味着浏览器没有向代理提交任何内容? 我猜测问题可能出在浏览器提交请求的方式以及我的脚本对此行为反应不当上。
我知道我可以使用Twist框架,但我想学习自己编写这种东西。我一直在阅读有关SocketServer的资料,我可能会使用它,但是我不知道它是否能解决问题,因为实际上我真的不明白问题的原因。我的脚本对浏览器来说太慢了吗?服务器会发送多个答案而我的接收套接字应该监听更多的数据包吗?我的缓冲区大小(4096)太小了吗?
我真的很感谢您能指点一下方向。
谢谢!