25-3-Python网络编程-UDP 编程示例和HTTP协议
ztj100 2025-05-26 20:19 10 浏览 0 评论
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()方法在百度搜索关键词中得到第一页链接的过程
相关推荐
- Spring IoC Container 原理解析
-
IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例...
- SQL注入:程序员亲手打开的潘多拉魔盒,如何彻底封印它?
-
一、现象:当你的数据库开始"说话",灾难就来了场景还原:...
- Java核心知识3:异常机制详解
-
1什么是异常异常是指程序在运行过程中发生的,由于外部问题导致的运行异常事件,如:文件找不到、网络连接失败、空指针、非法参数等。异常是一个事件,它发生在程序运行期间,且中断程序的运行。...
- MyBatis常用工具类三-使用SqlRunner操作数据库
-
MyBatis中提供了一个非常实用的、用于操作数据库的SqlRunner工具类,该类对JDBC做了很好的封装,结合SQL工具类,能够很方便地通过Java代码执行SQL语句并检索SQL执行结果。SqlR...
- 爆肝2W字梳理50道计算机网络必问面试题
-
1.说说HTTP常用的状态码及其含义?思路:这道面试题主要考察候选人,是否掌握HTTP状态码这个基础知识点。...
- SpringBoot整合Vue3实现发送邮箱验证码功能
-
1.效果演示2.思维导图...
- 最全JAVA面试题及答案(200+)
-
Java基础1.JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,Java开发工具包,提供了Java的开发环境和运行环境。JRE:JavaRunti...
- Java程序员找工作翻车现场!你的项目描述踩了这几个坑?
-
Java程序员找工作翻车现场!你的项目描述踩了这几个坑?噼里啪啦敲了三年代码,简历一投石沉大海?兄弟,问题可能出在项目描述上!知道为什么面试官看你的项目像看天书吗?因为你写了三个致命雷区:第一,把项目...
- 2020最新整理JAVA面试题附答案,包含19个模块共208道面试题
-
包含的模块:本文分为十九个模块,分别是:Java基础、容器、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/SpringMVC、SpringBoot/Spring...
- 底层原理深度解析:equals() 与 == 的 JVM 级运作机制
-
作为Java开发者,你是否曾在集合操作时遇到过对象比较的诡异问题?是否在使用HashMap时发现对象丢失?这些问题往往源于对equals()和==的误解,以及实体类中这两个方法的不当实...
- 雪花算法,什么情况下发生 ID 冲突?
-
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的...
- 50个Java编程技巧,免费送给大家
-
一、语法类技巧1.1.使用三元表达式普通:...
- 如何规划一个合理的JAVA项目工程结构
-
由于阿里Java开发手册对于工程结构的描述仅限于1、2节简单的概述,不能满足多样的实际需求,本文根据多个项目中工程的实践,分享一种较为合理实用的工程结构。工程结构的原则有依据、实用。有依据的含义是指做...
- Java 编程技巧之单元测试用例编写流程
-
温馨提示:本文较长,同学们可收藏后再看:)前言...
- MyBatis核心源码解读:SQL执行流程的奇妙之旅
-
MyBatis核心源码解读:SQL执行流程的奇妙之旅大家好呀!今天咱们要来一场既烧脑又有趣的旅程——探索MyBatis这个强大框架的核心秘密。你知道吗?当你在项目里轻轻松松写一句“select*f...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)