python websocket与tornado. Socket未关闭

0 投票
1 回答
2358 浏览
提问于 2025-04-18 15:39

我刚开始学习使用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并没有关闭socket。我找到的唯一解决办法就是在任务管理器中结束python进程,这样我的端口就“空闲”了。
为什么会出现这种情况?我该怎么做(这样工作真的很麻烦..)?为什么操作系统不释放我的端口呢?

1 个回答

4

你需要停止服务器,这样这个端口才能再次使用。

下面的代码可以用来停止服务器:

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)

撰写回答