- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的:
http.py:
class HTTPServer():
def __init__(self, port):
self.port = port
self.thread = None
self.run = True
def serve(self):
self.thread = threading.Thread(target=self._serve)
self.thread.start()
def _serve(self):
serverAddress = ("", self.port)
self.server = MyBaseHTTPServer(serverAddress,MyRequestHandler)
logging.log(logging.INFO, "HTTP server started on port %s"%self.port)
while self.run:
self.server.handle_request()
def stop(self):
self.run = False
self.server.server_close()
然后在另一个文件中,重新启动它:
def restartHTTP(self):
try:
self.httpserver.stop()
reload(http)
self.httpserver = http.HTTPServer(80)
self.httpserver.serve()
except:
traceback.print_exc()
这给了我一个地址已经在使用的错误,所以看起来 HTTP 服务器没有正常停止。我还需要做些什么来阻止它?
编辑:
我调用 restartHTTP 的地方:
def commandHTTPReload(self, parts, byuser, overriderank):
self.client.factory.restartHTTP()
self.client.sendServerMessage("HTTP server reloaded.")
我知道命令正在执行,因为我收到了它应该发送的消息。
最佳答案
你只需要让操作系统知道你真的想在关闭后立即重用这个端口。通常它会保持关闭状态一段时间,以防出现任何额外的数据包。您可以使用 SO_REUSEADDR 执行此操作:
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
..打开mysocket之后。使用 HTTPServer 执行此操作的一个好地方可能是重写的 server_bind
方法:
def server_bind(self):
HTTPServer.server_bind(self)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
编辑:仔细查看了您的代码后,我发现您的线程模型也可能在这里引起问题。您正在关闭主 (?) 线程中的套接字,而另一个线程正在等待同一套接字上的连接(在 accept()
中)。这种安排没有明确定义的语义,我相信它在不同的操作系统上做不同的事情。在任何情况下,您都应该避免这种情况,以最大程度地减少混淆(在多线程程序中已经有很多混淆)。您的旧线程在获得连接并处理其请求之前不会真正消失(因为它不会重新检查 self.run
直到那时),因此端口可能不会重新-直到之后才可绑定(bind)。
没有真正简单的解决方案。您可以在线程之间添加一个通信管道,然后在服务器线程中使用 select()
/poll()
来等待其中任何一个的事件,或者您可以在短时间后使 accept()
调用超时,以便更频繁地检查 self.run
。或者你可以让主线程连接到监听套接字本身。但无论您做什么,您都可能接近复杂程度,您应该考虑使用“真正的”httpd 或网络框架而不是自己动手:apache、lighttpd、Tornado、Twisted 等。
关于python - 如何重新启动 BaseHTTPServer 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705680/
我有一个基于 BaseHTTPServer 的简单服务器的以下代码。 class myHandler(BaseHTTPRequestHandler): #Handler for the GET
我的代码很简单。使用 BaseHTTPServer 和 ThreadInMix 我想运行每个同时发出的请求的 python 脚本 (Script1.py)。 我的代码- 从子进程导入 PIPE,P
您好,我有这个代码用于我的变量发布,我希望它始终监听和接收发布请求,工作正常,但在接收到第一个变量后,脚本运行但不再获得发布变量。 只能正常运行一次,然后必须重新启动 python 脚本。 impor
我正在使用 BaseHttpServer 类的方法“do_GET”。 我想做的是连续调用这个方法可以访问同一个共享变量 如果我发送第一个命令 0 然后 1,我将无法访问同一个变量 from BaseH
我正在尝试为 javascript 编写一个简单的本地代理:因为我需要从网页中的 javascript 加载一些东西,所以我用 python 编写了这个简单的守护进程: import string,c
这是我的: http.py: class HTTPServer(): def __init__(self, port): self.port = port se
我正在尝试评估各种语言以构建小型高吞吐量应用程序服务器。它需要做一些小事情,比如获取请求、从运行缓存应用程序(memcached、redis)的单独服务器读取数据,以及发回 5 - 10 行 XML
为了允许帮助台重新启动 Oracle 实例,我们正在尝试实现一个小型 python Web 服务器,该服务器将启动启动 Oracle 实例的 shell 脚本。 代码已完成,它启动了实例,但有一个问题
我使用 BaseHTTPServer 编写了一个快速的网络服务器,它工作得很好,所以现在我正在尝试实现日志记录,我注意到,嘿,似乎 BaseHTTPServer 已经有一些日志信息输出到标准输出,是吗
我正在尝试使用 BaseHttpServer 和 ThreadingMixIn 创建一个多线程网络服务器(如各种示例所示)。伪代码类似于: class Handler(BaseHTTPRequestH
引用:http://docs.python.org/2/library/basehttpserver.html 我有以下代码片段,它使用 Python BaseHTTPServer 来运行基本的 HT
根据来源,BaseServer.shutdown() 必须从与运行服务器的线程不同的线程调用。 但是,我试图通过在 Web 请求中向服务器提供特定值来关闭服务器。 请求处理程序显然在这个线程中运行,所
有没有办法让 BaseHTTPServer.HTTPServer 像 SocketServer.ThreadingTCPServer 一样是多线程的? 最佳答案 您可以简单地使用使用这两个类的线程混合
我有以下 python 代码,其中我通过扩展 HTTPBaseServer 编写了一个简单的 HTTP 服务器: class ApiError(Exception): def __init__
我正在构建一个基于 python 的网络服务器( 是的,python 对于网络服务器来说是一个糟糕的选择,但这是我唯一的选择还有另一个很好的选择可以满足我的目的,例如 PHP,但我仅限于 python
我正在编写一个非常基本的网络服务器(好吧,正在尝试),虽然它现在可以很好地提供 HTML,但我的 CSS 文件似乎根本无法被识别。我的机器上也运行着 Apache2,当我将文件复制到 docroot
我有下一个 python 代码: from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import os PORT_NUMBER
我正在尝试使用 Python2.7 中的 BaseHttpServer 来制作一个简单的 HTTP SERVER,问题是当我想通过 在浏览器上设置多个 cookie 时 self.send_
我有调用外部 HTTP 服务的 Python 代码。我想通过设置模仿这些外部服务的模拟 HTTP 服务器来测试此代码。为此,我在一个单独的线程中启动一个 BaseHTTPServer,然后从主线程调用
因此,我尝试按照有关如何使用 web.py 的在线教程进行操作,并且安装了它,但不幸的是,使用这段代码会产生严重的错误。我的代码... import web urls = ( '/(.*)',
我是一名优秀的程序员,十分优秀!