>백엔드 개발 >파이썬 튜토리얼 >Python Tornado의 WebSocket 서버 측 프로그래밍 소개

Python Tornado의 WebSocket 서버 측 프로그래밍 소개

不言
不言앞으로
2018-10-20 15:37:022990검색
이 기사는 Python Tornado의 WebSocket 서버 프로그래밍에 대해 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제