25-3-Python网络编程-UDP 编程示例和HTTP协议
itomcoil 2025-06-12 13:19 12 浏览
3-UDP 编程示例
3-1-语法
当使用套接字应用传输层的UDP协议建立服务器与客户端程序时,整个实现过程要比使用TCP协议简单一点。
基于UDP协议的服务器与客户端在进行数据传送时,不是先建立连接,而是直接进行数据传送。
3-1-1-在socket对象中,使用方法recvfrom()接收数据
recvfrom(bufsize[,flags]) #bufsize用于指定缓冲区大小
方法recvfrom()主要用来从套接字接收数据,它可以连接UDP协议。
3-1-2-在socket对象中,使用方法sendto()发送数据
sendto (bytes, address)
参数“bytes”表示要发送的数据,参数“address”表示发送信息的目标地址,它是由目标IP地址和端口构成的元组。Sendto()方法主要用来通过UDP协议将数据发送到指定的服务器端。
3-2-示例
3-2-1-示例01
3-2-1-1-服务器端代码
UDP服务器不需要TCP服务器那么多的设置,因为它们不是面向连接的。除了等待传入的连接之外,几乎不需要做其他工作
import socket
# 创建一个 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定 IP 地址和端口号
server_address = ('localhost', 9999)
server_socket.bind(server_address)
print('服务器正在监听端口 9999...')
while True:
# 接收客户端发送的数据
data, client_address = server_socket.recvfrom(1024)
print(f'收到来自 {client_address} 的数据: {data.decode()}')
# 向客户端发送响应
response = '服务器已收到你的消息'
server_socket.sendto(response.encode(), client_address)
3-2-1-2-客户端代码
import socket
# 创建一个 UDP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址和端口
server_address = ('localhost', 9999)
# 发送数据到服务器
message = 'Hello, server!'
client_socket.sendto(message.encode(), server_address)
# 接收服务器的响应
data, server = client_socket.recvfrom(1024)
print(f'收到服务器响应: {data.decode()}')
# 关闭客户端套接字
client_socket.close()
3-2-1-3-示例分析
- 除了创建套接字并将其绑定到本地地址(主机名/端口号对)外,并没有额外的工作。无限循环包含接收客户端消息、打上时间戳并返回消息,然后回到等待另一条消息的状态。再一次,close()调用是可选的,并且由于无限循环的缘故,它并不会被调用,但它提醒我们,它应该是优雅或智能退出方案的一部分
- UDP和TCP服务器之间的另一个显著差异是,因为数据报套接字是无连接的,所以就没有为了成功通信而使一个客户端连接到一个独立的套接字“转换”的操作。这些服务器仅仅接受消息并有可能回复数据
3-2-2-示例02
3-2-2-1-服务端
import socket #导入socket模块
HOST = 'localhost' #定义变量HOST的初始值
PORT = 9999 #定义变量PORT的初始值
try:
#创建socket对象s,参数分别表示地址和协议类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT)) #将套接字与地址绑定
data = True #设置变量data的初始值
while data: #如果有数据
data,address = s.recvfrom(1024)#实现对话操作(接收/发送)
if data==b'zaijian': #当接收的数据是zaijian时
break #停止循环
print('接收信息:',data.decode('utf-8'))#显示接收到的信息
s.sendto(data,address) #发送信息
except Exception as e:
print(e)
finally:
s.close() #关闭连接
3-2-2-2-客户端
import socket #导入socket模块
HOST = 'localhost' #定义变量HOST的初始值
PORT = 9999 #定义变量PORT的初始值
try:
#创建socket对象s,参数分别表示地址和协议类型
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = "你好!" #定义变量data的初始值
while data: #如果有data数据
s.sendto(data.encode('utf-8'),(HOST,PORT))#发送数据信息
if data=='zaijian': #如果data的值是'zaijian '
break #停止循环
data,addr = s.recvfrom(512) #读取数据信息
print("从服务器接收信息:\n",data.decode('utf-8')) #显示从服务器端接收的信息
data = input('输入信息:\n') #信息输入
except Exception as e:
print(e)
finally:
s.close() #关闭连接
上述代码使用套接字以UDP连接方式建立了一个简单的客户端程序,当在客户端创建套接字后,会直接向服务器端(本机的10000端口)发送数据,而没有进行连接。当用户键入“zaijian”时退出while循环,关闭本程序。运行效果与TCP服务器与客户端实例的基本相同
4-HTTP协议开发
在计算机网络模型中,套接字编程属于底层网络协议开发的内容。虽然说编写网络程序需要从底层开始构建,但是自行处理相关协议是一件比较麻烦的事情。其实对于大多数程序员来说,最常见的网络编程开发是针对应用协议进行的。在Python程序中,使用内置的包urllib和http可以完成HTTP协议层程序的开发工作。
4-1-使用urllib包
在Python程序中,urllib包主要用于处理URL(Uniform Resource Locator,统一资源定位符)操作,使用urllib操作URL可以像使用和打开本地文件一样操作,非常简单而又易上手。在包urllib中主要包括如下所示的模块:
- urllib.request:用于打开URL网址。
- urllib.error:用于定义常见的urllib.request会引发的异常。
- urllib.parse:用于解析URL。
- urllib.robotparser:用于解析robots.txt文件。
4-1-1-语法
4-1-1-1-方法urlopen()
在urllib.request模块中,方法urlopen()的功能是打开一个URL地址,其语法格式如下所示。
urlopen (url, data, proxies)
url:表示要进行操作的URL地址。
data:用于向URL传递的数据,是一个可选参数。
proxies:表示使用的代理地址,可选参数。
方法urlopen()将返回一个HTTPResponse实例(类文件对象),可以像操作文件一样使用read()、readline()和close()等方法对URL进行操作。
方法urlopen()能够打开url所指向的URL。如果没有给定协议或者下载方案(Scheme),或者传入了“file”方案,urlopen()会打开一个本地文件。
对于所有的 HTTP 请求来说,常见的请求类型是“GET”。在这些情况中,向Web 服务器发送的请求字符串(编码过的键值对,如urlencode()函数返回的字符串)应该是url 的一部分。如果使用“POST”请求方法,请求的字符串(编码过的)应该放到postQueryData 变量中。一旦连接成功,函数urlopen()将会返回一个文件类型对象,就像在目标路径下打开了一个可读文件。例如,如果文件对象是f,那么“句柄”会支持一些读取内容的方法,
例如
f.read()、f.readline()、f.readlines()、f.close()和f.fileno()。另外,方法f.info()可以返回MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩充)头文件。这个头文件
通知浏览器返回的文件类型,以及可以用哪类应用程序打开。
例如,
浏览器本身可以查看HTML、纯文本文件,渲染PNG(Portable NetworkGraphics)文件、JPEG(Joint Photographic Experts Group)或者GIF(Graphics InterchangeFormat)文件。而其他如多媒体或特殊类型文件需要通过其他应用程序才能打开。
最后,方法geturl()在考虑了所有可能发生的重定向后,从最终打开的文件中获得真实的URL。在下面列出了urllib.urlopen()文件类型对象的常用方法。
f.read([bytes]):从f中读出所有或bytes 个字节。
f.readline():从f中读取一行。
f.readlines():从f中读出所有行,作为列表返回。
f.close():关闭f的URL 连接。
f.fileno():返回f的文件句柄。
f.info():获得f的MIME 头文件。
f.geturl():返回f的真正URL。
4-1-1-2-方法urlretrieve()
使用urllib.request模块中的方法urlretrieve()可以将URL另存为本地文件。此方法的语法格
式如下所示。
urlretrieve(url, filename, reporthook, data)
url:要保存的URL地址。
filename:指定保存的文件名,可选参数。
reporthook:回调函数,可选参数。
data:发送的数据,一般用于POST,可选参数。
除了像 urlopen()函数这样从URL中读取内容外,函数urlretrieve()可以方便地将url中的整个HTML文件下载到本地硬盘上。下载后的数据可以另存为一个localfile或者一个临时文件。如果该文件已经复制到本地或者URL指向的文件就是本地文件,就不会发生后面的下载操作。如果提供了reporthook,则在每块数据下载或传输完成后会调用这个函数。在调用时会使用3个参数:目前读入的块数、块的字节数和文件的总字节数。如果正在用文本或图表向用户显示“下载状态”信息,这个函数将会非常有用。函数urlretrieve()返回一个二元组(filename, mime_hdrs)。其中filename表示含有下载数据的本地文件名,mime_hdrs表示Web 服务器响应后返回的一系列MIME 文件头。对本地文件来说,mime_hdrs是空的。
4-1-1-3-方法urlencode()
在urllib.parse模块中,方法urlencode()的功能是对URL进行编码。此方法的语法格式如下
所示。
urlencode (query, doseq)
query:要进行编码的变量和值组成的字典;
doseq:可选参数,如果为True则将元组的值分别编码成“变量=值”的形式。
在Python程序中,函数urlencode()的功能是接收字典的键值对,并将其编译成字符串,
作为CGI 请求的URL 字符串的一部分。键值对的格式是“键=值”,以连接符(&)划分。另
外,键及其对应的值会传到quote_plus()函数中进行适当的编码。
4-1-1-4-方法quote()和方法quote_plus()
在urllib.parse模块中,方法quote()和方法quote_plus()的功能是替换字符串中的特殊字
符,使其符合URL要求使用的字符。在Python程序中,函数quote()用来获取URL 数据,并将
其编码,使其可以用于URL 字符串中。在现实应用中必须对某些不能打印的或者不被Web
服务器作为有效URL 接收的特殊字符串进行转换。这就是quote()函数的功能。这两个方法的
语法格式如下所示。
quote (string, safe=‘/’)
quote_plus (string, safe=‘’)
在Python程序中,逗号、下划线、句号、斜线和字母数字这类符号不需要转化,其他的则均需要转换。另外,在那些URL 不能使用的字符前边会添加上百分号(%),同时把它们转换成十六进制格式,例如,“%xx”,其中,“xx”表示这个字符的ASCII码的十六进制值。当调用quote*()时,字符串转换成一个可在URL 字符串中使用的等价字符串。safe 字符串可以包含一系列不能转换的字符,默认字符是斜线“/”。
4-1-1-5-方法unquote()和方法unquote_plus()
在Python程序中,unquote()方法与quote()方法的功能完全相反,前者将所有编码
为“%xx”式的字符转换成等价的ASCII 码值。在urllib.parse模块中,使用方法unquote()和方法
unquote_plus()可以将使用quote()方法和quote_plus()方法替换后的字符还原(在Python 2.x中
直接由urllib模块进行处理)。方法unquote()和方法unquote_plus()的语法格式如下所示。
unquote(string)
unquote_plus (string)
其中,参数“string”表示要进行还原的字符串。
下面的实例代码演示了使用urlopen()方法在百度搜索关键词中得到第一页链接的过程
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)