网络编程(四)--基于udp协议的套接字、socketserver模块

本文详细介绍了UDP协议的基本概念、特点及其实现方式,并通过实例展示了基于UDP协议的套接字编程,包括服务端与客户端的交互过程。此外还介绍了如何使用socketserver模块实现基于UDP协议的并发操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、UDP协议(数据报协议)

1、何为udp协议

不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

以太网头ip头                     udp头                           数据                                           

 

2、udp协议的特点

(1)传输数据以数据报的形式传送。因为数据以数据包的形式发送,所以没发送一次就会接收一次

from socket import *

server=socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8081))

print(server.recvfrom(1024))
print(server.recvfrom(1024))
print(server.recvfrom(1024))

# (b'hello', ('127.0.0.1', 56816))
# (b'world', ('127.0.0.1', 56816))
# (b'sdfas', ('127.0.0.1', 56816))
服务端
from socket import *

client=socket(AF_INET,SOCK_DGRAM)

client.sendto(b'hello',('127.0.0.1',8888))
client.sendto(b'world',('127.0.0.1',8888))
client.sendto(b'sdfas',('127.0.0.1',8888))
客户端

二、基于udp协议的套接字

udp是无链接的,先启动哪一端都不会报错

from socket import *

# 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM)

# 2.绑定服务器IP地址和端口号
server.bind(('127.0.0.1', 8888))

# 3.收发消息
while True:
    data, cli_addr = server.recvfrom(1024)              # 收到的是数据和客户端地址
    print(data)
    server.sendto(data.upper(), cli_addr)           # 发送消息,根据客户端地址发送消息

server.close()
服务端
from socket import *

# 1.创建套接字对象
server = socket(AF_INET, SOCK_DGRAM)

# 2.发收消息
while True:
    client.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8888))       # 根据地址发送消息
    data, ser_addr = client.recvfrom(1024)                   # 收消息,获得服务端的消息和地址
    print(data)
客户端

三、socketserver模块

1、作用

利用socketserver模块可以实现并发

2、基于TCP协议的并发

自定义类中:

  1. self.request  即一个套接字对象
  2. self.client_address  即客户端地址
# 服务端
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:   # 通信循环
            try:
                data = self.request.recv(1024)
                print(data.decode('utf-8'))
                self.request.send(data.upper())
            except ConnectionResetError:
                break

if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MyTCPHandler)
    server.serve_forever()   # 链接循环
# 客户端
from socket import *

cli_socket = socket(AF_INET, SOCK_STREAM)

cli_socket.connect(('127.0.0.1', 8888))

while True:
    cli_socket.send('hello'.encode('utf-8'))
    data = cli_socket.recv(1024)
    print(data.decode('utf-8'))

cli_socket.close()

3、基于UDP协议的并发

自定义类中:

  1. self.request是一个元组(第一个元素是客户端发来的数据,第二部分是服务端的udp套接字对象),如(b'adsf', <socket.socket fd=200, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
  2. self.client_address即客户端地址
# 服务端
import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        while True:  # 通信循环
            print(self.request) # (b'hello', <socket.socket fd=216, family=AddressFamily.AF_INET, 
type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8888)>)
data, sock = self.request sock.sendto(data.upper(), self.client_address) if __name__ == '__main__': server = socketserver.ThreadingUDPServer(('127.0.0.1', 8888), MyUDPHandler) server.serve_forever() # 链接循环
#客户端
from socket import *

cli_socket = socket(AF_INET, SOCK_STREAM)

while True:
    cli_socket.sendto('hello'.encode('utf-8'), ('127.0.0.1', 8888))
    data, server_addr = cli_socket.recvfrom(1024)
    print(data.decode('utf-8'))

cli_socket.close()

 

转载于:https://www.cnblogs.com/zhangbingsheng/p/10458283.html

内容概要:本文深入探讨了金属氢化物(MH)储氢系统在燃料电池汽车中的应用,通过建立吸收/释放氢气的动态模型和热交换模型,结合实验测试分析了不同反应条件下的性能表现。研究表明,低温环境有利于氢气吸收,高温则促进氢气释放;提高氢气流速和降低储氢材料体积分数能提升系统效率。论文还详细介绍了换热系统结构、动态性能数学模型、吸放氢特性仿真分析、热交换系统优化设计、系统控制策略优化以及工程验证与误差分析。此外,通过三维动态建模、换热结构对比分析、系统级性能优化等手段,进一步验证了金属氢化物储氢系统的关键性能特征,并提出了具体的优化设计方案。 适用人群:从事氢能技术研发的科研人员、工程师及相关领域的研究生。 使用场景及目标:①为储氢罐热管理设计提供理论依据;②推动车载储氢技术的发展;③为金属氢化物储氢系统的工程应用提供量化依据;④优化储氢系统的操作参数和结构设计。 其他说明:该研究不仅通过建模仿真全面验证了论文实验结论,还提出了具体的操作参数优化建议,如吸氢阶段维持25-30°C,氢气流速0.012g/s;放氢阶段快速升温至70-75°C,水速18-20g/min。同时,文章还强调了安全考虑,如最高工作压力限制在5bar以下,温度传感器冗余设计等。未来的研究方向包括多尺度建模、新型换热结构和智能控制等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值