Python数据分析与可视化:实战案例解析
143
2023-10-25
【摘要】 本书摘自《零基础Python 从入门到精通》一书中第16章,第4节,编者是壹零快学。
16.4 UDP编程
上一节介绍了TCP编程,TCP用于建立可靠连接, 消息接收后需要返回ACK确认消息(不需要我们手动编程返回消息,因为系统底层的TCP协议实现已经帮我们自动完成了这些操作)。
与TCP编程相比,UDP编程则是面向无连接的协议,发出的消息并不需要对方确认。TCP就好比打电话的过程,需要先拨通对方的电话,等待对方应答才能相互交流;UDP就好比发送信件,无论对方能否收到,我们都能发送数据,并且也不需要对方的应答。
相对于TCP协议,UDP协议的优势就是速度快,因为UDP传输数据不需要对方确认,但这一点 是不可靠的。对于可靠性不是十分敏感的数据,可以使用UDP协议,例如直播视频、系统日志等等。本节将会介绍UDP协议的网络编程。
和TCP编程十分类似,UDP通信也分为客户端和服务端。
服务器端首先需要创建socket对象,然后绑定端口。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 2019))
创建的socket对象几乎和TCP编程一样,只是需要把socket.SOCK_STREAM替换成socket.SOCK_
DGRAM就可以了。
之后UDP服务端不需要调用listen方法,直接调用recvfrom来接收客户端的数据即可。
动手写16.4.2
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 2019))
while True:
data, address = sock.recvfrom(1024)
print("收到来自 {}:{} 的信息".format(address [0], address [1]))
print(data.decode("utf-8"))
UDP实现的服务端十分简洁,和服务端对应的客户端也很简洁。
动手写16.4.3
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server = ("127.0.0.1", 2019)
sock.sendto("零壹快学".encode("utf-8"), server)
sock.close()
016.5 urllib模块
前面两小节分别介绍了基本的TCP编程和UDP编程。我们日常的网络使用离不开TCP和UDP 协议,有许多常见的应用层协议都基于此,例如平时访问网站使用的HTTP协议就是基于TCP协议 的。然而如果每次编写一个HTTP客户端都要使用socket库去实现HTTP协议,这个过程相当烦琐和 复杂,而且还容易犯错,幸好Python标准库中提供了urllib模块。urllib模块的功能十分强大,它不 仅提供了HTTP网络通信的功能,还提供了许多和HTTP协议相关的数据处理函数等。通过urllib模块可以很方便地实现一个HTTP客户端。
由于篇幅有限,本节主要介绍urllib模块实现HTTP请求中使用到的GET操作和POST操作。
16.5.1 GET请求
GET请求是HTTP协议中最基本、最常见的操作,我们在浏览器中直接输入网址访问网站就是 一个最常见的GET请求操作。这里以打开百度为例。
动手写16.5.1
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from urllib import request
# 抓取百度
def fetch_baidu():
http_client = request.urlopen("http://www.baidu.com")
content = http_client.read()
print("HTTP Status: {}, {}".format(http_client.status, http_client.reason))
print("HTTP Resoponse headers:")
fork,v in http_client.getheaders():
print("{}: {}".format(k, v))
# 也可以使用 with request.urlopen("http://www.baidu.com") as f的表达式省略close http_client.close()
# 收到的数据需要转码
return content.decode("utf-8")
def save_page(content):
with open("baidu.html", "w", encoding="utf-8") as f:
f.write(content)
def main():
content = fetch_baidu()
save_page(content)
if__name__ == "__main__":
main()
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~