socketioの応用

3220 ワード

まず背景をはっきり言いましょう.
この2,3日、Web側にリアルタイムのデータ表示を行う必要があります.Web側のデータをwebsocketでリアルタイムに引き出すことです.
需要に合わせて検討したところ、socketioのほうが簡単だと思います.サービス側のデータは他のサイトから取り戻さなければならないので、相手はsocketioを使っています.これはサービス端がnodejsのようです.python版があるかどうか探しています.最後に以下のものをサービス端に使います.
https://pypi.python.org/pypi/python-socketio/1.6.1

 数据来源也用python来做客户端抓取吧。用这个: 
   
  

https://pypi.python.org/pypi/socketIO-client

ツールの背景の紹介が終わったら、基本的な論理を話しましょう.
1.プログラムを書いて他のウェブサイトにデータをつかんで、手に入れてRedisメッセージキューに入れます.
2.私たちのウェブ側は自分のsocketioのサービス側に接続されています.
3.自分のサービス側がredisキューからデータを取得した後、すべてのウェブ側に直接ブロードキャストする.
キャプチャ側のコード:
def on_message(*args):
    #         dict
    TickHelper.handle(args)


def on_connect():
    logging.info("success connect server")

def on_disconnect():
    logging.info("disconnect from server")

def on_reconnect():
    logging.info("reconnect to server")

def on_emit(*args):
    logging.info("success emit")

def run(host,port):
    socketIO = SocketIO(host,port
                        , headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
                        )
    socketIO.on('connect', on_connect)
    socketIO.on('disconnect', on_disconnect)
    socketIO.on('reconnect', on_reconnect)

    socketIO.emit('',on_emit)#          。
    socketIO.on('message', on_message)
    #wait forever
    socketIO.wait()

socketioのイベントモデルはかっこいいですね.
次は前述のhandle関数の論理ですが、実は簡単で、redisを通じてキューに送ります.
mgr = socketio.RedisManager('redis://xxx.xxx.xxx.xx:6379/0',write_only=True)#  socketio  ,       receive  ,    write_only

def handle(msg):
    mgr.emit("message", msg, room='tick')#  room      ,   group   ,     room    

これでデータをredisに入れました.
次はサービス端です.
eventlet.monkey_patch()#    ,          
mgr = socketio.RedisManager('redis://xxx.xxx.xxx.xxx:6379/')#   redis topickey,       socketio。     write_only 。
sio = socketio.Server(async_handlers=True, logger=True,client_manager=mgr)
#        ,socketio                ,        web  。

@sio.on('connect', namespace='/')
def connect(sid, environ):
    sio.enter_room(sid=sid,room="tick")#        
    logging.info("connect "+sid)


@sio.on('tick_request', namespace='/')
def message(sid):
    pass


@sio.on('disconnect', namespace='/')
def disconnect(sid):
    logging.info('disconnect '+sid)

if __name__ == '__main__':
    init_logger()
    app = socketio.Middleware(sio)

    # deploy as an eventlet WSGI server
    eventlet.wsgi.server(eventlet.listen(('', 8000)), app)


覚えておいてください.eventletフレームワークは、python自身のthreadでは何も処理できません.さもないとコードがあなたのthreadにかかって、eventletは何も気にしません.