当前位置: 首页 > backend >正文

【Python Web开发】02-Socket网络编程02

文章目录

    • 1. 服务器端
      • 1.1 socket.socket()
      • 1.2 socket.bind()
      • 1.3 socket.listen()
      • 1.4 socket.accept()
      • 1.5 socket.recv()
      • 1.6 socket.send() 和 socket.sendall()
      • 1.7 socket.close()
    • 2. 客户端
      • 2.1 socket.socket()
      • 2.2 socket.connect()
      • 2.3 socket.send() 和 socket.sendall()
      • 2.4 socket.recv()
      • 2.5 socket.close()
      • 2.6 UDP 客户端方法的差异

这里主要是介绍一下Socket通讯中服务端和客户端需要使用的方法及其说明

1. 服务器端

在 Python 网络编程里,服务器端通常会使用 socket 模块中的多个方法来实现网络通信。

下面为你详细介绍服务器端常用的方法及其用法。

1.1 socket.socket()

  • 功能:创建一个套接字对象。套接字是网络编程的基础,它就像是一个通信的端点,通过它可以进行数的发送和接受

  • 语法

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 参数说明
    • family:指定地址族,常用的有 socket.AF_INET(表示 IPv4 地址)和 socket.AF_INET6(表示 IPv6 地址)。
    • type:指定套接字类型,常用的有 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
    • proto:通常取默认值 0。
    • fileno:通常取默认值 None。

示例

import socket# 创建一个TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

1.2 socket.bind()

  • 功能:将套接字绑定到指定的IP地址和端口号。这样客户端就可以通过这个地址和端口找到服务器。

  • 语法

socket.bind(address)
  • 参数说明

    • address:是一个元组,格式为 (host, port),其中 host 是 IP 地址,port 是端口号。

示例:

# 服务器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

1.3 socket.listen()

  • 功能:让套接字进入监听状态,开始等待客户端的连接请求
  • 语法
socket.listen(backlog)
  • 参数说明
    • backlog:指定允许排队等待处理的最大连接请求数量

示例

# 开始监听,允许最多5个连接请求排队等待
server_socket.listen(5)
print('服务器正在监听端口 8888...')

1.4 socket.accept()

  • 功能:接受客户端的请求,并返回一个新的套接字对象和客户端地址。新的套接字对象用于与客户端进行数据通信。
  • 语法
conn, addr = socket.accept()
  • 返回值说明
    • coon:是一个新的套接字对象,用于与客户端进行数据收发。
    • addr:是客户端的地址信息,通常是一个元组(host,port)

示例

while True:# 接受客户端连接connection, client_address = server_socket.accept()print(f'连接来自: {client_address}')

1.5 socket.recv()

  • 功能:从客户端接收数据
  • 语法
data = socket.recv(bufsize)
  • 参数说明
    • bufsize:指定一次最多接收的字节数

示例

# 接收客户端发送的数据
data = connection.recv(1024)
print(f'收到的数据: {data.decode()}')

1.6 socket.send() 和 socket.sendall()

  • 功能:向客户端发送数据。send方法尝试发送数据,但可能不会发送完所有的数据;sendall方法会确保所有数据都被发送出去

  • 语法

# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
  • 参数说明
    • data:要发送的数据,必须是字节类型

示例

# 发送响应给客户端
message = '你好,客户端!'
connection.sendall(message.encode())

1.7 socket.close()

  • 功能:关闭套接字,释放相关资源
  • 语法
socket.close()

示例

# 关闭连接
connection.close()

完整示例
以下是一个完整的 TCP 服务器端示例代码,展示了上述方法的综合使用:

import socket# 创建一个TCP/IPv4套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 开始监听,允许最多5个连接请求排队等待
server_socket.listen(5)
print('服务器正在监听端口 8888...')while True:# 接受客户端连接connection, client_address = server_socket.accept()try:print(f'连接来自: {client_address}')# 接收客户端发送的数据data = connection.recv(1024)print(f'收到的数据: {data.decode()}')# 发送响应给客户端message = '你好,客户端!'connection.sendall(message.encode())finally:# 关闭连接connection.close()

通过上述方法的使用,可以实现一个简单的 TCP 服务器端,处理客户端的连接请求和数据通信。

如果使用 UDP 协议,部分方法会有所不同,例如不需要 listen 和 accept 方法,而是直接使用 recvfrom 和 sendto 方法进行数据的收发。

2. 客户端

在 Python 网络编程里,客户端也会用到 socket 模块中的多个方法来和服务器进行通信。

下面详细介绍客户端常用的方法及其用法。

2.1 socket.socket()

  • 功能:创建一个套接字对象,这是网络通信的基础,客户端借助它来发送和接收数据。
  • 语法
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 参数说明
    • family:指定地址族,常见的有 socket.AF_INET(代表 IPv4 地址)和 socket.AF_INET6(代表 IPv6 地址)。
    • type:指定套接字类型,常用的是 socket.SOCK_STREAM(表示 TCP 套接字)和 socket.SOCK_DGRAM(表示 UDP 套接字)。
    • proto:一般取默认值 0。
    • fileno:通常取默认值 None。

示例

import socket# 创建一个TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2.2 socket.connect()

  • 功能:客户端使用此方法向服务器发起连接请求。若服务器接受请求,双方就会建立起连接。
  • 语法
socket.connect(address)
  • 参数说明
    • address:是一个元组,格式为 (host, port),host 是服务器的 IP 地址,port 是服务器监听的端口号

示例

# 服务器地址和端口
server_address = ('localhost', 8888)
client_socket.connect(server_address)

2.3 socket.send() 和 socket.sendall()

  • 功能:向服务器发送数据。send 方法尝试发送数据,但也许不会发送完所有数据;sendall 方法会保证所有数据都被发送出去。
  • 语法
# send方法
sent = socket.send(data)
# sendall方法
socket.sendall(data)
  • 参数说明
    • data:要发送的数据,必须是字节类型。

示例

# 发送数据给服务器
message = '你好,服务器!'
client_socket.sendall(message.encode())

2.4 socket.recv()

  • 功能:从服务器接收数据。
  • 语法
data = socket.recv(bufsize)
  • 参数说明
    • bufsize:指定一次最多接收的字节数。

示例

# 接收服务器的响应
data = client_socket.recv(1024)
print(f'收到服务器的响应: {data.decode()}')

2.5 socket.close()

  • 功能:关闭套接字,释放相关资源。
  • 语法
socket.close()

示例

# 关闭连接
client_socket.close()

完整示例代码
下面是一个完整的 TCP 客户端示例代码,展示了上述方法的综合运用:

import socket# 创建一个TCP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 服务器地址和端口
server_address = ('localhost', 8888)# 连接服务器
client_socket.connect(server_address)try:# 发送数据给服务器message = '你好,服务器!'client_socket.sendall(message.encode())# 接收服务器的响应data = client_socket.recv(1024)print(f'收到服务器的响应: {data.decode()}')
finally:# 关闭连接client_socket.close()

2.6 UDP 客户端方法的差异

若使用 UDP 协议,客户端不需要 connect 方法来建立连接,而是直接使用 sendto 和 recvfrom 方法进行数据的收发。下面是一个简单的 UDP 客户端示例:

import socket# 创建一个UDP/IPv4套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服务器地址和端口
server_address = ('localhost', 9999)# 发送数据给服务器
message = '你好,服务器!'
client_socket.sendto(message.encode(), server_address)# 接收服务器的响应
data, server = client_socket.recvfrom(1024)
print(f'收到服务器的响应: {data.decode()}')# 关闭套接字
client_socket.close()
http://www.xdnf.cn/news/1787.html

相关文章:

  • Java 高频面试题解析
  • Langchain提取结构化数据
  • 第九节:性能优化高频题-首屏加载优化策略
  • JS Array 方法 | 区分 slice 和 splice
  • `rfind()` 从字符串的右侧开始查找指定子字符串首次出现的位置
  • SiamFC算法深度解析
  • 深入浅出:Pinctrl与GPIO子系统详解
  • SpringCloud微服务架构设计与实践 - 面试实战
  • C语言别踩白块附源码
  • Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite存储查询并验证用户名和密码
  • 现代化个人博客系统 ModStartBlog v10.3.0 博客批量操作,博客评论智能审核,安全升级
  • 某大型电解铝厂电解系统谐波治理装置改造沃伦森电气
  • Linux之七大难命令(The Seven Difficult Commands of Linux)
  • U盘能识别但无法写入数据的原因
  • CSS学习笔记8——表格
  • STM32F103C8T6 GPIO 通讯原理与物理层解析
  • Git 详细使用说明文档(适合小白)
  • 数据结构-冒泡排序(Python)
  • 【硬核干货】JetBrains AI Assistant 干货笔记
  • 数据分析工具 - AxureMost
  • php 框架Workerman定时任务详解《一》
  • MCP开发实战(一)基于MCP协议的大模型网关——多个大模型API统一封装为标准化工具
  • Axure大屏可视化模板:多领域数据决策的新引擎
  • TXPOLARITY/RXPOLARITY设置
  • java延迟map, 自定义延迟map, 过期清理map,map能力扩展。如何设置map数据过期,改造map适配数据过期
  • day6-小白学习JAVA---方法_面向对象
  • 了解低功耗蓝牙中的安全密钥
  • 缓存穿透、雪崩、击穿深度解析与解决方案
  • 多线程中的ABA问题详解
  • Java并发编程|CompletableFuture原理与实战:从链式操作到异步编排