python websocket与tornado. Socket未关闭
我刚开始学习使用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)