本人参照网上各种工程,凑了如下的代理服务器代码,但仍出现异常。请各位大神帮忙优化,另外能添加对https的支持,谢谢!
# -*- coding:utf-8 -*-
import socket,threading,re,select
import urllib.request
import urllib.response
import urllib.error
BUFFER=4096
def New_Link(sock,addr,index):
while True:
data = sock.recv(BUFFER).decode('utf-8');
mutex = threading.Lock();
mutex.acquire();
if(data):
try:
index = data.find('\n');
if index == 0:
continue
firstLine=data[:index]
request=data[index+1:]
headers={};
headers['method'],headers['url'],headers['protocol']=firstLine.split()
host = urllib.request.urlparse(headers['url'])[1];
port = '80';
if host.find(':') >0:
host,port = headers['url'].split(':');
port = int(port);
ip = socket.gethostbyname(host);
Request_data = '%s %s %s\r\n%s' % (headers['method'],headers['url'],headers['protocol'],request)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect((ip,port));
s.send(Request_data.encode('utf-8'));
while True:
data=''
(rlist,wlist,elist)=select.select([s],[],[],3)
if rlist:
data=rlist[0].recv(BUFFER)
if len(data)>0:
sock.send(data)
else:
continue;
s.close()
mutex.release();
except Exception as e:
print(e)
mutex.release();
s.close()
continue;
else:
mutex.release();
continue;
sock.close()
class Client(object):
def __init__(self):
self.Client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
self.Client_Socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.Client_Socket.bind(('127.0.0.1',8083));
def Start(self):
self.Client_Socket.listen(5);
print('Start to listen 8083');
index = 0;
while True:
s,addr = self.Client_Socket.accept();
index+=1;
t = threading.Thread(target=New_Link,args=(s,addr,index));
t.start();
c = Client();
c.Start();