Python 进阶(十):网络编程

简介: Python网络编程

1. 简介

网络编程主要的工作就是在发送端将信息通过指定的协议进行组装包,在接收端按照规定好的协议对包进行解析并提取出对应的信息,最终达到通信的目的。传输协议主要有 TCP 和 UDP,TCP 需要建立连接,是可靠的、基于字节流的协议,通常与 IP 协议共同使用;UDP 不需要建立连接,可靠性差,但速度更快。

网络编程有一个重要的概念 socket(套接字),应用程序可以通过它发送或接收数据,套接字允许应用程序将 I/O 插入到网络中,并与网络中的其他应用程序进行通信。

Python 提供了如下两个 socket 模块:

  • Socket

提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。

  • SocketServer

提供了服务器中心类,可以简化网络服务器的开发。

2. 使用

2.1 API 介绍

Python 中通过 socket() 函数来创建套接字对象,具体格式如下:

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

  • family:套接字协议族,可以使用 AF_UNIX(只能用于单一的 Unix 系统进程间通信)、AF_INET(服务器之间网络通信)

  • type:套接字类型,可以使用 SOCK_STREAM(面向连接的)、SOCK_DGRAM(非连接的)

套接字对象服务端方法:

方法 描述
bind(address) 将套接字绑定到地址,在 AF_INET 下以元组 (host,port) 的形式表示地址
listen([backlog]) 开始监听 TCP 传入连接,backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量,至少为1,大部分应用程序设为 5 就可以了
accept() 接受 TCP 连接并返回 (conn,address),conn 是新的套接字对象,可以用来接收、发送数据,address 是连接客户端的地址

套接字对象客户端方法:

方法 描述
connect(address) 连接到 address 处的套接字,格式一般为元组 (hostname,port),如果连接出错,返回 socket.error 错误
connect_ex(address) 功能与 connect(address) 相同,但是成功返回 0,失败返回 errno 的值

套接字对象公用方法:

方法 描述
recv(bufsize[, flags]) 接受 TCP 套接字的数据,数据以字符串形式返回,bufsize 指定要接收的最大数据量,flag 提供有关消息的其他信息,通常可以忽略
send(bytes[, flags]) 发送 TCP 数据,将 string 中的数据发送到连接的套接字,返回值是要发送的字节数量,该数量可能小于 string 的字节大小
sendall(bytes[, flags]) 完整发送 TCP 数据,将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据,成功返回 None,失败则抛出异常
recvfrom(bufsize[, flags]) 接受 UDP 套接字的数据,与 recv() 类似,但返回值是 (data,address),其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址
sendto(bytes, flags, address) 发送 UDP 数据,将数据发送到套接字,address 是形式为 (ipaddr,port) 的元组,指定远程地址,返回值是发送的字节数
close() 关闭套接字
getpeername() 返回连接套接字的远程地址,类型通常是元组 (ipaddr,port)
getsockname() 返回套接字自己的地址,通常是一个元组 (ipaddr,port)
setsockopt(level,optname,value) 设置给定套接字选项的值
getsockopt(level, optname[, buflen]) 返回套接字选项的值
settimeout(value) 设置套接字操作的超时时间,单位是秒
gettimeout() 返回当前超时时间
fileno() 返回套接字的文件描述符
setblocking(flag) 如果 flag 为 0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值);非阻塞模式下,如果调用 recv() 没有发现任何数据或 send() 调用无法立即发送数据,那么将引起 socket.error 异常
makefile() 创建一个与该套接字相关连的文件

2.2 TCP 方式

我们来看一下如何通过 socket 以 TCP 方式进行通信。

服务端基本思路:

  • 创建套接字,绑定套接字到 IP 与端口

  • 监听连接

  • 不断接受客户端的连接请求

  • 接收请求的数据,并向对方发送响应数据

  • 传输完毕后,关闭套接字

具体代码实现如下:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
# 监听连接
s.listen(5)
while True:
    print('等待客户端发送信息...')
    # 接收连接
    sock, addr = s.accept()
    # 接收请求数据
    data = sock.recv(1024).decode('utf-8')
    print('服务端接收请求数据:' + data)
    # 发送响应数据
    sock.sendall(data.upper().encode('utf-8'))
    # 关闭
    sock.close()

客户端基本思路:

  • 创建套接字,连接服务端

  • 连接后发送、接收数据

  • 传输完毕后,关闭套接字

具体代码实现如下:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
s.connect(('127.0.0.1', 6666))
# 向服务端发送数据
s.sendall(b'hello')
# 接受服务端响应数据
data = s.recv(1024)
print('客户端接收响应数据:' + data.decode('utf-8'))
# 关闭
s.close()

我们只需先运行服务端代码,再运行客户端代码即可。

2.3 UDP 方式

我们再来看一下如何通过 socket 以 UDP 方式进行通信。

服务端基本思路:

  • 创建套接字,绑定套接字到 IP 与端口

  • 接收客户端请求的数据

  • 向客户端发送响应数据

具体代码实现如下:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址
s.bind(('127.0.0.1', 6666))
while True:
    # 接收数据
    data, addr = s.recvfrom(1024)
    print('服务端接收请求数据:' + data.decode('utf-8'))
    # 响应数据
    s.sendto(data.decode('utf-8').upper().encode('utf-8'), addr)

客户端基本思路:

  • 创建套接字

  • 向服务端发送数据

  • 接受服务端响应数据

具体代码实现如下:

import socket

# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 向服务端发送数据
s.sendto(b'hello', ('127.0.0.1', 6666))
# 接受服务端响应数据
data = s.recv(1024).decode('utf-8')
print('客户端接收响应数据:' + data)
# 关闭
s.close()

同样的,我们还是先运行服务端代码,再运行客户端代码即可。

相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
103 55
|
1月前
|
Python
Python中的异步编程:使用asyncio和aiohttp实现高效网络请求
【10月更文挑战第34天】在Python的世界里,异步编程是提高效率的利器。本文将带你了解如何使用asyncio和aiohttp库来编写高效的网络请求代码。我们将通过一个简单的示例来展示如何利用这些工具来并发地处理多个网络请求,从而提高程序的整体性能。准备好让你的Python代码飞起来吧!
73 2
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
102 6
|
14天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
92 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
14天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
42 3
|
19天前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
35 6
|
22天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
47 8
|
21天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
78 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
56 3