~~网络编程(八):UDP~~
进击のpython
网络编程——UDP
那现在看到这里的
这就是网络编程的最后一讲了
上面讲的都是关于TCP的编程方法
还记得TCP和UDP传输的区别吗?
UDP简单就简单到它可以不借助管道来进行数据的传输
那要怎那么通过套接字方法来进行UDP方式的信息传输呢?
老规矩,信息收发创建两个py文件,服务端和客户端
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
还记得这句话在TCP怎么写的吧
在这里数据传输方式用的是“数据报模式”,所以UDP协议也叫数据报协议
(phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM))
在这就要讲了,流式协议是不是有粘包现象啊
不好意思熬,在UDP这根本就没有这个现象
我们发现这个socket.socket每次都写很麻烦
所以我们可以在开始导入模块的时候这么写
form socket import *
虽然说不建议用*来导入模块,但是由于我们要使用的方法太多了
所以说,就可以对这个模块全部导入
所以上面的方法就可以写成
server = socket(socket.AF_INET,socket.SOCK_DGRAM)
那什么绑定端口,绑定IP,是不是都需要?
server.bind(("127.0.0.1", 8080))
那需不需要监听呢?server.listen(5)
我这是UDP,有链接嘛?是不是没有?所以不需要监听
那需不需要server.accept()呢?
还是这句话,accept是为了链接才使用的,我UDP没有链接,所以也不要
那没有链接,是不是不需要链接循环了啊
那通信循环是不是还应该要啊
在UDP中,收消息叫 recvfrom() 发消息用 sendto()
while 1:
data = server.recvfrom(1024)
print(data)
server.close()
那服务端就写完了
接下来就是客户端了
客户端需不需要绑定IP? 当然不需要!
客户端需不需要建立管道?当然不需要!
那我能不能发送空呢?
对于TCP来说是不能的,那看看UDP呢
msg = input(">>>")
client.sendto(msg.encode("utrf-8"),("127.0.0.1", 8080))
sendto接收两个参数,第一个是你发送的信息,第二个是你要发给的ip和端口号的元组形式
那,客户端和服务端就写完了
# 客户端
from socket import *
client = socket(AF_INET, SOCK_DGRAM)
while 1:
msg = input(">>>")
client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080))
client.close()
# 服务端
from socket import *
server = socket(AF_INET, SOCK_DGRAM)
server.bind(("127.0.0.1", 8080))
while 1:
data = server.recvfrom(1024)
print(data)
server.close()
# 客户端
>>>haha
>>>dawdadwad
>>>fdafwa
# 服务端
(b'haha', ('127.0.0.1', 63671))
(b'dawdadwad', ('127.0.0.1', 63671))
(b'fdafwa', ('127.0.0.1', 63671))
然后我发现,我的data接收的是一个元组形式
前面的是发送的内容,后面的是客户端的ip和端口
我要内容我能理解,那我为啥还要他的ip和端口啊?
很简单,因为我得知道这个数据是谁给我发的啊,然后我好回啊
那就完成了服务端与客户端的交互了
data,client_addr = server.recvfrom(1024)
server.sendto(data.upper(),client_addr)
解决上面提出的问题,当我发空的时候,也是可以运行的,所以不用考虑空的问题
而且,因为他是数据报协议,每次发的时候其实就是把所有的信息都发过来了
这样每个数据之间就不存在联系,也就没有粘包的可能性
那既然这么方便,为什么不用UDP啊
还记得我们说过他的不安全吗?
如果数据传输中经历了网络波动,那信息就没有了
而且别人也不会再给你发一遍
再一个就是,接收信息可能不会完整(你试试把recvfrom()里面的数字变成1看看效果)
所以有这两种的不稳定性
UDP协议传输方式就不适合下载文件或者远程命令
但是查询东西用的就是UDP协议
QQ信息传输也是UDP协议
查询要的就是快,不可靠大不了我再查一遍
但是总归来说,TCP用的还是挺多的
这一part的东西其实挺少的,大部分都是概念为主
从刚开始的五层协议,进而了解到两个协议
然后通过套接字方法搭建起应用层和传输层的桥梁
接着对TCP协议模式的信息传输进行了仔细的分析
研究出一套近乎通用的模板
最后提了一下UDP协议的使用以及相对于TCP来说的优缺点
下一部分就是并发编程了,有兴趣的继续关注我吧!
原文地址:https://www.cnblogs.com/jevious/p/11328117.html
- php随机数怎么获取?一个简单的函数就能生成
- 零基础学编程009:只显示2位小数
- .Net实现Windows服务安装完成后自动启动的两种方法
- 【教程】OpenCV—Node.js教程系列:Node.js+OpenCV面部脸识别
- 学会10多种语言是种什么样的体验?
- Spring Data 最佳实践
- Prodigy,从根本上有效的自主学习驱动的注释工具
- 零基础学编程017:画出我的公众号LOGO
- 一个实用的却被忽略的命名空间:Microsoft.VisualBasic
- Spring @RequestBody 传递 List/Map 参数
- win7怎么去除快捷方式的小箭头
- 零基础学编程015:画些有趣的图案
- Spring boot with Thymeleaf
- 零基础学编程014:小海龟做画
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Hue执行多条语句问题
- Android仿抖音列表效果
- com.android.support版本冲突解决方法
- [-Flutter趣玩篇-] 出神入化的Align+动画
- Hive Impala和Hue集成LDAP
- Android仿QQ分组实现二级菜单展示
- Android RecyclerView实现拼团倒计时列表实例代码
- 正则十八式-第一式:直捣黄龙
- 安装Grafana并使用Cloudera Manager DataSource
- Python中类变量、成员变量、局部变量的区别
- Android 友盟第三方登录与分享的实现代码
- Android实现双击返回键退出应用实现方法详解
- [- 多媒体 -] OpenGLES3.0 接入视频实现特效 - 引言
- OpenLDAP集成sssd同步用户并集成SSH登录
- 【 FlutterUnit 食用指南】 开源篇