【问题标题】:python websocket with tornado. Socket aren't closedpython websocket 与龙卷风。套接字未关闭
【发布时间】:2014-09-24 18:45:21
【问题描述】:

我是 websocket 的初学者,我正在尝试使用 tornado 来达到这个目的。到目前为止,这是我的工作代码:

from tornado import websocket
from tornado import web
import tornado.ioloop

class EchoWebSocket(websocket.WebSocketHandler):
    def open(self):
        print "WebSocket opened"

    def on_message(self, message):
        self.write_message(u"You said: " + message)
        print message

    def on_close(self):
        print "WebSocket closed"

    def check_origin(self, origin):
        return True

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([(r"/", EchoWebSocket),(r'/',MainHandler),])
application.listen(8001)
tornado.ioloop.IOLoop.instance().start()

我正在使用 IDLE,到目前为止一切正常,只有一个烦人的问题。我无法修复此代码,然后重新运行服务器而不会看到此错误:

    application.listen(8001)
  File "C:\Python27\lib\site-packages\tornado\web.py", line 1691, in listen
    server.listen(port, address)
  File "C:\Python27\lib\site-packages\tornado\tcpserver.py", line 125, in listen
    sockets = bind_sockets(port, address=address)
  File "C:\Python27\lib\site-packages\tornado\netutil.py", line 137, in bind_sockets
    sock.bind(sockaddr)
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

当我终止程序时,python 似乎没有关闭套接字。我发现的唯一方法是在任务管理器中终止 python 进程,而不是让我的端口再次“空闲”。
为什么会发生这种情况,可以做些什么(这样真的很辛苦..)?为什么操作系统不会释放我的端口?

【问题讨论】:

  • 你确定程序真的要终止了吗?如果任务管理器中还有Python进程在运行,听起来好像还在运行。
  • 好吧,我正在关闭正在运行的空闲服务器,他问我“你想杀死它吗?”我点击是。就这样。它不会关闭套接字。

标签: python sockets port bind tornado


【解决方案1】:

您需要停止服务器,以便端口可以再次使用。

这将停止服务器:

tornado.ioloop.IOLoop.instance().stop()

你应该在你运行完服务器后调用(如果你用 CTRL-C 杀死它,你需要捕获它并在处理程序中调用它)。

你可以用这个来捕捉 CTRL-C:

import signal
def signal_handler(signum, frame):
    tornado.ioloop.IOLoop.instance().stop()

signal.signal(signal.SIGINT, signal_handler)

【讨论】:

  • 工作。信号虽然不起作用。我直接点击X就退出了。我还是不明白为什么它没有自动关闭,socket对象被破坏了,为什么端口不会再次空闲?
  • 在单击 X 之前尝试 CTRL-C。问题是当您单击 X 时,tornado IOLoop 仍在运行,并且在关闭空闲时不会停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多