- Python 教程
- Python 教程
- Python - 概述
- Python - 历史
- Python - 特性
- Python 与 C++
- Python - Hello World 程序
- Python - 应用领域
- Python 解释器及其模式
- Python - 环境设置
- Python - 虚拟环境
- Python - 基本语法
- Python - 变量
- Python - 数据类型
- Python - 类型转换
- Python - Unicode 系统
- Python - 文字
- Python - 运算符
- Python - 算术运算符
- Python - 比较运算符
- Python - 赋值运算符
- Python - 逻辑运算符
- Python - 按位运算符
- Python - 成员资格运算符
- Python - 身份运算符
- Python - 运算符优先级
- Python - 注释
- Python - 用户输入
- Python - 数字
- Python - 布尔值
- Python 控制语句
- Python - 控制流
- Python - 决策
- Python - if 语句
- Python - if-else 语句
- Python - 嵌套 if 语句
- Python - Match-Case 语句
- Python - 循环
- Python - For 循环
- Python for-else 循环
- Python - While 循环
- Python - break 语句
- Python - Continue 语句
- Python - pass 语句
- Python - 嵌套循环
- Python 函数和模块
- Python - 函数
- Python - 默认参数
- Python - 关键字参数
- Python - 仅关键字参数
- Python - 位置参数
- Python - 仅位置参数
- Python - 任意或可变长度参数
- Python - 变量范围
- Python - 函数注释
- Python - 模块
- Python - 内置函数
- Python 字符串
- Python - 字符串
- Python - 切片字符串
- Python - 修改字符串
- Python - 字符串连接
- Python - 字符串格式化
- Python - 转义字符
- Python - 字符串方法
- Python - 字符串练习
- Python 列表
- Python - 列表
- Python - 访问列表项
- Python - 更改列表项
- Python - 添加列表项
- Python - 删除列表项
- Python - 循环列表
- Python - 列表推导式
- Python - 排序列表
- Python - 复制列表
- Python - 联接列表
- Python - 列表方法
- Python - 列表练习
- Python 元组
- Python - 元组(Tuple )
- Python - 访问元组项
- Python - 更新元组
- Python - 解压缩元组项
- Python - 循环元组
- Python - 联接元组
- Python - 元组方法
- Python - 元组练习
- Python 集
- Python - 集(sets)
- Python - 访问 Set Items
- Python - 添加 Set Items
- Python - 删除 Set Items
- Python - 循环 Set Items
- Python - 联接 Sets
- Python - 复制 Set
- Python - Set 运算符
- Python - Set 方法
- Python - Set 的练习
- Python 字典
- Python - 字典
- Python - 访问字典项
- Python - 更改字典项
- Python - 添加字典项
- Python - 删除字典项
- Python - 字典视图对象
- Python - 循环字典
- Python - 复制字典
- Python - 嵌套字典
- Python - 字典方法
- Python - 字典练习
- Python 数组
- Python - 数组
- Python - 访问数组项
- Python - 添加数组项
- Python - 删除数组项
- Python - 循环数组
- Python - 复制数组
- Python - 反向数组
- Python - 对数组进行排序
- Python - 连接数组
- Python - 数组方法
- Python - 数组练习
- Python 文件处理
- Python - 文件处理
- Python - 写入文件
- Python - 读取文件
- Python - 重命名和删除文件
- Python - 目录
- Python - 文件方法
- Python OS 文件/目录方法
- Python - os.path 方法
- 面向对象编程
- Python - OOP 概念
- Python - 类和对象
- Python - 类属性
- Python - 类方法
- Python - 静态方法
- Python - 构造函数
- Python - 访问修饰符
- Python - 继承
- Python - 多态性
- Python - 方法覆盖
- Python - 方法重载
- Python - 动态绑定
- Python - 动态类型
- Python - 抽象
- Python - 封装
- Python - 接口
- Python - 软件包
- Python - 内部类
- Python - 匿名类和对象
- Python - 单例类
- Python - 包装类
- Python - 枚举
- Python - 反射
- Python 错误和异常
- Python - 语法错误
- Python - 异常处理
- Python - try-except 块
- Python - try-finally 块
- Python - 引发异常
- Python - 异常链接
- Python - 嵌套 try 块
- Python - 用户定义的异常
- Python - 日志记录
- Python - 断言
- Python - 内置异常
- Python 多线程
- Python - 多线程
- Python - 线程生命周期
- Python - 创建线程
- Python - 启动线程
- Python - 联接线程
- Python - 命名线程
- Python - 线程调度
- Python - 线程池
- Python - 主线程
- Python - 线程优先级
- Python - 守护程序线程
- Python - 同步线程
- Python 同步
- Python - 线程间通信
- Python - 线程死锁
- Python - 中断线程
- Python 网络
- Python - 网络编程
- Python - 套接字编程
- Python - URL 处理
- Python - 泛型
- Python 杂项
- Python - 日期和时间
- Python - math 模块
- Python - 迭代器
- Python - 生成器
- Python - 闭包(closures)
- Python - 装饰器( Decorators)
- Python - 递归
- Python - 正则表达式
- Python - PIP
- Python - 数据库访问
- Python - 弱引用
- Python - 序列化
- Python - 模板
- Python - 输出格式
- Python - 性能测量
- Python - 数据压缩
- Python - CGI 编程
- Python - XML 处理
- Python - GUI 编程
- Python - 命令行参数
- Python - 文档字符串
- Python - JSON
- Python - 发送电子邮件
- Python - 更多扩展
- Python - 工具/实用程序
- Python - 图形用户界面
- Python 高级概念
- Python - 抽象基类
- Python - 自定义异常
- Python - 高阶函数
- Python - 对象内部
- Python - 内存管理
- Python - 元类
- Python - 使用 Metaclasses 进行元编程
- Python - 模拟和存根
- Python - 猴子修补
- Python - 信号处理
- Python - 类型提示
- Python - 自动化教程
- Python - 人性化软件包
- Python - 上下文管理器
- Python - 协程
- Python - 描述符
- Python - 诊断和修复内存泄漏
- Python - 不可变数据结构
Python - 套接字编程
Python 套接字编程
套接字编程是一种技术,我们在网络中连接的两个节点之间进行通信,其中服务器节点侦听来自客户端节点的传入请求。
在 Python 中,socket 模块用于 socket 编程。标准库中的 socket 模块包括服务器和客户端在硬件级别进行通信所需的功能。
此模块提供对 BSD 套接字接口的访问。它适用于所有操作系统,例如 Linux、Windows、MacOS。
什么是套接字?
套接字是双向通信通道的端点。套接字可以在进程内、同一台机器上的进程之间或不同大洲的进程之间进行通信。
套接字由 IP 地址和端口号的组合标识。应在两端正确配置它以开始通信。
套接字可以通过多种不同的通道类型实现:Unix 域套接字、TCP、UDP 等。套接字库提供了用于处理公共传输的特定类以及用于处理其余部分的通用接口。
术语 套接字编程 意味着以编程方式设置套接字以能够发送和接收数据。
有两种类型的通信协议 -
- 面向连接的协议
- 无连接协议
TCP 或 Transmission Control Protocol 是一种面向连接的协议。数据由服务器以数据包的形式传输,并由接收方以相同的传输顺序组装。由于在开始前需要设置通信两端的 socket,因此这种方法更可靠。
UDP 或用户数据报协议是无连接的。该方法不可靠,因为套接字不需要建立任何连接和终止进程来传输数据。
Python 套接字模块
socket 模块用于为 network 中连接的节点创建和管理 socket 编程。socket 模块提供了一个 socket 类。您需要使用 socket.socket() 构造函数创建一个套接字。
套接字类的对象表示主机名和端口号对。
语法
以下是 socket.socket() 构造函数的语法 –
socket.socket (socket_family, socket_type, protocol=0)
参数
- family − 默认为 AF_INET。其他值 - AF_INET6 (八组四个十六进制数字)、AF_UNIX、AF_CAN (控制器局域网) 或 AF_RDS (可靠的数据报套接字)。
- socket_type − 应该是 SOCK_STREAM (默认值)、SOCK_DGRAM、SOCK_RAW 或其他 SOCK_ 常量之一。
- protocol − number 通常为零,可以省略。
返回类型
此方法返回一个 socket 对象。
获得 socket 对象后,您可以使用所需的方法创建客户端或服务器程序。
服务器套接字方法
在 server 上实例化的 socket 称为 server socket。以下方法可用于服务器上的 socket 对象 -
- bind() 方法 − 该方法将套接字绑定到指定的 IP 地址和端口号。
- listen() 方法 − 此方法启动服务器并运行到侦听循环中,以查找来自客户端的连接请求。
- accept() 方法 − 当连接请求被服务器拦截时,该方法接受它并使用其地址标识客户端套接字。
要在服务器上创建套接字,请使用以下代码段 -
import socket
server = socket.socket()
server.bind(('localhost',12345))
server.listen()
client, addr = server.accept()
print ("connection request from: " + str(addr))
默认情况下,服务器绑定到本地计算机的 IP 地址 'localhost' 侦听任意空端口号。
客户端套接字方法
类似的 socket 设置在客户端。它主要向监听其 IP 地址和端口号的服务器套接字发送连接请求
connect() 方法
此方法将 2 项 Tuples 对象作为参数。这两项是服务器的 IP 地址和端口号。
obj=socket.socket()
obj.connect((host,port))
一旦服务器接受连接,两个套接字对象都可以发送和/或接收数据。
send() 方法
服务器使用它已拦截的地址将数据发送到客户端。
client.send(bytes)
Client socket 将数据发送到已建立连接的 socket。
sendall() 方法
类似于 send()。但是,与 send() 不同的是,此方法将继续从 bytes 发送数据,直到发送所有数据或发生错误。成功时不返回 None 。
sendto() 方法
此方法仅适用于 UDP 协议。
recv() 方法
此方法用于检索发送到客户端的数据。如果是 server,则使用请求已被接受的远程套接字。
client.recv(bytes)
recvfrom() 方法
此方法用于 UDP 协议。
Python - 套接字服务器
要编写 Internet 服务器,我们使用 socket 模块中提供的 socket 函数来创建 socket 对象。然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用 bind(hostname, port) 函数来为给定主机上的服务指定端口。
接下来,调用返回对象的 accept 方法。此方法将等待客户端连接到您指定的端口,然后返回表示与该客户端的连接的连接对象。
服务器套接字示例
import socket
host = "127.0.0.1"
port = 5001
server = socket.socket()
server.bind((host,port))
server.listen()
conn, addr = server.accept()
print ("Connection from: " + str(addr))
while True:
data = conn.recv(1024).decode()
if not data:
break
data = str(data).upper()
print (" from client: " + str(data))
data = input("type message: ")
conn.send(data.encode())
conn.close()
Python - 套接字客户端
让我们编写一个非常简单的客户端程序,它打开与给定端口 5001 和给定 localhost 的连接。使用 Python 的 socket 模块函数创建 socket 客户端非常简单。
socket.connect(hosname, port) 打开与端口上主机名的 TCP 连接。打开套接字后,您可以像任何 IO 对象一样从中读取数据。完成后,请记得关闭它,就像关闭文件一样。
Client Socket 示例
下面的代码是一个非常简单的客户端,它连接到给定的主机和端口,从套接字读取任何可用数据,然后在输入“q”时退出。
import socket
host = '127.0.0.1'
port = 5001
obj = socket.socket()
obj.connect((host,port))
message = input("type message: ")
while message != 'q':
obj.send(message.encode())
data = obj.recv(1024).decode()
print ('Received from server: ' + data)
message = input("type message: ")
obj.close()
- 首先运行 Server 代码。它开始倾听。
- 然后启动客户端代码。它发送请求。
- 请求已接受。已识别客户端地址
- 键入一些文本,然后按 Enter。
- 打印接收的数据。将数据发送到客户端。
- 接收来自服务器的数据。
- 当输入 'q' 时,循环终止。
服务器-客户端交互如下所示 -
我们已经在本地机器上使用 socket 模块实现了客户端-服务器通信。要将服务器和客户端代码放在网络上的两台不同的机器上,我们需要找到服务器机器的 IP 地址。
在 Windows 上,您可以通过运行 ipconfig 命令来查找 IP 地址。ifconfig 命令是 Ubuntu 上的等效命令。
使用 IPv4 Address 值更改服务器和客户端代码中的主机字符串,并像以前一样运行它们。
使用 Socket Module 进行 Python 文件传输
下面的程序演示了如何使用套接字通信将文件从服务器传输到客户端
服务器代码
建立连接的代码与之前相同。接受连接请求后,服务器上的文件以二进制模式打开进行读取,并连续读取字节并将其发送到客户端流,直到到达文件末尾。
import socket
host = "127.0.0.1"
port = 5001
server = socket.socket()
server.bind((host, port))
server.listen()
conn, addr = server.accept()
data = conn.recv(1024).decode()
filename='test.txt'
f = open(filename,'rb')
while True:
l = f.read(1024)
if not l:
break
conn.send(l)
print('Sent ',repr(l))
f.close()
print('File transferred')
conn.close()
客户端代码
在客户端,以 wb 模式打开一个新文件。从 server 接收的数据流将写入该文件。当流结束时,输出文件将关闭。将在客户端计算机上创建一个新文件。
import socket
s = socket.socket()
host = "127.0.0.1"
port = 5001
s.connect((host, port))
s.send("Hello server!".encode())
with open('recv.txt', 'wb') as f:
while True:
print('receiving data...')
data = s.recv(1024)
if not data:
break
f.write(data)
f.close()
print('Successfully received')
s.close()
print('connection closed')
Python socketserver 模块
Python 标准库中的 socketserver 模块是一个用于简化编写网络服务器任务的框架。module 中有以下类,它们代表同步服务器 -
这些类与相应的 RequestHandler 类一起实现服务。BaseServer 是模块中所有 Server 对象的超类。
TCPServer 类使用 Internet TCP 协议,在客户端和服务器之间提供连续的数据流。构造函数会自动尝试调用 server_bind() 和 server_activate()。其他参数将传递给 BaseServer 基类。
您还必须创建 StreamRequestHandler 类的子类。IT 部门提供 self.rfile 和 self.wfile 属性来读取或写入以获取请求数据或将数据返回给客户端。
- UDPServer 和 DatagramRequestHandler − 这些类旨在用于 UDP 协议。
- DatagramRequestHandler 和 UnixDatagramServer − 这些类使用 Unix 域套接字;它们在非 Unix 平台上不可用。
服务器代码
您必须编写 RequestHandler 类。它与服务器的每个连接都会实例化一次,并且必须覆盖 handle() 方法以实现与 Client 端的通信。
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
host,port=self.client_address
print("{}:{} wrote:".format(host,port))
print(self.data.decode())
msg=input("enter text .. ")
self.request.sendall(msg.encode())
在服务器分配的端口号上,TCPServer 类的对象调用 forever() 方法将服务器置于侦听模式并接受来自客户端的传入请求。
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
server.serve_forever()
客户端代码
当使用 socketserver 时,客户端代码或多或少与 socket 客户端应用程序相似。
import socket
import sys
HOST, PORT = "localhost", 9999
while True:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
# Connect to server and send data
sock.connect((HOST, PORT))
data = input("enter text .. .")
sock.sendall(bytes(data + "\n", "utf-8"))
# Receive data from the server and shut down
received = str(sock.recv(1024), "utf-8")
print("Sent: {}".format(data))
print("Received: {}".format(received))
在一个命令提示符终端中运行服务器代码。为 Client 端实例打开多个终端。您可以模拟服务器与多个客户端之间的并发通信。
服务器 | 客户端 1 | 客户端 2 |
---|---|---|
D:\socketsrvr>python myserver.py 127.0.0.1:54518 wrote: from client-1 enter text .. hello 127.0.0.1:54522 wrote: how are you enter text .. fine 127.0.0.1:54523 wrote: from client-2 enter text .. hi client-2 127.0.0.1:54526 wrote: good bye enter text .. bye bye 127.0.0.1:54530 wrote: thanks enter text .. bye client-2 |
D:\socketsrvr>python myclient.py enter text .. . from client-1 Sent: from client-1 Received: hello enter text .. . how are you Sent: how are you Received: fine enter text .. . good bye Sent: good bye Received: bye bye enter text .. . |
D:\socketsrvr>python myclient.py enter text .. . from client-2 Sent: from client-2 Received: hi client-2 enter text .. . thanks Sent: thanks Received: bye client-2 enter text .. . |