- 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 - 决策
- Python - 如果有的话
- Python - 大小写匹配语句
- Python - for 循环
- Python - for-else 循环
- Python - While 循环
- Python-break语句
- Python-继续语句
- 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 - 访问元组项
- 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 - 反转数组
- Python - 数组排序
- Python - 连接数组
- Python - 数组方法
- Python - 数组练习
- Python 文件处理
- Python - 文件处理
- Python-写入文件
- Python-读取文件
- Python - 重命名和删除文件
- Python - 目录
- Python - 文件方法
- Python - 操作系统文件/目录方法
- 面向对象编程
- 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 - 数学
- Python - 迭代器
- Python - 生成器
- Python - 闭包
- Python - 装饰器
- Python - 递归
- Python - 正则表达式
- Python-PIP
- Python-数据库访问
- Python - 弱引用
- Python-序列化
- Python - 模板
- Python - 输出格式
- Python-性能测量
- Python-数据压缩
- Python - CGI 编程
- Python - XML 处理
- Python - 图形用户界面编程
- Python - 命令行参数
- Python - 文档字符串
- Python-JSON
- Python-发送电子邮件
- Python - 进一步扩展
- Python - 工具/实用程序
- Python - 图形用户界面
- Python 问题与解答
- Python - 编程示例
- Python - 快速指南
- Python - 有用的资源
- Python - 讨论
Python-套接字编程
标准库中的套接字模块包含服务器和客户端之间在硬件级别进行通信所需的功能。
该模块提供对 BSD 套接字接口的访问。它适用于所有操作系统,例如 Linux、Windows、MacOS。
什么是套接字?
套接字是双向通信通道的端点。套接字可以在进程内、同一台机器上的进程之间或不同大陆的进程之间进行通信。
套接字由 IP 地址和端口号的组合来标识。两端都应正确配置才能开始通信。
套接字可以通过多种不同的通道类型来实现:Unix 域套接字、TCP、UDP 等。套接字库提供了用于处理公共传输的特定类以及用于处理其余传输的通用接口。
术语“套接字编程”意味着以编程方式设置套接字以能够发送和接收数据。
有两种类型的通信协议 -
面向连接的协议
无连接协议
TCP 或传输控制协议是一种面向连接的协议。数据由服务器以数据包的形式传输,并由接收器按照相同的传输顺序进行组装。由于通信两端的套接字需要在开始前设置,因此这种方法更加可靠。
UDP 或用户数据报协议是无连接的。该方法并不可靠,因为套接字不需要建立任何连接和终止过程来传输数据。
Python 套接字模块
该模块包括 Socket 类。套接字对象代表主机名和端口号的 psir。构造函数方法具有以下签名 -
句法
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_ 常量之一。
协议- 数字通常为零并且可以省略。
返回类型
该方法返回一个套接字对象。
一旦获得了套接字对象,就可以使用所需的方法来创建客户端或服务器程序。
服务器套接字方法
在服务器上实例化的套接字称为服务器套接字。服务器上的套接字对象可以使用以下方法 -
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地址和端口号的服务器socket发送连接请求
连接()方法
此方法采用两项元组对象作为参数。这两项是服务器的IP地址和端口号。
obj=socket.socket() obj.connect((host,port))
一旦服务器接受连接,两个套接字对象就可以发送和/或接收数据。
发送()方法
服务器使用其截获的地址向客户端发送数据。
client.send(bytes)
客户端套接字将数据发送到与其建立连接的套接字。
sendall() 方法
与send()类似。但是,与 send() 不同,此方法继续从字节发送数据,直到所有数据已发送或发生错误。成功时不会返回任何内容。
sendto() 方法
此方法仅在 UDP 协议的情况下使用。
接收()方法
该方法用于检索发送到客户端的数据。对于服务器,它使用请求已被接受的远程套接字。
client.recv(bytes)
recvfrom() 方法
该方法用于UDP协议的情况。
Python-套接字服务器
为了编写互联网服务器,我们使用套接字模块中提供的套接字函数来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用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-Socket 客户端
让我们编写一个非常简单的客户端程序,它打开到给定端口 5001 和给定本地主机的连接。使用Python的socket模块功能创建一个socket客户端非常简单。
socket.connect (hosname, port)在端口上打开到主机名的 TCP 连接。一旦打开了套接字,您就可以像任何 IO 对象一样从中读取数据。完成后,请记住关闭它,就像关闭文件一样。
以下代码是一个非常简单的客户端,它连接到给定的主机和端口,从套接字读取任何可用数据,然后在输入“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()
首先运行服务器代码。它开始聆听。
然后启动客户端代码。它发送请求。
请求已接受。已识别客户地址
输入一些文本并按 Enter。
打印收到的数据。发送数据给客户端。
接收到来自服务器的数据。
当输入“q”时循环终止。
服务器-客户端交互如下所示 -
我们已经在本地计算机上使用套接字模块实现了客户端-服务器通信。要将服务器和客户端代码放置在网络上的两台不同计算机上,我们需要找到服务器计算机的 IP 地址。
在 Windows 上,您可以通过运行 ipconfig 命令查找 IP 地址。ifconfig 命令是 Ubuntu 上的等效命令。
使用 IPv4 地址值更改服务器和客户端代码中的主机字符串,并像以前一样运行它们。
Python 使用 Socket 模块进行文件传输
以下程序演示了如何使用套接字通信将文件从服务器传输到客户端
服务器代码
建立连接的代码与之前相同。接受连接请求后,以二进制方式打开服务器上的文件进行读取,并依次读取字节并将其发送到客户端流,直到到达文件末尾。
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模式打开一个新文件。从服务器接收到的数据流被写入文件。当流结束时,输出文件将关闭。将在客户端计算机上创建一个新文件。
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 套接字服务器模块
Python标准库中的socketserver模块是一个用于简化编写网络服务器任务的框架。模块中有以下类,它们代表同步服务器 -
这些类与相应的 RequestHandler 类一起使用来实现服务。BaseServer 是模块中所有 Server 对象的超类。
TCPServer类使用互联网 TCP 协议,在客户端和服务器之间提供连续的数据流。构造函数自动尝试调用 server_bind() 和 server_activate()。其他参数传递给 BaseServer 基类。
您还必须创建StreamRequestHandler类的子类。IT提供self.rfile和self.wfile属性来读取或写入以获取请求数据或将数据返回给客户端。
UDPServer和DatagramRequestHandler - 这些类用于 UDP 协议。
DatagramRequestHandler和UnixDatagramServer - 这些类使用 Unix 域套接字;它们在非 Unix 平台上不可用。
服务器代码
您必须编写一个RequestHandler 类。它在每次连接到服务器时实例化一次,并且必须重写handle() 方法来实现与客户端的通信。
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()
客户端代码
使用套接字服务器时,客户端代码或多或少与套接字客户端应用程序类似。
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))
在一个命令提示符终端中运行服务器代码。为客户端实例打开多个终端。您可以模拟服务器与多个客户端之间的并发通信。
服务器 | 客户端1 | 客户端2 |
---|---|---|
D:\socketsrvr>python myserver.py 127.0.0.1:54518 写道: 来自客户端1 输入文字.. 你好 127.0.0.1:54522 写道: 你好吗 输入文字.. 美好的 127.0.0.1:54523 写道: 来自客户端2 输入文字.. 嗨,客户 2 127.0.0.1:54526 写道: 再见 输入文字.. 再见 127.0.0.1:54530 写道: 谢谢 输入文字.. 再见客户2 |
D:\socketsrvr>python myclient.py 输入文字... 来自客户端1 发送: 来自客户端1 收到: 你好 输入文字... 你好吗 发送: 你好吗 收到: 很好 输入文字... 再见 已发送:再见 收到:再见 输入文字... |
D:\socketsrvr>python myclient.py 输入文字... 来自客户端2 发送: 来自客户端2 收到:嗨客户 2 输入文字... 谢谢 已发送: 谢谢 已收到: 再见客户2 输入文字... |