Python Socketio 介绍

   socketio是一个Python库,用于处理实时网络通信,它实现了Socket.IO协议。Socket.IO是一个JavaScript库,用于实时、双向和基于事件的通信。它在浏览器和服务器之间建立一个持久的连接,允许它们进行实时通信。

   socketio.Client()socketio库中的一个类,用于创建一个Socket.IO客户端。这个客户端可以连接到一个Socket.IO服务器,并与其进行实时通信。

socketio.Client()的一些主要方法和事件:

  1. **connect(url, kwargs): 这个方法用于连接到一个Socket.IO服务器。你需要提供服务器的URL。你还可以提供一些可选的关键字参数,如transports(指定连接使用的协议类型)。

  2. emit(event, data): 这个方法用于发送一个事件到服务器。你需要提供事件的名称和要发送的数据。

  3. on(event): 这个装饰器用于定义一个事件处理器。当客户端收到指定的事件时,它会调用相应的事件处理器。

  4. disconnect(): 这个方法用于断开与服务器的连接。

        以下是一个简单的例子,展示了如何使用socketio.Client()

import socketiosio = socketio.Client()@sio.event
def connect():print("I'm connected!")@sio.event
def disconnect():print("I'm disconnected!")sio.connect('http://localhost:5000')
sio.emit('my event', {'data': 'Hello, world!'})
sio.disconnect()

       

        我们首先创建了一个socketio.Client()实例。然后,我们定义了两个事件处理器:一个用于处理connect事件,另一个用于处理disconnect事件。然后,我们连接到服务器,发送一个名为my event的事件,然后断开连接。

socketio 库中的一些主要方法:

  1. socketio.Client(): 这是一个类,用于创建一个新的Socket.IO客户端实例。

  2. **sio.connect(url, kwargs): 这个方法用于连接到一个Socket.IO服务器。你需要提供服务器的URL。你还可以提供一些可选的关键字参数,如transports(指定连接使用的协议类型)。

  3. sio.emit(event, data): 这个方法用于发送一个事件到服务器。你需要提供事件的名称和要发送的数据。

  4. sio.disconnect(): 这个方法用于断开与服务器的连接。

  5. sio.on(event, handler): 这个方法用于注册一个事件处理器。当客户端收到指定的事件时,它会调用相应的事件处理器。例如,你可以使用 sio.on('message', message_handler) 来注册一个处理 'message' 事件的处理器。

  6. sio.wait(): 这个方法会阻塞当前线程,直到客户端断开连接。这对于需要保持连接的应用(如聊天应用、实时游戏等)非常有用。

  7. **sio.start_background_task(target, *args, kwargs): 这个方法用于启动一个后台任务。这对于需要在后台运行的长时间任务非常有用。

  8. sio.sleep(seconds): 这个方法会暂停当前线程指定的秒数。这对于需要在发送事件之间添加延迟的情况非常有用。

  9. sio.event: 这是一个装饰器,用于定义一个事件处理器。当客户端收到指定的事件时,它会调用相应的事件处理器。例如,你可以使用 @sio.event 来定义一个处理 'connect' 事件的处理器。

注意事项:

  1. 事件处理函数: 当你定义一个事件处理函数时,需要确保它能正确处理从服务器接收到的数据。如果处理函数抛出异常,可能会导致客户端断开连接。

  2. 线程安全socketio库是线程安全的,你可以在多个线程中使用同一个socketio.Client实例。但是,如果你在事件处理函数中访问共享数据,你需要确保这些访问是线程安全的。

  3. 连接状态: 在调用sio.emit()sio.disconnect()之前,你需要确保客户端已经连接到服务器。如果客户端没有连接到服务器,这些操作将会失败。

  4. 错误处理sio.connect()方法可能会抛出异常,例如,如果服务器无法连接。你需要确保你的代码能正确处理这些异常。

  5. 资源清理: 当你不再需要socketio.Client实例时,你应该调用sio.disconnect()来断开连接并释放资源。

  6. 阻塞操作sio.wait()方法是阻塞的,它会阻塞当前线程直到客户端断开连接。如果你不希望阻塞当前线程,你可以在一个单独的线程中调用这个方法。

  7. 后台任务: 如果你需要在后台运行长时间任务,你可以使用sio.start_background_task()方法。但是,你需要确保这个任务不会阻塞事件处理函数,否则可能会影响到客户端的响应性。

socketio.Client类的装饰器

        在Python中,装饰器是一种特殊类型的函数,它可以修改其他函数的行为。

   @sio.event@sio.onsocketio.Client类的装饰器,它们用于注册事件处理器。

        @sio.event: 这个装饰器用于注册一个处理器,当客户端触发特定的Socket.IO事件时,这个处理器会被调用。事件的名称由处理器函数的名称决定。

        @sio.on: 这个装饰器用于注册一个处理器,当客户端触发特定的Socket.IO事件时,这个处理器会被调用。事件的名称由装饰器的参数决定。

        这两个装饰器的主要目的是将事件处理器与特定的事件关联起来。当这些事件发生时,相应的处理器会被自动调用。这使得你可以在处理器中编写处理事件的代码,而不需要在主程序中显式调用这些处理器。这样可以使你的代码更加清晰和模块化。

@sio.event@sio.on有什么区别

@sio.event@sio.on都是用于注册事件处理器的装饰器,但它们的使用方式略有不同:

  • @sio.event:这个装饰器根据被修饰的函数的名称来确定对应的事件。例如,如果你有一个名为connect的函数并且它被@sio.event装饰,那么这个函数会在客户端收到connect事件时被调用。
@sio.event
def connect():print("Connected to the server!")
  • @sio.on:这个装饰器需要一个参数,这个参数是你想要处理的事件的名称。例如,如果你有一个名为handle_connect的函数并且它被@sio.on('connect')装饰,那么这个函数会在客户端收到connect事件时被调用。
@sio.on('connect')
def handle_connect():print("Connected to the server!")

        总的来说,@sio.event@sio.on都可以用来注册事件处理器,选择使用哪一个主要取决于你的编程风格和需求。如果你希望函数名和事件名保持一致,那么@sio.event可能更适合你。如果你希望能够自由地为函数命名,那么@sio.on可能更适合你。

socketio库中其他修饰器

  • @sio.middleware: 这个装饰器用于注册中间件函数。中间件函数在每个事件处理器之前运行,它们可以用于处理跨越多个事件的逻辑,例如身份验证或日志记录。
@sio.middleware
def print_event(sid, data):print("Socket ID: ", sid, ", Event data: ", data)
  • @sio.exception_handler(): 这个装饰器用于注册异常处理器。异常处理器在事件处理器抛出异常时运行,它们可以用于处理事件处理器中未捕获的异常。
@sio.exception_handler(ValueError)
def handle_value_error(e):print("A ValueError occurred: ", e)

        需要注意的是,这些装饰器的用途更加特定,它们不像@sio.event@sio.on那样常用。在大多数应用中,你可能只需要使用@sio.event@sio.on

Socket.IO内置事件

        Socket.IO定义了一些内置的事件,这些事件在客户端和服务器之间的通信过程中自动触发。以下是一些常见的内置事件:

  1. connect: 当客户端成功连接到服务器时触发。

  2. disconnect: 当客户端从服务器断开连接时触发。

  3. message 或 data: 当客户端接收到来自服务器的消息时触发。

  4. error: 当发生错误时触发。

除了这些内置事件,你还可以定义自己的自定义事件。自定义事件的名称可以是任何字符串,只要它不与内置事件的名称冲突。你可以使用socket.emit('my event', data)来发送一个自定义事件,然后在另一端使用socket.on('my event', function(data) {})来接收这个事件。

需要注意的是,虽然Socket.IO允许你定义自己的自定义事件,但是在设计你的应用时,你应该尽量使用内置事件,只有在必要的时候才使用自定义事件。这是因为内置事件已经被优化过,而且它们的行为在所有的Socket.IO实现中都是一致的。

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

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

相关文章

【金猿人物展】白鲸开源CEO郭炜:数据要素是未来数据“新能源”产业么?

纵观2023年中国数据行业发展与2024年数据产业趋势,就不得不提到2023年全年国家全年强调的数据要素的概念以及在2023年12月中国国家数据局等17个部门联合印发了《“数据要素”三年行动计划(2024—2026年)》。 从2020年-2023年政策发展脉络来看…

第九部分 使用函数 (五)

目录 一、origin 函数 “undefined” “default” “file” “command line” “override” “automatic” 二、shell 函数 三、控制 make 的函数 1、error 2、warning 一、origin 函数 origin 函数不像其它的函数,他并不操作变量的值,他只是…

[ACM 学习] 最长上升子序列

LIS(最长上升子序列)的三种经典求法 - 一只不咕鸟 - 博客园 (cnblogs.com) 理解一下第三种方法(贪心二分查找) 因为构建的是上升子序列,所以是可以用二分查找找到最大的小于当前 A[i] 的在子序列中的 F[j]&#xff0…

【Git】GitHub上手动解决冲突

在 GitHub 上手动解决冲突通常涉及使用 Pull Request(PR)来进行合并。以下是一些基本的步骤,以帮助你手动解决冲突: 创建 Pull Request: 在 GitHub 仓库页面,切换到你的分支。 点击 “Pull Requests” 选…

可计算理论的优点及缺陷

可计算理论对计算机科学的发展和理论基础起到了重要的作用,它提供了计算问题可解性和不可解性的理论依据,并且对计算机算法的设计和性能分析有着重要的指导作用。同时,可计算理论也与形式语言、自动机理论、复杂性理论等其他计算科学领域有着…

关于steam游戏搬砖,想给大家的几点忠告

关于CSGO游戏搬砖,想给大家的几点忠告: 1、新出的箱子,里面开出的皮肤短时间内会溢价,价格虚高,后期会呈逐渐下跌趋势,这就是我们不让大家碰新品的原因,哪怕利润再高也不建议购入或者囤货&…

Linux Mii management/mdio子系统分析之五 PHY状态机分析及其与net_device的关联

(转载)原文链接:https://blog.csdn.net/u014044624/article/details/123303714 前面几章基本上完成了mdio模块驱动模型的分析,本篇文章主要讲述phy device的状态机以及phy device与net_device的关联。Phy device主要是对phy的抽象…

【Android开发】移动程序设计复习大纲

《移动程序设计》复习大纲 考试题型和分值: 一、判断题(共10小题,每题1分,共10分) 二、单选题(共10小题,每题1分,共10分) 三、填空题(共10小题,每空1分,共…

C语言:自定义类型——结构体

一、什么叫做结构体 C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 …

SMD NTC Thermistor NTC热敏电阻产品基本参数定义

热敏电阻器(Thermistor)是一种电阻值对温度极为灵敏的半导体元件,温度系数可分为Positive Temperature Coefficient 正温度系数热敏电阻又称PTC热敏电阻和Negative Temperature Coefficient 负温度系数热敏电阻又称NTC热敏电阻. NTC热敏电…

Seata分布式事务

文章目录 Seata分布式事务1.分布式事务问题1.1.本地事务1.2.分布式事务 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.2.1.下载3.2.2.解压3.2.3.修改配置3.2.4.在…

【JVM】常用命令

一、前言 Java虚拟机(JVM)是Java程序运行的基础设施,它负责将Java字节码转换为本地机器代码并执行。在开发过程中,我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令:jps、jstat…

Linux平台建立GB28181设备模拟器

目录 下载模拟器解决动态库缺少问题运行模拟器抓包参考资料 在没有GB28181摄像机的情况下,在Linux虚拟机中模拟出一台GB28181摄像机用于调试和学习. 下载模拟器 到网站下载Linux 平台版本: https://www.happytimesoft.com/download.html tar -zxvf happytime-gb28181-device…

Shell面试题总结

记录一下,面试背问到的shell的相关面试题。 1.shell中的加法实现方式 这里写三种方式拿53举例 result$((53)) resultexpr 53 resultecho 53 |bc2.shell判断文件是否存在的方式 也是三种 使用test命令 if test -f 文件路径;thenecho "文件存在" else…

P3817 小A的糖果

# 小A的糖果 ## 题目描述 小 A 有 $n$ 个糖果盒,第 $i$ 个盒中有 $a_i$ 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 $x$,至少得吃掉几颗糖。 ## 输入格式 输入…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表:轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月,云服务器CVM S5实例2核2G配置280.8元一年…

创新与竞争:Facebook如何在社交媒体市场站稳脚跟

社交媒体市场一直都是激烈的竞争场地,而Facebook凭借其创新的战略一直站稳脚跟,不断引领行业潮流。本文将深入探讨Facebook是如何通过创新与竞争策略,在社交媒体市场中牢牢占据领导地位的。 多元化产品布局 Facebook并非只是一家单一产品的公…

[Java刷算法]牛客—剑指offer第一天

🧛‍♂️个人主页:杯咖啡💡进步是今天的活动,明天的保证!✨目前正在学习:SSM框架,算法刷题🙌牛客网,刷算法过面试的神级网站,用牛客你也牛。 👉免费注册和我一…

我成为开源贡献者的原因竟然是做MySql-CDC数据同步

今年下半年机缘巧合下公司决定搭建自己的数据中台,中台的建设势必少不了数据集成。首先面临的就是数据集成技术选型的问题,按照社区活跃度、数据源适配性、同步效率等要求对市面上几个成熟度较高的开源引擎进行了深度调研。 最终经过内部讨论决定用Apac…

云服务器部署Stable Diffusion Webui从0到1总结:反复重启+循环debug

文章目录 在学校服务器部署Stable Diffusion Webui(一)准备工作(二)环境配置(三)git拉取项目到本地(四)运行项目 遇到的问题:(一)使用git clone时…