Python进阶(5) WebSocket

0. 前言

  • 目标:建立长连接,异步发送/接收信息。
    • 注意,只关注长连接

1. Server

MethodDescriptionTakesGives
set_fn_new_client()Sets a callback function that will be called for every new client connecting to usfunctionNone
set_fn_client_left()Sets a callback function that will be called for every client disconnecting from usfunctionNone
set_fn_message_received()Sets a callback function that will be called when a client sends a messagefunctionNone
send_message()Sends a message to a specific client. The message is a simple string.client, messageNone
send_message_to_all()Sends a message to all connected clients. The message is a simple string.messageNone
  • 注意事项:
    • 当运行了 run_forever 方法后,当前线程就阻塞了。
    • 如果在之后要调用 send_message_to_all 方法,利用多线程。
  • 基本使用示例
from websocket_server import WebsocketServer

# Called for every client connecting (after handshake)
def new_client(client, server):
	print("New client connected and was given id %d" % client['id'])
	server.send_message_to_all("Hey all, a new client has joined us")


# Called for every client disconnecting
def client_left(client, server):
	print("Client(%d) disconnected" % client['id'])


# Called when a client sends a message
def message_received(client, server, message):
	if len(message) > 200:
		message = message[:200]+'..'
	print("Client(%d) said: %s" % (client['id'], message))


PORT=9001
server = WebsocketServer(PORT)
server.set_fn_new_client(new_client)
server.set_fn_client_left(client_left)
server.set_fn_message_received(message_received)
server.run_forever()
  • 多线程示例
import time
import logging
import threading
from websocket_server import WebsocketServer


def new_client(client, server):
    server.send_message_to_all("Hey all, a new client has joined us")


def message_received(client, server, message):
    if len(message) > 200:
        message = message[:200]+'..'
    print("Client(%d) said: %s" % (client['id'], message))


class ServerThread(threading.Thread):
    def __init__(self, port=13254, host='10.1.187.36', loglevel=logging.INFO):
        threading.Thread.__init__(self)
        self.server = WebsocketServer(port, host=host, loglevel=loglevel)
        self.server.set_fn_new_client(new_client)
        self.server.set_fn_message_received(message_received)
        print('init server thread successfully')

    def run(self):
        print("start running server thread")
        self.server.run_forever()


if __name__ == '__main__':
    server_thread = ServerThread()
    server_thread.start()
    while True:
        time.sleep(5)
        server_thread.server.send_message_to_all('server test msg')

2. Cleint

  • 参考:Github: websocket-client/websocket-client
  • 安装:pip install websocket-clien
  • 注意事项:
    • url的结构形如 ws://host:ip,可能还要设置。
    • run_forever 运行后会阻塞当前线程,如果想要执行其他功能,需要设置多线程。
  • 简单示例:
import websocket
try:
    import thread
except ImportError:
    import _thread as thread
import time

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

def on_open(ws):
    def run(*args):
        for i in range(3):
            time.sleep(1)
            ws.send("Hello %d" % i)
        time.sleep(1)
        ws.close()
        print("thread terminating...")
    thread.start_new_thread(run, ())


if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    ws.on_open = on_open
    ws.run_forever() 
  • 多线程示例
import websocket
import threading
websocket.enableTrace(True)


def on_message(ws, message):
    print('on message')
    print(ws)
    print(message)


def on_error(ws, error):
    print('on error')
    print(ws)
    print(error)


def on_close(ws):
    print('on close')
    print(ws)
    print("### closed ###")


class ClientThread(threading.Thread):
    def __init__(self, port=13254, host="10.1.187.36"):
        threading.Thread.__init__(self)
        url = "ws://{}:{}".format(host, port)
        self.ws = websocket.WebSocketApp(url,
                                         on_message=on_message,
                                         on_error=on_error,
                                         on_close=on_close)
        print('successfully creating client thread')

    def run(self):
        self.ws.run_forever()


if __name__ == '__main__':
    client_thread = ClientThread()
    client_thread.start()

    import time
    while True:
        time.sleep(5)
        client_thread.ws.send('client test msg')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值