~~网络编程(八):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来说的优缺点
下一部分就是并发编程了,有兴趣的继续关注我吧!
*本part结束*
*写几个番外*
~~网络编程(八):UDP~~的更多相关文章
- 不为人知的网络编程(八):从数据传输层深度解密HTTP
1.引言 在文章<理论联系实际:Wireshark抓包分析TCP 3次握手.4次挥手过程>中,我们学会了用wireshark来分析TCP的“三次握手,四次挥手”,非常好用.这就是传说中的锤 ...
- 网络编程 单纯UDP通信
网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...
- java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)
java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...
- java 网络编程-tcp/udp
--转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...
- 网络编程(UDP协议-聊天程序)
网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...
- Linux网络编程:UDP Socket编程范例
TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...
- Java入门网络编程-使用UDP通信
程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...
- 32.网络编程TCP/UDP服务
网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...
- Linux 网络编程八(epoll应用--大并发处理)
//头文件 pub.h #ifndef _vsucess #define _vsucess #ifdef __cplusplus extern "C" { #endif //服务器 ...
随机推荐
- Selenium+java - Edge浏览器启动
写在前面 随着win10系统的普及,使得Edge浏览器得到广泛使用.从自动化角度看,自然微软也一直不断提供着支持服务,系统版本更新,对应的Edge浏览器版本也在更新,当然对应的驱动版本也会发生变化. ...
- 入门大数据---Spark累加器与广播变量
一.简介 在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景: ...
- app自动化测试环境配置:adb环境配置、monkey环境配置、appium环境配置大全
1. 安装jdk 2. 安装配置Andriod sdk 安装Andriod sdk前首先需要安装配置好jdk环境. 然后安装Android sdk 安装完成后需要配置环境变量:ANDROID_HOME ...
- 堆、栈、数据区、bss、代码段
一个程序的运行是需要内存的,那么我们平常写的程序的内存都是怎么分配的呢 (1)首先我们要知道,内存是真实存在的,内存是一个物理器件.它时由操作系统管理的,我们平常只要使用它就行了,为了方便管理.操作系 ...
- Docker入门——理解Docker的核心概念
1 前言 相信不少人听过这么一句话: 人类的本质是复读机. 在软件开发领域也一样,我们总是想寻找更好地方式复制优秀的逻辑或系统.最核心的方法是抽取通用逻辑和组件,把差异化的东西接口化或配置化,达到复用 ...
- 华为云—环境安装(jdk安装,tomcat安装)
前言 在前面咱们讲到华为云的购买以及一些配置,通过上一文即可获得一个可以直接访问使用的云服务器.但是对于不同的人群服务器的使用用途可能不同,对于咱们大部分的java程序员来说,jdk.tomcat.m ...
- 前端工程化的的理解,浅谈web工程化的开发流程
1. 什么是前端工程化 自有前端工程师这个称谓以来,前端的发展可谓是日新月异.相比较已经非常成熟的其他领域,前端虽是后起之秀,但其野蛮生长是其他领域不能比的.虽然前端技术飞快发展,但是前端整体的工程生 ...
- 关于gulp复制文件时把整个目录结构都复制的问题解决
有这么个场景,在开发时分模块开发,但是发布时不一定将按模块分布,比如,为了便于开发,图片是按照模块存放的,但是发布时只是放在images文件夹下,此时就需要用到本文中提到的插件gulp-flatten ...
- BZOJ 1294 围豆豆 题解
题目 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧. 游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值Vi.游 ...
- WPF 最基本的前后台代码对照
最基本的3D代码对照 xaml代码 <Viewport3D> <Viewport3D.Camera> <PerspectiveCamera Position=" ...