栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

如何用python快速的搭建一个websocket服务器?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何用python快速的搭建一个websocket服务器?

准备工作

python:3.9.x

  • python 依赖
    pip3 install asyncio
    pip3 install json
    pip3 install websockets
    pip3 install pyvisa
    pip3 install configparser
目录结构
-case(功能代码模块文件夹)
--OutputPower.py(功能代码,接收到客户端信息,判断进入对应的功能模块)
-websocket(webSocket服务器代码,主要负责维护连接、接收数据、发送数据)
--server.py(服务器代码)
-app.py(程序入口)
代码

server.py
功能包括:
1、建立websocket连接
2、收取客户端信息
3、发送客户端信息

服务器数据处理模块

此处我使用了多线程,主要是想到以后的功能模块交互问题

import asyncio
import websockets
import time
import json
import threading
# 功能模块
from case.OutputPower import OutputPower

# 存储所有的客户端
Clients = []

class Server():
	# 发消息给客户端的回调函数
    async def s(self,msg,websocket=None):
        await self.sendMsg(msg,websocket)
    # 针对不同的信息进行请求,可以考虑json文本
    async def runCase(self,jsonMsg,websocket):
        print('runCase')
        # await OutputPower(jsonMsg,self.s,websocket)
        op = OutputPower()
        await op.run(jsonMsg,self.s,websocket)

    # 每一个客户端链接上来就会进一个循环
    async def echo(self,websocket, path):
        Clients.append(websocket)
        await websocket.send(json.dumps({"type": "handshake"}))
        while True:
            try:
                recv_text = await websocket.recv()
                message = "I got your message: {}".format(recv_text)
                # 直接返回客户端收到的信息
                await websocket.send(message)
                print(message)

                # 分析当前的消息 json格式,跳进功能模块分析
                await self.runCase(jsonMsg='',websocket=websocket)

            except websockets.ConnectionClosed:
                print("ConnectionClosed...", path)  # 链接断开
                Clients.remove(websocket)
                break
            except websockets.InvalidState:
                print("InvalidState...")  # 无效状态
                Clients.remove(websocket)
                break
            except Exception as e:
                print(e)
                Clients.remove(websocket)
                break

    # 发送消息
    async def sendMsg(self,msg,websocket):
        print('sendMsg:',msg)
        if websocket != None:
            await websocket.send(msg)
        else:
            await self.broadcastMsg(msg)

	# 群发消息
    async def broadcastMsg(self,msg):
        for user in Clients:
            await user.send(msg)

    # 启动服务器
    async def runServer(self):
        async with websockets.serve(self.echo, 'localhost', 8888):
            await asyncio.Future()  # run forever

	# 多线程模式,防止阻塞主线程无法做其他事情
    def WebSocketServer(self):
        asyncio.run(self.runServer())

    def startServer(self):
        # 多线程启动,否则会堵塞
        thread = threading.Thread(target=self.WebSocketServer)
        thread.start()
        thread.join()
        print("go!!!")

建立功能模块

做到业务分离(OutputPower.py)

import asyncio

class OutputPower():
    async def run(self,arg,s,websocket):
        # 发送消息方法,单独和请求的客户端发消息
        await s('sssss', websocket)
        # 群发消息
        await s('起来hi')

启动服务

(app.py)

from webSocket.server import Server

if __name__=='__main__':
    s = Server()
    s.startServer()

测试

直接找一个在线的websocket进行连接测试即可,如 http://www.websocket-test.com/

结果如图:

  • 第一个客户端链接
  • 发送:12
  • 服务器返回:I got your message:12
  • 继续返回功能模块的:sssss
  • 返回群发的信息:起来hi
  • 返回群发的信息:起来hi
  • 第二个客户端链接上去
  • 重复第一个客户端工作,但是第一个客户端多接收到了一个:起来hi
测试源码

见:https://download.csdn.net/download/weixin_44635546/85645105

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971739.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号