前军教程网

中小站长与DIV+CSS网页布局开发技术人员的首选CSS学习平台

25-3-Python网络编程-UDP 编程示例和HTTP协议

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-示例分析

  1. 除了创建套接字并将其绑定到本地地址(主机名/端口号对)外,并没有额外的工作。无限循环包含接收客户端消息、打上时间戳并返回消息,然后回到等待另一条消息的状态。再一次,close()调用是可选的,并且由于无限循环的缘故,它并不会被调用,但它提醒我们,它应该是优雅或智能退出方案的一部分
  2. 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()方法在百度搜索关键词中得到第一页链接的过程

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言