Tornado는 WebSocket 링크 요청을 처리하기 위해 tornado.websocket.WebSocketHandler 클래스를 정의합니다. 애플리케이션 개발자는 이 클래스를 상속하고 해당 클래스의 open(), on_message() 및 on_close() 기능을 구현해야 합니다.
WebSocketHandler.open() 함수: Tornado 프레임워크는 새 WebSocket 연결이 설정될 때 이 함수를 호출합니다. 이 함수에서 개발자는 get_argument() 함수를 사용하여 get(), post() 및 기타 함수와 같이 클라이언트가 제출한 매개변수를 얻을 수 있으며, get_secure_cookie/set_secure_cookir를 사용하여 쿠키 작동 등을 수행할 수 있습니다.
WebSocketHandler.on_message(message) 함수: WebSocket 링크를 설정한 후 Tornado 프레임워크는 클라이언트로부터 메시지가 수신되면 이 함수를 호출합니다. 일반적으로 이는 수신된 메시지를 그에 따라 처리하는 서버측 WebSocket 프로그래밍의 핵심 기능입니다.
WebSocketHandler.on_close() 함수: WebSocket 링크가 닫히면 Tornado 프레임워크가 이 함수를 호출합니다. 이 함수에서는 self.close_code, self.close_reason에 접근하여 종료 이유를 조회할 수 있습니다.
Tornado 프레임워크에서 자동으로 호출되는 세 가지 입력 함수 외에도 WebSocketHandler는 두 명의 개발자에게 WebSocket 기능을 적극적으로 작동할 수 있는 기능을 제공합니다.
WebSocketHandler.write_message(message,binary=False) 함수: 이 링크와 관련된 클라이언트에 메시지를 쓰는 데 사용됩니다.
WebSocketHandler.close(code=None,reason=None) 함수: WebSocket 링크를 적극적으로 닫습니다. 코드와 이유는 클라이언트에게 링크가 닫힌 이유를 알려주는 데 사용됩니다. 매개변수 코드는 숫자 값이어야 하며 이유는 문자열입니다.
다음은 클라이언트에 시간 메시지를 지속적으로 푸시하는 Tornado WebSocket 프로그램입니다.
import tornado.ioloop import tornado.web import tornado.websocket from tornado import gen from tornado.options import define,options,parse_command_line import asyncio clients=dict()#客户端Session字典 class IndexHandler(tornado.web.RequestHandler): @tornado.web.asynchronous @gen.coroutine def get(self): print("123") self.render("index.html") class MyWebSocketHandler(tornado.websocket.WebSocketHandler): def open(self, *args, **kwargs): #有新链接时被调用 self.id=self.get_argument("Id") self.stream.set_nodelay(True) clients[self.id]={"id":self.id,"object":self}#保存Session到clients字典中 def on_message(self, message):#收到消息时被调用 print("Client %s received a message:%s"%(self.id,message)) def on_close(self): #关闭链接时被调用 if self.id in clients: del clients[self.id] print("Client %s is closed"%(self.id)) def check_origin(self, origin): return True app=tornado.web.Application([ (r'/',IndexHandler), (r'/websocket',MyWebSocketHandler), ]) import threading import time class SendThread(threading.Thread): # 启动单独的线程运行此函数,每隔1秒向所有的客户端推送当前时间 def run(self): # tornado 5 中引入asyncio.set_event_loop,不然会报错 asyncio.set_event_loop(asyncio.new_event_loop()) import datetime while True: for key in clients.keys(): msg = str(datetime.datetime.now()) clients[key]["object"].write_message(msg) print("write to client %s:%s" % (key, msg)) time.sleep(1) if __name__ == '__main__': #启动推送时间线程 SendThread().start() parse_command_line() app.listen(8888) #挂起运行 tornado.ioloop.IOLoop.instance().start()
위 코드는 다음과 같이 구문 분석됩니다.
전역 변수 사전 클라이언트는 WebSocket을 설정하는 모든 클라이언트 정보를 저장하도록 정의됩니다. 서버와 연결됩니다. 사전의 키는 클라이언트 ID이고 값은 ID와 해당 WebSocketHandler 인스턴스로 구성된 튜플입니다.
IndexHandler는 홈페이지 index.html을 클라이언트에 렌더링하는 데 사용되는 일반 페이지 프로세서입니다. 이 페이지에는 WebSocket 클라이언트 프로그램이 포함되어 있습니다.
MyWebSocketHandler는 tornado.web.WebSocketHandler에서 상속된 이 예제의 핵심 핸들러입니다. open() 함수는 클라이언트 사전에 대한 모든 클라이언트 연결을 저장합니다. on_message()는 클라이언트가 보낸 메시지를 표시하는 데 사용됩니다. on_close()는 클라이언트 사전 제거에서 닫힌 WebSocket 링크를 이동하는 데 사용됩니다.
sendTime() 함수는 별도의 스레드에서 실행되며 1초마다 클라이언트의 모든 클라이언트를 폴링하고 MyWebSocketHandler.write_message() 함수를 통해 클라이언트에 시간 메시지를 푸시합니다.
이 예제에서는 tornado.web.Application 인스턴스에 두 개의 경로만 구성되어 있으며 각각 IndexHandler 및 MyWebSocketHandler를 가리키며 여전히 Tornado IOLoop에 의해 시작되고 실행됩니다.
위 내용은 Python Tornado의 WebSocket 서버 측 프로그래밍 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!