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

【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()

相关文章:

  • 从零到精通:全面解析人工智能的核心技术与发展趋势
  • 矩阵运营的限流问题本质上是平台与创作者之间的流量博弈
  • 高德MCP制作旅游攻略
  • NLP高频面试题(五十三)——深度学习正则化详解
  • Vue: el-select选项中如何显示label之外的其他信息
  • CentOS系统中MySQL安装步骤分享
  • kotlin和MVVM的结合使用总结(二)
  • 【工具】使用 MCP Inspector 调试服务的完全指南
  • 展锐Android13电池问题导致系统的崩溃,(2)电池电压计算和电池曲线
  • JAVA聚焦OutOfMemoryError 异常
  • STM32F407使用ESP8266实现阿里云OTA(下)
  • Red:1靶场环境部署及其渗透测试笔记(Vulnhub )
  • Python面向对象编程相关的单选题和多选题
  • 测试基础笔记第十一天
  • 济南国网数字化培训班学习笔记-第二组-2节-输电线路施工及质量
  • Linux基础篇、第四章_01软件安装rpm_yum_源码安装_二进制安装
  • Linux基础
  • yt-dlp 下载时需要 cookie
  • 【Redis】 Redis中常见的数据类型(二)
  • 【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI
  • 四川公布一起影视盗版案例:1个网站2人团伙盗售30多万部
  • 央行25日开展6000亿元MLF操作,期限为1年期
  • 恒瑞医药一季度营收72亿元,净利增超36%:授权交易推动利润增长
  • 张又侠董军分别与印尼国防部长会见会谈
  • 继微软之后,亚马逊也放缓人工智能数据中心计划
  • 日媒:日本公明党党首将访华,并携带石破茂亲笔信