网络编程(part10)--socket套接字编程之UDP套接字

网友投稿 278 2022-11-18

网络编程(part10)--socket套接字编程之UDP套接字

鄙人学习笔记

文章目录

​​UDP套接字编程​​

​​服务端流程​​

​​举个例子​​

​​客户端流程​​

​​举个例子​​

​​TCP套接字和UDP套接字编程区别​​

UDP套接字编程

服务端流程

创建数据报套接字

sockfd = socket(AF_INET,SOCK_DGRAM)

绑定地址

sockfd.bind(addr)

备注:作为服务端,必然要绑定地址的。

消息收发

data,addr = sockfd.recvfrom(buffersize)

功能: 接收UDP消息参数: 每次最多接收多少字节返回值: data 接收到的内容 addr 消息发送方地址

n = sockfd.sendto(data,addr)

功能: 发送UDP消息参数: data 发送的内容 bytes格式 addr 目标地址返回值:发送的字节数备注:由于UDP没有创建连接,所以没有一个专门的连接套接字对象(一发送就知道发送给谁),所以我们需要指明目标地址。

备注:UDP不需要创建连接。

关闭套接字

sockfd.close()

举个例子

代码:

from socket import *#创建数据报套接字sockfd = socket(AF_INET, SOCK_DGRAM)#绑定地址server_addr = ('127.0.0.1',8888)sockfd.bind(server_addr)#收发消息while True: data,addr = sockfd.recvfrom(1024) print("收到的消息:",data.decode()) sockfd.sendto(b"Thanks",addr)#关闭套接字sockfd.close()

客户端流程

创建数据报套接字收发消息关闭套接字

备注:依然要注意,客户端与服务端的收发顺序。若服务端先收后发,则客户端先发后收。

举个例子

运行客户端,并发送消息:

备注:由于是UDP协议,所以相当”自由”,可以同时接收多个客户端发来的消息。在这里就不演示了。

这里,我们再更改一下服务端的recvfrom的参数,来控制一下每次最多能接收的字节数(客户端代码不变)。

服务端代码:

得到5个字节。

咦?这是咋回事?咋和TCP的不太一样? …好吧,第一次发送的【hello world】的后面的【 world】丢失了。这是提供不可靠传输服务的体现。但这个是合理的,比如,客户端A和客户端B都向服务端send()消息,UDP协议的不可靠传输虽然可能会丢失消息,但不会使客户端A发送过来的消息,显示在客户端B发送的消息里面。这样,宁愿丢失消息,也不能导致混乱。 所以,UDP套接字传输中,如果一次接收消息接收不完(超过最多能接收的字节数),则会把剩下的消息(超过指定字节数的部分)丢弃。

同时,UDP数据传输是不存在粘包的问题,因为它存在消息边界。就像我们之前形容的那样,TCP传输是水流,UDP传输是水瓶。UDP传输,是一个一个”数据报”传输的,它的消息之间是存在边界的。

TCP套接字和UDP套接字编程区别

①流式套接字是以字节流方式传输数据;数据报套接字以数据报形式传输 ②TCP套接字会有粘包;UDP套接字有消息边界,不会粘包 ③TCP套接字保证消息的完整性;UDP套接字则不能 ④TCP套接字依赖listen、accept建立连接才能收发消息;UDP套接字则不需要 ⑤TCP套接字使用send、recv收发消息;UDP套接字使用sendto、recvfrom

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:在SpringBoot中使用lombok的注意事项
下一篇:X470主板搭配三代锐龙实测 是否会有性能上的损失
相关文章

 发表评论

暂时没有评论,来抢沙发吧~