网络编程 - UDP协议
UDP协议
服务端
'''
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协议:
查询操作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适用于
- 查询操作 eg: ntp时间服务器 dns服务器(查域名,转ip) 能保证查询效率高,数据虽然不可靠
-------------------------------------------------------------
考核:
socket 通信 server client
定义一个学生类
元类? 使用元类定义一个对象
粘包
3次握手 封装 继承 多态
网络编程 - UDP协议的更多相关文章
- 网络编程——UDP协议和通信
第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
- Java网络编程(UDP协议:接收端)
package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...
- Java网络编程(UDP协议:发送端)
package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...
- Java网络编程(UDP协议-聊天程序)
接收端: package WebProgramingDemo; import java.net.DatagramPacket; import java.net.DatagramSocket; publ ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- Socket网络编程-UDP编程
Socket网络编程-UDP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.UDP编程概述 1>.UDP服务端编程流程 创建socket对象.socket.SOCK_ ...
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- c/c++ 网络编程 UDP 设定MTU
网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...
随机推荐
- 用C语言(apue)实现 把时间戳转换为国标格式的字符串(2017-07-17 22:36:12)的函数
/*******************************************************************************/ /** *** 函 数 名: cha ...
- PyCharm 在django程序中单独运行py文件
使用PyCharm开发django程序,发现如果不在命令行而在IDE的django项目中直接运行django程序,发现报错,程序如下: def main(): from people.models ...
- python模块之codecs: 自然语言编码转换
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理. 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部 ...
- 跟着百度学习之ThinkPHP的认识/初窥
MVC全称(Model View Controller) Model:模型(可以理解位数据库操作模型) View:视图(视图显示) Controller:(控制器) 简单的说框架就是一个类的集合.集合 ...
- lua工具库penlight--08额外的库(一)
额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时 ...
- ADO.NET数据库应用开发_ExtendedProperties属性
7.5.5 ExtendedProperties属性 ExtendedProperties属性用来获取存储自定义属性的集合.可以在该属性中增加附加的存储信息.它的扩展属性必须是字符串类型.当以XML的 ...
- const成员或者引用成员必须使用构造函数初始化列表的方式
#include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2 ...
- eclipse 编译tomcat8.0.26的源码
第一次写东西, 如果有不对的地方,请大神指正,我会尽快修正…… 参考:http://www.cnblogs.com/lanxuezaipiao/p/3640923.html 1.从tomcat官网(h ...
- ardunio I2C
I2C总线定义I2C(‘intel’ -Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备.在主从通信中,可以有多个I2C总线器件同 ...
- keep learning
fueling people’s creativity 助长了人们的创造力,燃烧了人们的激情