Python 3.x 关闭HTTP代理服务器
我的代码有点问题,我正在做一个HTTP代理服务器,我向它发送一个随机数目的HTTP请求,我希望在停止发送时关闭我的程序。 我认为问题出在接受上,因为这个程序一直在工作 我试着在accept之后放一个recv来检查是否有空,但是程序没有到达那里 我的代码如下Python 3.x 关闭HTTP代理服务器,python-3.x,sockets,Python 3.x,Sockets,我的代码有点问题,我正在做一个HTTP代理服务器,我向它发送一个随机数目的HTTP请求,我希望在停止发送时关闭我的程序。 我认为问题出在接受上,因为这个程序一直在工作 我试着在accept之后放一个recv来检查是否有空,但是程序没有到达那里 我的代码如下 from socket import * from _thread import * MAX_DATA_RECV = 4096 # max number of bytes we receive at once def start(
from socket import *
from _thread import *
MAX_DATA_RECV = 4096 # max number of bytes we receive at once
def start(port_5, my_port):
s=socket(AF_INET, SOCK_STREAM)
s.bind(('', my_port))
s.listen(1)
while 1:
try:
conn, client_addr = s.accept()
except KeyboardInterrupt:
print('\nProgram closed. Interrupted by the user')
exit()
proxy_thread(conn, client_addr)
s.close()
def proxy_thread(conn, client_addr):
# get the request from browser
request = conn.recv(MAX_DATA_RECV).decode('utf-8')
# parse the first line
first_line = request.split('n')[0]
# get url
url = first_line.split(' ')[1]
# find the webserver and port
http_pos = url.find("://") # find pos of ://
if (http_pos==-1):
temp = url
else:
temp = url[(http_pos+3):] # get the rest of url
port_pos = temp.find(":") # find the port pos (if any)
# find end of web server
webserver_pos = temp.find("/")
if webserver_pos == -1:
webserver_pos = len(temp)
webserver = ""
port = -1
if (port_pos==-1 or webserver_pos < port_pos): # default port
port = 80
webserver = temp[:webserver_pos]
else: # specific port
port = int((temp[(port_pos+1):])[:webserver_pos-port_pos-1])
webserver = temp[:port_pos]
print("Connect to:", webserver, port)
# create a socket to connect to the web server
s = socket(AF_INET, SOCK_STREAM)
s.connect((webserver, port))
s.send(request.encode()) # send request to webserver
print(temp)
while 1:
# receive data from web server
data = s.recv(MAX_DATA_RECV)
if (len(data) > 0):
# send to browser
conn.send(data)
else:
break
s.close()
conn.close()
从套接字导入*
从线程导入*
MAX_DATA_RECV=4096#我们一次接收的最大字节数
def启动(端口5,我的端口):
s=套接字(AF_INET,SOCK_STREAM)
s、 绑定(“”,我的端口))
s、 听(1)
而1:
尝试:
conn,客户机地址=s.accept()
除键盘中断外:
打印('\n程序已关闭。被用户中断')
退出()
代理线程(连接,客户端地址)
s、 关闭()
def代理线程(连接,客户端地址):
#从浏览器获取请求
请求=conn.recv(最大数据recv)。解码('utf-8')
#解析第一行
第一行=request.split('n')[0]
#获取url
url=第一行拆分(“”)[1]
#查找Web服务器和端口
http#u pos=url.find(“:/”)#find pos of://
如果(http_pos==-1):
temp=url
其他:
temp=url[(http_pos+3):]#获取url的其余部分
端口位置=临时查找(“:”)#查找端口位置(如果有)
#查找web服务器的结尾
Web服务器位置=临时查找(“/”)
如果webserver_pos==-1:
webserver_pos=len(临时)
webserver=“”
端口=-1
如果(端口位置==-1或Web服务器位置<端口位置):#默认端口
端口=80
webserver=temp[:webserver\u pos]
其他:#特定端口
端口=int((临时[(端口位置+1):])[:Web服务器端口位置-1])
webserver=temp[:端口位置]
打印(“连接到:”,Web服务器,端口)
#创建套接字以连接到web服务器
s=套接字(AF_INET,SOCK_STREAM)
s、 连接((Web服务器,端口))
s、 发送(request.encode())#将请求发送到Web服务器
打印(临时)
而1:
#从web服务器接收数据
数据=s.recv(最大数据recv)
如果(len(数据)>0):
#发送到浏览器
连接发送(数据)
其他:
打破
s、 关闭()
康涅狄格州关闭
如果有人能帮助我,请提前感谢
我希望我的程序在我停止发送时关闭
在网络层面,没有隐含的指标表明另一方将不再发送。如果所有请求都是通过一个TCP连接完成的,那么连接的结束可能会被视为这样一个指示符。但是您正在为每个请求使用新的TCP连接,因此您需要定义自己的条件,即服务器应该如何确定客户端不再发送
例如,这可能是一个超时,即如果客户机在20秒内没有发送任何请求,则该客户机将被视为死机。或者,它可能是客户端发出的一条特殊消息,用于向结束发出信号——在这种情况下,代码需要显式地查找此消息