【发布时间】:2013-02-22 08:57:53
【问题描述】:
from twisted.web.resource import Resource
from twisted.web.server import Site, Session
from twisted.internet import ssl
from twisted.internet import reactor
class Echo(Resource):
def render_GET(self, request):
return "GET"
class WebSite(Resource):
def start(self):
factory = Site(self, timeout=5)
factory.sessionFactory = Session
self.putChild("echo", Echo())
reactor.listenSSL(443, factory, ssl.DefaultOpenSSLContextFactory('privkey.pem', 'cacert.pem'))
#reactor.listenTCP(8080, factory)
self.sessions = factory.sessions
if __name__ == '__main__':
ws = WebSite()
ws.start()
reactor.run()
在上面的代码中,当我从 Web 浏览器输入 URL“https://localhost/echo”时,它会获取页面。 5秒后我尝试重新加载页面,它没有刷新网页,卡在重新加载操作中。在第二次尝试重新加载时,它会立即获取页面。
当我使用 reactor.listenTCP(8080, factory) 运行上面的代码时,不会出现此类问题。 (我可以重新加载页面而不会卡住重新加载并立即获取页面)
Chrome、Firefox 可能会重复出现问题。但是当我用 Ubuntu 的 Epiphany 浏览器尝试时,没有出现这样的问题。
我不明白为什么会这样。
任何关于理解/解决问题的评论都会被采纳。
额外信息:
- 当我使用listenSSL 时,与连接相关的文件描述符在超时数秒后不会关闭。在重新加载页面时它保持静止,在第二次重新加载操作时,它关闭并打开新的文件描述符。 (我立即得到页面)
- 当我使用listenTCP时,文件描述符在超时几秒后关闭,当我重新加载页面时,它会打开新的文件描述符并立即返回页面。
- 还有 Telnet 连接,在这两种情况下都会按预期超时。
- 连接此服务器的扭曲客户端也会按预期影响超时。
【问题讨论】: