UDP协议

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

服务端

'''
UDP 协议 又称 数据报协议 SOCK_DGRAM '''
from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket. server = socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8080)) # IP和端口 要绑定 服务端固定的IP端口
# server.listen() # 不需要 挂起的链接数 udp 没连接 # server.accept() # 不需要 因为udp就没连接
# while True:
# conn,addr = server.accept() # 干连接循环的活 while True:
data,client_addr = server.recvfrom(1024)
print('客户端数据:',data) # 我要知道谁给我发的
'''
(b'data', ('127.0.0.1', 51182))
(b'hello', ('127.0.0.1', 51182))
'''
server.sendto(data.upper(),client_addr) server.close()

客户端

'''
udp 可以发空 数据报协议 说是发空,其实不是空 ,还有一个IP 端口的信息,发空时 带个端口信息
tcp:不是一一对应的
udp:是一一对应的 数据报 完整的
'''
from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket. client = socket(AF_INET,SOCK_DGRAM)
# server.bind('127.0.0.1',8080) # IP和端口 要绑定 服务端固定的IP端口
# server.listen() # 不需要 挂起的链接数 udp 没连接 # server.accept() # 不需要 因为udp就没连接
# while True:
# conn,addr = server.accept() # 干连接循环的活 while True:
msg = input('>>>:').strip() # udp 可以发空 收到一个空
# if not msg:continue
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080)) # 明确的指定发给谁 因为没有连接了 data,server_addr = client.recvfrom(1024)
print('服务端返回的数据:',data,'服务端的地址:',server_addr)
server.close()

不会粘包的UDP

服务端

# -*- coding:utf-8 -*-
'''
UDP 协议 又称 数据报协议 SOCK_DGRAM
sendto recvfrom 一一对应 数据报协议 没有粘包问题 udp 数据不安全 有可能发送数据 > 1024 或者网络异常 数据没了
tcp: 数据一定要可靠
远程执行命令
下载文件
udp协议:
QQ
查询操作eg:互联网上 查询时间 ntp时间服务器 udp协议 eg:查域名 转成ip 端口 dns服务器走的就是udp协议 能保证查询效率高 数据虽然不可靠
ntp时间服务器 dns服务器 qq 都是udp
'''
# from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
#
# server = socket(AF_INET,SOCK_DGRAM)
# server.bind(('127.0.0.1',8080)) # IP和端口 要绑定 服务端固定的IP端口
#
# res1 = server.recvfrom(1024)
# print('第一次:',res1)
# res2 = server.recvfrom(1024)
# print('第二次:',res2) from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket. server = socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8080)) # IP和端口 要绑定 服务端固定的IP端口 res1 = server.recvfrom(4)
print('第一次:',res1)
res2 = server.recvfrom(1024)
print('第二次:',res2)

客户端:

'''
udp 可以发空 数据报协议 说是发空,其实不是空 ,还有一个IP 端口的信息,发空时 带个端口信息
tcp:不是一一对应的
udp:是一一对应的 数据报 完整的额
'''
# from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
#
# client = socket(AF_INET,SOCK_DGRAM)
#
# client.sendto(b'hello',('127.0.0.1',8080))
# client.sendto(b'world',('127.0.0.1',8080))
# client.close() from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket. client = socket(AF_INET,SOCK_DGRAM) client.sendto(b'hello',('127.0.0.1',8080))
client.sendto(b'world',('127.0.0.1',8080))
client.close()

TCP VS UDP

tcp基于链接通信

  • 基于链接,则需要listen(backlog),指定连接池的大小
  • 基于链接,必须先运行的服务端,然后客户端发起链接请求
  • 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
  • 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)
  • 流式协议  会粘包  不可以发空 send recv 不是 一 一对应
  • tcp适用于:
    • 数据一定要可靠
    • 远程执行命令
    • 下载文件

udp无链接

  • 无链接,因而无需listen(backlog),更加没有什么连接池之说了
  • 无链接,udp的sendto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
  • recvfrom收的数据小于sendto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
  • 只有sendto发送数据没有recvfrom收数据,数据丢失
  • 数据报协议  不会粘包 可以发空 sendto recvfrom 一 一 对应  数据报协议  数据不安全 有可能发送数据 > 1024 或者网络网络异常 数据没了
  • udp适用于
    • QQ
    • 查询操作  eg: ntp时间服务器  dns服务器(查域名,转ip)  能保证查询效率高,数据虽然不可靠 

-------------------------------------------------------------

考核:

socket 通信 server client
定义一个学生类
元类? 使用元类定义一个对象
粘包
3次握手

封装 继承 多态

面向对象编程(UDP协议)的更多相关文章

  1. 网络编程 - UDP协议

    UDP协议 服务端 ''' UDP 协议 又称 数据报协议 SOCK_DGRAM ''' from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 ...

  2. 网络编程——UDP协议和通信

    第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...

  3. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

  4. Java网络编程(UDP协议:接收端)

    package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...

  5. Java网络编程(UDP协议:发送端)

    package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...

  6. 网络Socket编程UDP协议例子

    服务端代码 public class UDPChatServer { //通讯端口 private Integer port=8000; //数据报文的通讯通道对象 private DatagramC ...

  7. Java网络编程(UDP协议-聊天程序)

    接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...

  8. udp协议基础(转自疯狂java讲义)

    第17章  网络编程 17.4  基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...

  9. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

随机推荐

  1. 元旦在家撸了两天Seata源码,你们是咋度过的呢?

    撸Seata源码 2020年12月31日晚23点30分,我发了2020年的最后一个朋友圈:假期吃透Seata源码,有组队的吗? 不少小伙伴都来点赞了, 其中也包括Seata项目的发起人--季敏大佬哦! ...

  2. 网易163 docker镜像

    $ sudo echo "DOCKER_OPTS=\"--registry-mirror=http://hub-mirror.c.163.com\"" > ...

  3. Java 初中级程序员如何快速成长???

    Java 技术学习路线 Java 语言是一门非常流行和重要的语言,目前仍是需求量很大的语言,应用范围很广的语言,在企业级开发.移动开发.大数据云计算.人工智能等领域都有大量的应用. 怎么样学习好 Ja ...

  4. spark的 structStreaming 一些介绍

    转发 https://www.toutiao.com/a6696339998905467403/?tt_from=mobile_qq&utm_campaign=client_share& ...

  5. 总结(2019CSP之后),含题解

    从\(\mathcal{CSP}\) 爆炸 到现在,已经有\(3\)个月了.这三个月间,我--这个小蒟蒻又接触了许多听不懂的东西 \(\mathcal{No.}1\) 字符串\(\mathcal{ha ...

  6. [Skill] 记一次vue项目热更新失败案例

    病因 修改文件后无法更新界面,感觉留白,没有更新 解决过程 发现问题,第一步搜索别人是怎么解决的 搜索一阵后,发现大部分都是留言路径问题,基本都是组件文件夹大写导致 修改测试后发现问题依旧 然后仔细观 ...

  7. 记一次多事件绑定中自己给自己设置的坑——click,dblclick,mousedown,mousemove,mouseup

    目录 项目综述 需求 问题 猜想 解决 反思 项目综述 在页面中模拟某操作系统的操作界面,提供应用窗口的最大化.最小化.还原等功能 需求 对一个应用窗口标题栏双击使其铺满整个视口,再次双击还原到原来大 ...

  8. NOIP初赛篇——01计算机常识

    发展历史 年代划分 代别 年代 逻辑(电子)元件 第一代 1946-1958 电子管 第二代 1959-1964 晶体管 第三代 1965-1970 集成电路 第四代 1971-至今 大规模.超大规模 ...

  9. WPF + RDLC + 动态生成列 + 表头合并

    如下,评论超过20条,马上发代码*(੭*ˊᵕˋ)੭*ଘ,效果如下: 代码逻辑简单. WPF使用RDLC需要使用如下DLL 新建WPF 窗体,黏贴下大概如下 <Window xmlns:rv=&q ...

  10. PHP 爬取图片 保存本地

    public function getImage($url,$filename='') { if($url == ''){ return false; } if($filename == ''){ $ ...