python3编写http代理服务器_python实战--Http代理服务器

python3编写http代理服务器_python实战--Http代理服务器源代码如下:
import socket
import thread
import urlparse
import select
BUFLEN=8192
class Proxy(object):
def __init__(self,conn,addr):
self.source=conn
self.headers={}
self.destnation=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.run()
def get_headers(self):
header=''
while True:
header+=v(BUFLEN)
index=header.find('\n')
if index >0:
break
#quest=header.split('\r\n',1)
firstLine=header[:index]pce
self.headers['method'],self.headers['path'],self.headers['protocol']=firstLine.split()
def conn_destnation(self):
url=urlparse.urlparse(self.headers['path'])
hostname=url[1]
port="80"
if hostname.find(':') >0:
addr,port=hostname.split(':')
else:
addr=hostname
系统检测
port=int(port)
hostbyname(addr)
print ip,port
t((ip,port))
data="%s %s %s\r\n" %(self.headers['method'],self.headers['path'],self.headers['protocol']) self.destnation.send(quest)
print quest
def renderto(self):
readsocket=[self.destnation]
while True:
data=''
(rlist,wlist,elist)=select.select(readsocket,[],[],3)
if rlist:
data=rlist[0].recv(BUFLEN)
if len(data)>0:
self.source.send(data)
else:
break
def run(self):
<_headers()
<_destnation()
class Server(object):
def __init__(self,host,port,handler=Proxy):
self.host=host
self.port=port
self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind((host,port))
self.server.listen(5)
self.handler=handler
欧泽高
def start(self):
while True:
try:
conn,addr=self.server.accept()
thread.start_new_thread(self.handler,(conn,addr))
except:
pass
if __name__=='__main__':
tamall
s=Server('127.0.0.1',8080)
s.start()
其实Http代理服务器本⾝不难,但写出来还是挺费事的,这⾥就不细说源代码了,很简单。主要说说,我遇到的问题。
⼀: 我本来只知道,thread.start_new_thread的第⼀个参数是函数对象,但当我看到上⾯的博⽂时,⼼⾥⼀愣,这样也可以,于是我迅速的测试了⼀下:
import thread
class Hello:
def __init__(self,content):
print content
def cs():
thread.start_new_thread(Hello, ("Hello World",))
if __name__=='__main__':
cs()
我很失望的发现,报了个异常
Unhandled exception in thread started by
Error pthook:
Original exception was:
⼀看,我说嘛,第⼀个参数怎么可以是对象,我呵呵⼀笑,稍微鄙视了⼀下作者。于是,我洗洗睡了,
第⼆天,我还是不死⼼,于是把代码下下来,本地实验了⼀下,可以的,⽴马意识到是我2了,于是⽴马百度。
原来thread模块中,主线程如果⽐⼦线程先结束,就会抛出这个异常,所以我们必须让⼦线程先结束,最简单的⽅法就是让主线程sleep⾜够长的时间,⾄于多长时间,貌似不知道,那到底怎么解决呢?
⽐较好的解决办法就是,主线程给每个⼦线程都加⼀把锁,⼦线程在结束前将锁释放掉,主线程⼀直循环检查锁的状态。代码如下:
import thread
class Hello:
def __init__(self,content,lock):
print content
"""
do something
....
At the end,release the lock
"""
def cs():
lock=thread.allocate_lock()
lock.acquire()
thread.start_new_thread(Hello, ("Hello World",lock))
while True:
if not lock.locked():
break
print "lock release"张骏祥
if __name__=='__main__':
cs()
结果如下:
Hello World
lock release
常艳现状⼆.第⼆个错误就是⽐较2的了
self.source.send[data]
TypeError: 'builtin_function_or_method' object is unsubscriptable 主要是单词unsubscriptable不认识,呵呵,单词不认识,伤不起啊。
主要意思就是说,内置函数或⽅法⽆法拥有下标,你懂的,错的很2很2。

本文发布于:2024-09-23 16:25:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/181817.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议