Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 关闭HTTP代理服务器_Python 3.x_Sockets - Fatal编程技术网

Python 3.x 关闭HTTP代理服务器

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(

我的代码有点问题,我正在做一个HTTP代理服务器,我向它发送一个随机数目的HTTP请求,我希望在停止发送时关闭我的程序。 我认为问题出在接受上,因为这个程序一直在工作

我试着在accept之后放一个recv来检查是否有空,但是程序没有到达那里

我的代码如下

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秒内没有发送任何请求,则该客户机将被视为死机。或者,它可能是客户端发出的一条特殊消息,用于向结束发出信号——在这种情况下,代码需要显式地查找此消息