天天看點

如何使用Tornado實作WebSocket伺服器?

什麼是龍卷風? (What is Tornado?)

Tornado is a python web framework and asynchronous networking library

. It is scalable and non-blocking. It specializes in dealing with event-driven networking. As

tornado

supports concurrent connections, naturally, a server can take advantage of this behavior and handle a lot of web socket connections within a single node.

Tornado是一個python Web架構和異步網絡庫

。 它具有可伸縮性和非阻塞性。 它專門處理事件驅動的網絡。 由于

龍卷風

支援并發連接配接,自然地,伺服器可以利用此行為并在單個節點内處理許多Web套接字連接配接。

什麼是Websocket? (What is Websocket?)

WebSocket is a protocol that provides full-duplex communication channels over a single TCP connection. The behavior of the open socket makes a web connection stateless and facilitates the real-time data transfer to and from the server.

WebSocket是一種協定,可通過單個TCP連接配接提供全雙工通信通道。 開放套接字的行為使Web連接配接變為無狀态,并促進了與伺服器之間的實時資料傳輸。

WebSockets are designed to be used in web-browsers and servers. A connection is opened once and messages can travel to-fro multiple times before the connection is closed.

WebSockets設計用于Web浏覽器和伺服器。 連接配接一次打開,并且消息可以在關閉連接配接之前往返傳輸多次。

安裝龍卷風 (Install Tornado)

Installing the tornado

is rather simple in a virtual environment using

pip

.

在使用

pip

的虛拟環境中

安裝龍卷風

非常簡單。

  • Create a virtual environment

    建立一個虛拟環境

    python3 -m venv /path/to/virtual/environment python3 -m venv / path / to / virtual / environment >> python3 -m venv venv >> python3 -m venv venv
  • Source the virtual environment

    采購虛拟環境

    >> source venv/bin/activate >>源venv / bin / activate
  • Install the websocket-client using pip

    使用pip安裝websocket-client

    >> (venv) pip3 install tornado >>(Venv)pip3安裝龍卷風
Using cached https://files.pythonhosted.org/packages/30/78/2d2823598496127b21423baffaa186b668f73cd91887fcef78b6eade136b/tornado-6.0.3.tar.gz
Requirement already satisfied: six in ./venv/lib/python3.7/site-packages (from websocket_client==0.56.0->-r requirements.txt (line 1)) (1.12.0)
Installing collected packages: tornado
  Running setup.py install for tornado ... done
Successfully installed tornado-6.0.3
           

使用Tornado庫啟動Web套接字伺服器的Python示例 (Python example to start a web socket server using Tornado library)

'''
    This module hosts a websocket server using tornado
    libraries
'''

import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.websocket as ws
from tornado.options import define, options
import time

define('port', default=4041, help='port to listen on')

class web_socket_handler(ws.WebSocketHandler):
    '''
    This class handles the websocket channel
    '''
    @classmethod
    def route_urls(cls):
        return [(r'/',cls, {}),]
    
    def simple_init(self):
        self.last = time.time()
        self.stop = False
    
    def open(self):
        '''
            client opens a connection
        '''
        self.simple_init()
        print("New client connected")
        self.write_message("You are connected")
        
    def on_message(self, message):
        '''
            Message received on the handler
        '''
        print("received message {}".format(message))
        self.write_message("You said {}".format(message))
        self.last = time.time()
    
    def on_close(self):
        '''
            Channel is closed
        '''
        print("connection is closed")
        self.loop.stop()
    
    def check_origin(self, origin):
        return True

def initiate_server():
    #create a tornado application and provide the urls
    app = tornado.web.Application(web_socket_handler.route_urls())
    
    #setup the server
    server = tornado.httpserver.HTTPServer(app)
    server.listen(options.port)
    
    #start io/event loop
    tornado.ioloop.IOLoop.instance().start()


if __name__ == '__main__':
    initiate_server()
           

The above code will start the server on

localhost

and

port as 4041

.

上面的代碼将在

localhost

端口4041

上啟動伺服器。

Connect to the server using a websocket client code (example below),

使用websocket用戶端代碼連接配接到伺服器(以下示例),

from websocket import create_connection

def short_lived_connection():

    ws = create_connection("ws://localhost:4040/")
    print("Sending 'Hello Server'...")
    ws.send("Hello, Server")
    print("Sent")
    print("Receiving...")
    result =  ws.recv()
    print("Received '%s'" % result)
    ws.close()

if __name__ == '__main__':
    short_lived_connection()
           
Output (Client side): 輸出(用戶端):
>>Sending 'Hello, Server'...
>>Sent
>>Receiving...
>>Received 'You are connected'
           
Output (Server side): 輸出(伺服器端):
>>New client connected
>>received message Hello, Server
>>connection is closed
           
References: 參考文獻:
  • Tornado

    龍卷風

  • WebSocket

    WebSocket

翻譯自: https://www.includehelp.com/python/how-to-implement-a-websocket-server-using-tornado.aspx