进击の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~~的更多相关文章

  1. 不为人知的网络编程(八):从数据传输层深度解密HTTP

    1.引言 在文章<理论联系实际:Wireshark抓包分析TCP 3次握手.4次挥手过程>中,我们学会了用wireshark来分析TCP的“三次握手,四次挥手”,非常好用.这就是传说中的锤 ...

  2. 网络编程 单纯UDP通信

    网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...

  3. java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式)

    java:网络编程(UDP (DatagramSocket和DatagramPacket)正则表达式) * TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠* UDP:用户数据报协议,类似 ...

  4. java 网络编程-tcp/udp

    --转自:http://blog.csdn.net/nyzhl/article/details/1705039 直接把代码写在这里,解释看这里吧:http://blog.csdn.net/nyzhl/ ...

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

    网络编程中的UDP协议中聊天程序,发送端口,和接受端口. 发送端口(Send): <span style="font-size:18px;">package cn.it ...

  6. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  7. Linux网络编程:UDP Socket编程范例

    TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...

  8. Java入门网络编程-使用UDP通信

    程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...

  9. 32.网络编程TCP/UDP服务

    网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...

  10. Linux 网络编程八(epoll应用--大并发处理)

    //头文件 pub.h #ifndef _vsucess #define _vsucess #ifdef __cplusplus extern "C" { #endif //服务器 ...

随机推荐

  1. 在Github上建立自己的个人主页

    目录 注册Github账号 登录Github账号 建立新仓库 选择个人主页的主题 注册Github账号 首先打开Github的主页(https://github.com/),点击右上角的sign up ...

  2. Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Apollo

    在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中.同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能 ...

  3. 一个很酷炫也挺实用的JS库leader-line

    简单粗暴,直入主题,看看效果再说. 是不是这效果挺棒?这样的效果在做系统时,可以有很多的应用,可以让枯燥的页面生动起来. 具体效果,大家可以上这个搜索网站Mag[i]上面看,切身体会一下. 这是一个开 ...

  4. scala数据结构(一)

    一.概述 1,特点 )Scala同时支持不可变集合和可变集合 )两个主要的包: 不可变集合:scala.collection.immutable 可变集合: scala.collection.muta ...

  5. AI 开发路漫漫,什么才是真正的极客精神?

    摘要:AI开发看上去很美,实践起来却不是一件容易的事.一个聪明的开发者知道借助工具提升开发效率,一个智能的平台则会站在开发者的立场,为用户提供贴心服务. 前言 “理想很丰满,现实很骨感.”如果用一句话 ...

  6. 你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?

    聊一聊Spring是怎么将AOP应用到Bean的生命周期中的? 本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spr ...

  7. c语言学习笔记第三章———数据和C

    B站有视频演示 本章将会讲解c语言的数据定义和使用,您将会了解int.float.double.char的含义,了解命名的规则,对c语言会有更加深刻的认识. 变量命名: 我们先讲上次视频没讲的变量命名 ...

  8. Chrome浏览器获取XPATH的方法----通过开发者工具获取

    chrome有自己的开发者工具,可以用这儿来直接获取xpath,都不用担心正确性了. 具体使用步骤如下: 1.在chrome浏览器的右上角有个选择菜单,也就是这个,点一下: 2.在列表最后面有个“更多 ...

  9. MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询

    1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...

  10. java 面向对象(四十三):反射(七)反射应用四:动态代理

    1.代理模式的原理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象.任何对原始对象的调用都要通过代理.代理对象决定是否以及何时将方法调用转到原始对象上. 2.静态代理2.1 举例:实现Ru ...