ad

《零基础Python 从入门到精通》_让你学得轻松_16.4 UDP编程

admin 143 2023-10-25

【摘要】 本书摘自《零基础Python 从入门到精通》一书中第16章,第4节,编者是壹零快学。

16.4 UDP编程

上一节介绍了TCP编程,TCP用于建立可靠连接, 消息接收后需要返回ACK确认消息(不需要我们手动编程返回消息,因为系统底层的TCP协议实现已经帮我们自动完成了这些操作)。

与TCP编程相比,UDP编程则是面向无连接的协议,发出的消息并不需要对方确认。TCP就好比打电话的过程,需要先拨通对方的电话,等待对方应答才能相互交流;UDP就好比发送信件,无论对方能否收到,我们都能发送数据,并且也不需要对方的应答。

《零基础Python 从入门到精通》_让你学得轻松_16.4 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小时内删除侵权内容。

上一篇:《智能制造服务云平台初探》_让你更懂智能制造_7.4.3 企业大数据应用服务系统
下一篇:阅读《时空大数据与云平台 理论篇》_走进云的世界_1.1 共享世界的认知
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×