6.Twisted UDP Socket 编程示例

6.Twisted UDP Socket 编程示例

示例:客户端每隔10秒向服务端报送设备使用情况,具体数据如下:

数据

说明

值示例

CPUUsed

CPU占用情况 %

35.5%

MemTotal

总内存 MB

2048M

MemFree

可用内存 MB

1024M

MemUsed

内存占用情况 %

50%

数据以文本进行传输,传输格式:Key:Value,中间用冒号分隔。服务端只做数据的原样显示并回复”OK!”

由于 UDP 没有连接的概念,所以大多数情况下,采用 UDP Socket 实现的应用都是由设备采集数据上报到服务上来运行的。

6.1 UDP 服务端编程

虽然对于 UDP 来说没有服务端和客户端的概念,但在实际项目开发中,我们一般还是要区分服务端和客户端的。对于 UDP 服务端来说,其实代码很简单,因为其主要任务就是接收数据,然后对数据进行处理。

先来编写代码框架:

# coding: utf-8from twisted.internet import reactorfrom twisted.internet.protocol import DatagramProtocolclass Server(DatagramProtocol): def startProtocol(self): pass def datagramReceived(self, data, addr): pass def stopProtocol(self): passreactor.listenUDP(8085, Server())reactor.run()

代码中,主要实现的是 datagramReceived 事件,一般在该事件的代码中就是我们的业务逻辑,示例代码如下:

def startProtocol(self): print(‘Server start.’) def datagramReceived(self, data, addr): print(“received data from %s:%s” % (addr, data)) self.transport.write(‘OK!’.encode(‘utf-8’), addr) def stopProtocol(self): print(‘Server stop.’)

6.2 UDP 客户端编程

客户端代码相对比服务端要复杂一点,主要是客户端需要执行定时任务,这样的话,我们需要设计一个线程来执行该定时任务,由于线程中需要发送数据到服务端,所以,在线程中需要设计一个属性指向客户端的 Protocol。线程的框架代码如下:

# coding: utf-8from twisted.internet import reactorfrom twisted.internet.protocol import DatagramProtocolfrom threading import Threadimport timeimport psutilclass DataThread(Thread): def __init__(self, protocol): self.protocol = protocol self.running = True super().__init__() def run(self): self.running = True pass def stop(self): self.running = False

客户端框架代码:

class Client(DatagramProtocol): def startProtocol(self): pass def datagramReceived(self, data, addr): pass def connectionRefused(self): pass def stopProtocol(self): passclient = Client()thread = DataThread(client)thread.start()reactor.listenUDP(0, client)reactor.run()thread.stop()

线程主要通过 Protocol 发送数据,实现代码如下:

def run(self): self.running = True while True: if not self.running: break time.sleep(10) data = psutil.virtual_memory() total = ‘MemTotal:%0.2f’ % (data.total / 1024) # 总内存 print(total) if self.protocol is not None: self.protocol.transport.write(total.encode(‘utf-8’)) time.sleep(1) free = ‘MemFree:%0.2f’ % (data.available / 1024) # 可用内存 print(free) if self.protocol is not None: self.protocol.transport.write(free.encode(‘utf-8’)) time.sleep(1) memory = “MemUsed:%d” % (int(round(data.percent))) + “%” # 内存占用情况 print(memory) if self.protocol is not None: self.protocol.transport.write(memory.encode(‘utf-8’)) time.sleep(1) cpu = “CPUUsed:%0.2f” % psutil.cpu_percent(interval=1) + “%” # CPU占用情况 print(cpu) if self.protocol is not None: self.protocol.transport.write(cpu.encode(‘utf-8’))

客户端 Protocol 代码实现如下:

def startProtocol(self): host = “127.0.0.1” port = 8085 print(‘Connect to %s:%s’ % (host, port)) self.transport.connect(host, port) def datagramReceived(self, data, addr): print(“received data from %s:%s” % (addr, data)) def connectionRefused(self): print(“No one listening”) def stopProtocol(self): print(‘Stop’)

在 Protocol 启动时连接到服务器,这样就可以形成 Connected UDP,相对于 UDP 来说,数据的传输可靠性有所提高,同时,在代码中发送数据也不需要写服务端的地址。

6.3 运行效果

服务端:

Server start.received data from (‘127.0.0.1’, 56768):b’MemTotal:20880432.00’received data from (‘127.0.0.1’, 56768):b’MemFree:13308280.00’received data from (‘127.0.0.1’, 64355):b’MemTotal:20880432.00’received data from (‘127.0.0.1’, 64355):b’MemFree:13315952.00’received data from (‘127.0.0.1’, 64355):b’MemUsed:36%’received data from (‘127.0.0.1’, 64355):b’CPUUsed:1.20%’Server stop.

客户端:

Connect to 127.0.0.1:8085MemTotal:20880432.00received data from (‘127.0.0.1’, 8085):b’OK!’MemFree:13315952.00received data from (‘127.0.0.1’, 8085):b’OK!’MemUsed:36%received data from (‘127.0.0.1’, 8085):b’OK!’CPUUsed:1.20%received data from (‘127.0.0.1’, 8085):b’OK!’MemTotal:20880432.00

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年7月1日 18:40
下一篇 2022年7月1日 18:40

相关推荐

  • 短视频策划内容的3个要点(短视频策划内容怎么做)

    短视频在制作时,内容框架非常重要。如果直奔主题,然后结束,聚卓告诉你,这样的短视频已经过时了。现在的短视频需要框架的,但不是任何框架,它需要一种易于理解和消化的框架。而且,现在大多…

    2022年11月27日
  • 笔记本最好配置(目前笔记本最好的配置)

    本文主要讲的是笔记本最好配置,以及和目前笔记本最好的配置相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 笔记本电脑什么配置好? 01 CPU:这个主要取决于频率和…

    2022年11月26日
  • 北京疫情为什么突然爆发(北京疫情为什么突然增多)

    这几天北京疫情的新增情况也突然开始变得严重起来了,大家对本轮北京疫情爆发的原因也十分好奇。北京疫情为什么突然爆发?尤其是本周北京疫情的新增开始越来越多了,这让民众对于本轮疫情的发展…

    2022年11月25日
  • 为什么北京疫情越来越严重(疫情为什么越控制越严重)

    有在关注北京疫情的小伙伴应该注意到了,这几天北京疫情的新增数据情况也开始越发的严重起来,大家对北京此次疫情发展情况也都不断分析。为什么北京疫情越来越严重?导致北京本轮疫情的原因是什…

    2022年11月25日
  • 什么是推广cpa一篇文章带你看懂CPA推广渠道

    CPA渠道 CPA指的是按照指定的行为结算,可以是搜索,可以是注册,可以是激活,可以是搜索下载激活,可以是绑卡,实名认证,可以是付费,可以是浏览等等。甲乙双方可以根据自己的情况来定…

    2022年11月25日
  • 抖音直播带货有哪些方法技巧(抖音直播带货有哪些痛点)

    如今抖音这个短视频的变现能力越来越突显了,尤其是在平台上开通直播,更具有超强的带货属性,已经有越来越多的普通人加入到其中了。不过直播带货虽然很火,但是也不是每个人都能做好的,那么在…

    2022年11月24日
  • 成都健康码崩了是怎么回事(成都健康码系统崩了)

    健康码是大家出行必备的工具,有小伙伴反映自己健康码崩了,上不了地铁,那么成都健康码崩了是怎么回事?成都健康码怎么突然崩了?成都健康码崩了是怎么办?下面小编为大家带来成都健康码崩了原…

    2022年11月24日
  • cpu性能天梯图2022 AMD CPU天梯图最新排行榜出炉

    用户在DIY自己的主机时选择CPU是非常关键的,CPU可以说是电脑的大脑,大家也都想追求好一点的CPU来使用,但型号太多了,大部分的用户都不知道目前哪一款CPU比较好用,快来看看详…

    2022年11月24日
  • 明查|美国新冠后遗症患者中有16%症状严重以致无法工作?

    点击进入澎湃新闻全球事实核查平台 速览 – 网传数据比例无权威信源佐证,该比例有可能是结合了美国疾病防控中心和布鲁金斯学会的数据得出,但这两个机构的调研目的和样本都不同…

    2022年11月24日
  • 北京新增913例感染者社会面148例在哪里(北京公交913)

    近日北京疫情的新增情况也是备受关注,当地卫健委每日也都会更新最新的疫情数据情况。那么,北京新增913例感染者社会面148例在哪里?目前北京哪个区域的疫情新增是最严重的?社会面感染者…

    2022年11月23日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息