Websocket+protobuf怎么与服务器通信

news2024/11/16 0:32:46

Websocket+protobuf怎么与服务器通信

Websocket:WebSocket是⼀种⽹络传输协议,可在单个TCP连接上进⾏双全⼯通信,位于OSI模型的
应⽤层
在这里插入图片描述

实现⼀个简单的客⼾端和服务端

安装websockets

 pip3 install websockets

客户端代码

import asyncio
import websockets

async def hello():
	uri = "ws://localhost:8765"
	async with websockets.connect(uri) as websocket:
		while True:
			name = input("What's your name?: ")
			await websocket.send(name)
			print(f"> {name}")
			greeting = await websocket.recv()
			print(f"< {greeting}")
if __name__ == "__main__":
	asyncio.get_event_loop().run_until_complete(hello())

服务端代码

import asyncio
import websockets

async def hello(websocket):
	while True:
		name = await websocket.recv()
		print(f"< {name}")

		greeting = f"Hello {name}!"

		await websocket.send(greeting)
		print(f"> {greeting}")
if __name__ == "__main__":
	start_server = websockets.serve(hello, "localhost", 8765)
	asyncio.get_event_loop().run_until_complete(start_server)
	asyncio.get_event_loop().run_forever()

websockets 是⼀个⽤于在 Python 中构建WebSocket服务器和客⼾端的库,专注于正确性、简单性、健壮性和性能。它建⽴在 Python 的标准异步 I/O 框架之上 asyncio ,提供了⼀个优雅的基于协程的 API。

Protobuf

protobuf全称Google Protocol Buffers,是google开发的的⼀套⽤于数据存储,⽹络通信时⽤于协议编解码的⼯具库。protobuf是⼀种灵活⾼效的独⽴于语⾔平台的结构化数据表⽰⽅法

probuf⽂档
在这里插入图片描述
protobuf与语言无关,protobuf转化成Python protoc --python_out=. ./user.proto

定义一个proto文件

syntax = "proto3";

message User {
string name = 1;
}

执行protoc --python_out=. ./user.proto,转化成Python结构体后将Python结构体转化成字节流,进行通信

user = user_pb2.User()
user.name = "张三"
data = user.SerializeToString()

粘包问题

拿我们的举例的PB⽂件来说:

syntax = "proto3";
message User {
string name = 1;
}

Q: 怎么知道你传过来的name⻓度是多少?
在这里插入图片描述
A:加上包头,根据包头的信息读取包的⻓度。
在这里插入图片描述
在Python中没有结构体的概念,所以⽤struct操作字节流

import struct
print("len(hello)=", len(bytes("hello", encoding="utf8")))
print("pack=", struct.pack('>I5s', 12341234, bytes("hello", encoding="utf8")))
print("unpack=", struct.unpack('>I5s', b'\x00\xbcO\xf2hello'))
  • I 表⽰接下来是⼀个四个字节的int 12341234
  • 5S表⽰接下来是五个Char
  • 表⽰⼤端,⽹络端

UDP/TCP/IP协议规定:把接收到的第⼀个字节当作⾼位字节看待,这就要求发送端发送的第⼀个字节是⾼位字节;⽽在发送端发送数据时,发送的第⼀个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个节就是要发送的第⼀个⾼位字节所以:⽹络字节序就是⼤端字节序, 有些系统的本机字节序是⼩端字节序, 有些则是⼤端字节序, 为了保证传送顺序的⼀致性, 所以⽹际协议使⽤⼤端字节序来传送数据。
在这里插入图片描述

# client
import asyncio
import websockets
import user_pb2
import struct
async def hello():
	uri = "ws://localhost:8765"
	async with websockets.connect(uri) as websocket:
	user = user_pb2.User()
	user.name = "张三"
	data = user.SerializeToString()

	l = len(data)
	format = ">I%us" % l
	print("format=", format)
	buf = struct.pack(format, l, data)
	
	await websocket.send(buf)
	print(f"> {user.name}")
	
	ret = await websocket.recv()
	print(f"< {ret}")

if __name__ == "__main__":
	asyncio.get_event_loop().run_until_complete(hello())
# server
import asyncio
import websockets
import struct
import user_pb2


async def hello(websocket, path):
	buf = await websocket.recv()
	
	l = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3]
	print('l=', l)
	format = ">%us" % l
	data = struct.unpack(format, buf[4:])
	print(data)
	user = user_pb2.User()
	user.ParseFromString(buf[4:])
	print("服务器收到名字, name=", user.name)
	
	greeting = f"I received!"
	await websocket.send(greeting)
	print(f"> {greeting}")


if __name__ == "__main__":
	start_server = websockets.serve(hello, "localhost", 8765)
	
	asyncio.get_event_loop().run_until_complete(start_server)
	asyncio.get_event_loop().run_forever()

以上就可以实现protobuf+websocket的通信了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次异常外联事件应急响应

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 事件背景介绍02 事件分析过程03 事件分析结果04 安全加固建议 01 事件背景介绍 某内部应急演练中&#xff0c;安全部门收到来自业务部门的告警&#xff0c;称应用服务器存在异常外联情况&#xff0…

管理类联考——英语二——技巧篇——阅读理解——taiqi

第一章 翻译技巧概述 一、词汇方面 (一&#xff09;词义选择 大多数英语词汇是多义的&#xff0c;翻译时必须选择正确的词义。词义选择的方法有三&#xff1a;根据上下文和词的搭配选择根据词类选择、根据专业选择。 (二&#xff09;词义转换 在理解英文词汇的原始意义基础…

算法刷题-哈希表-三数之和

用哈希表解决了两数之和&#xff0c;那么三数之和呢&#xff1f; 第15题. 三数之和 力扣题目链接 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且…

后台服务守护进程神器pm2介绍及使用

前言 linux的后台服务程序需要在后台一直运行。如果通过ssh访问临时启动的&#xff0c;会话一结束就直接关闭了服务。想让服务在后台一直运行且永远不挂掉&#xff0c;推荐后台服务守护进程神器pm2&#xff0c;强大且适用于各种语言的后台服务程序。 pm2介绍 对于后台进程的管…

(十)异步-什么是异步方法(2)

一、什么是异步方法 异步方法在完成其工作之前即返回到调用方法&#xff0c;然后在调用方法继续执行的时候完成其工作。 特点&#xff1a; 方法头中包含 async 方法修饰符。包含一个或多个 await 表达式&#xff0c;表示可以异步完成的任务。必须具备3种返回类型之一&#x…

使用Gradio Interface构建交互式机器学习演示

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

chatgpt赋能python:Python列表排序方法介绍

Python 列表排序方法介绍 在 Python 中&#xff0c;列表是一种非常常见的数据类型。在处理列表时&#xff0c;有时需要对列表进行排序&#xff0c;以便更方便地对其进行查找、比较、统计等操作。Python 中提供了多种排序方法&#xff0c;本文将介绍这些方法并说明其使用方法。…

chatgpt赋能python:Python中的日期遍历方法详解

Python中的日期遍历方法详解 作为一门非常流行的编程语言&#xff0c;Python中的日期遍历方法备受程序员们喜爱。它可以遍历任意时间段内的日期并进行各种操作&#xff0c;比如日期加减、日期格式转换等等。在本文中&#xff0c;我们将详细介绍Python中的日期遍历方法&#xf…

lazarus:用FpSpreadsheet快速搭建基于电子表格文件的单机程序

目录 1 简介 2 制作简单的电子表格 3 需要几个控件&#xff0c;以及简单属性设置 3.1 TsWorksheetDataset 3.2 DataSource1控件 3.3 DBNavigate控件 3.4 DBGrid 3.5 编译运行&#xff0c;插入一行数据 1 简介 在FpSpreadsheet控件包中&#xff0c;有一个专门把电子表格…

Python3 注释与运算符 | 菜鸟教程(四)

目录 一、Python3 注释 &#xff08;一&#xff09;Python 中单行注释以 # 开头 &#xff08;二&#xff09;多行注释用三个单引号 或者三个双引号 """ 将注释括起来 1、单引号&#xff08;&#xff09; 2、双引号&#xff08;"""&#xff…

14.基于XML管理Bean

基于XML管理Bean 配置Springframework 引入依赖 <!-- 基于Maven依赖传递性&#xff0c;导入spring-context依赖即可导入当前所需所有jar包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId&…

(十)异步-使用异步(3)

一、GUI 程序中的异步操作 1、在 GUI 程序中使用异步操作 在 GUI程序中&#xff0c; 首先理解关于 UI 显示变化的概念。 消息&#xff1a; UI 上的行为&#xff0c;如点击按钮、展示标签、移动窗体等。消息队列&#xff1a; 把要触发的所有消息&#xff0c;都按照相关的顺序…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(II)

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客阿里巴巴找宝箱(ll) 题目描述 贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面贴有箱子中藏有金币的数量。 从金币数量中…

【MySQL】索引的数据结构

为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构。进行数据查找时&#xff0c;首先查看查询条件是否命中某条索引&#xff0c;符合则可以通过索引查找相关数据&#xff0c;如果不符合则要全表扫描&#xff0c;即需要一条一条地查找记录&#xff0c;直到找到…

「网络编程」第二讲:网络编程socket套接字(二)_ 简单UDP网络通信程序的实现

「前言」文章是关于网络编程的socket套接字方面的&#xff0c;上一篇是网络编程socket套接字&#xff08;一&#xff09;&#xff0c;下面开始讲解&#xff01; 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 我认…

chatgpt赋能python:Python遍历文章的SEO指南

Python遍历文章的SEO指南 Python是一种高度灵活的编程语言&#xff0c;因其易于学习和使用而为许多程序员、数据科学家和SEO专业人士所青睐。在这篇文章中&#xff0c;我们将探讨Python如何遍历文章和对SEO优化的最佳实践。 什么是Python遍历文章&#xff1f; 遍历文章是指采…

【论文阅读】Segment Anything(SAM)——可分割一切的CV大模型

【前言】随着ChatGPT席卷自然语言处理&#xff0c;Facebook凭借着Segment Anything在CV圈也算扳回一城。迄今为止&#xff0c;github的star已经超过3万&#xff0c;火的可谓一塌糊涂。作为AI菜鸟&#xff0c;可不得自己爬到巨人肩膀上瞅一瞅~ 论文地址&#xff1a;https://arxi…

NDK编译C++源码生成Android平台so文件(opencv_android)

1.准备CPP文件 编写CMakeLists.txt 编写 mk文件 android-8 is unsupported. Using minimum supported version android-16 APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in ./AndroidManifest.xml 修改Application.mk中的APP_PLATFORM为 android-21 builg…

59、基于51单片机多机 NRF24L01 无线温湿度 DHT11报警系统设计(程序+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单等)

摘 要 温湿度在工农业生产中占有很重要的地位&#xff0c;是工农业生产的重要组成数据。温湿度过高会造成粮食发霉长芽&#xff0c;还会引起大棚蔬菜一系列的病害。因此对其适时准确的测量就显得尤为重要。而一般的测量过程较为复杂繁琐&#xff0c;误差还大。比如现在所使…

MySQL-SQL存储过程/触发器详解(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…