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

python中socket(套接字)库详细解析

目录

1. 前言

2. socket 库基础

2.1 什么是 socket?

2.2 socket 的类型

3. 基于 TCP 的 socket 编程

3.1 TCP 服务器端代码示例

3.2 TCP 客户端代码示例

3.3 代码分析

4. 基于 UDP 的 socket 编程

4.1 UDP 服务器端代码示例

4.2 UDP 客户端代码示例

4.3 代码分析

5. 总结


1. 前言

在 Python 开发中,socket 库是一个非常重要的工具,它允许我们进行网络编程。通过 socket,程序可以在不同的机器之间进行通信,这为我们构建分布式系统、网络服务等提供了基础。无论是开发一个简单的聊天程序,还是构建复杂的网络服务架构,socket 都是不可或缺的。本文将结合详细的 Python 代码,全面介绍 socket 库的使用方法,让你轻松掌握网络编程的核心技能。

2. socket 库基础

2.1 什么是 socket?

socket(套接字)是通信的端点,它是一个通信会话的抽象。在计算机网络中,两台计算机之间要进行通信,就需要在双方建立 socket 连接,通过这个双向通道进行数据的发送和接收。

2.2 socket 的类型

主要有两种常见的 socket 类型:

  • SOCK_STREAM :提供面向连接的、可靠的字节流服务,基于 TCP 协议。它确保数据按照顺序到达,并且在数据传输过程中不会出现重复。

  • SOCK_DGRAM :提供无连接的、不可靠的 datagram 服务,基于 UDP 协议。这种类型的数据传输不保证可靠性,数据可能会丢失或乱序到达,但它的传输速度相对较快,适用于对实时性要求较高但对数据丢失不太敏感的场景,如视频流传输。

3. 基于 TCP 的 socket 编程

3.1 TCP 服务器端代码示例

import socket# 创建 socket 对象,AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用 TCP 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定 IP 地址和端口,这里绑定本地主机的 8080 端口
server_socket.bind(("localhost", 8080))# 开始监听,监听队列长度为 5
server_socket.listen(5)
print("服务器开始监听...")# 接受客户端连接,accept() 方法会阻塞等待客户端连接
client_socket, client_address = server_socket.accept()
print(f"客户端 {client_address} 已连接")# 接收客户端发送的数据,1024 表示缓冲区大小
data = client_socket.recv(1024).decode()
print(f"接收到客户端消息:{data}")# 向客户端发送数据
response = "服务器已收到消息"
client_socket.send(response.encode())# 关闭连接
client_socket.close()
server_socket.close()

3.2 TCP 客户端代码示例

import socket# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器,这里连接本地主机的 8080 端口
client_socket.connect(("localhost", 8080))# 向服务器发送数据
message = "Hello, Server!"
client_socket.send(message.encode())# 接收服务器返回的数据
response = client_socket.recv(1024).decode()
print(f"收到服务器回复:{response}")# 关闭连接
client_socket.close()

3.3 代码分析

  • 在服务器端,bind() 方法用于绑定 IP 地址和端口,使得服务器能够监听指定地址和端口上的连接请求。listen() 方法则让服务器进入监听状态,等待客户端的连接。

  • accept() 方法是一个阻塞方法,它会等待客户端的连接。当客户端连接成功后,会返回一个新的 socket 对象(用于和客户端进行通信)和客户端的地址信息。

  • 客户端通过 connect() 方法连接到服务器的指定 IP 地址和端口。

  • 数据的发送和接收分别通过 send()recv() 方法实现,需要注意数据是以字节流的形式传输,所以在发送之前要使用 encode() 方法将字符串编码为字节,接收后使用 decode() 方法解码为字符串。

4. 基于 UDP 的 socket 编程

4.1 UDP 服务器端代码示例

import socket# 创建 socket 对象,SOCK_DGRAM 表示使用 UDP 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定 IP 地址和端口
server_socket.bind(("localhost", 9090))
print("UDP 服务器启动,等待客户端消息...")while True:# 接收客户端发送的数据和客户端地址data, client_address = server_socket.recvfrom(1024)print(f"收到客户端 {client_address} 的消息:{data.decode()}")# 向客户端发送数据response = "服务器已收到你的 UDP 消息"server_socket.sendto(response.encode(), client_address)# 如果收到特定消息就退出循环if data.decode() == "exit":break# 关闭 socket
server_socket.close()

4.2 UDP 客户端代码示例

import socket# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 向服务器发送数据
server_address = ("localhost", 9090)
message = "Hello, UDP Server!"
client_socket.sendto(message.encode(), server_address)# 接收服务器返回的数据
response, server_address = client_socket.recvfrom(1024)
print(f"收到服务器 {server_address} 的回复:{response.decode()}")# 再次发送消息并接收回复(测试多轮通信)
message = "This is another message"
client_socket.sendto(message.encode(), server_address)
response, server_address = client_socket.recvfrom(1024)
print(f"收到服务器回复:{response.decode()}")# 发送退出消息
client_socket.sendto("exit".encode(), server_address)# 关闭连接
client_socket.close()

4.3 代码分析

  • UDP 是无连接的,所以在服务器端不需要像 TCP 一样调用 listen()accept() 方法来建立连接,而是直接通过 recvfrom() 方法接收数据和客户端地址。

  • 客户端通过 sendto() 方法发送数据,同时指定目标服务器的地址和端口。recvfrom() 方法用于接收数据和服务器的地址。

  • UDP 的这种通信方式使得数据的发送和接收相对简单,但需要注意数据的丢失和乱序问题。

5. 总结

Python 中的 socket 库是强大而灵活的网络编程工具。通过本文的介绍和代码示例,我们详细了解了基于 TCP 和 UDP 协议的 socket 编程方法。TCP 提供了可靠的面向连接的通信,适用于对数据准确性要求高的场景;UDP 则提供了简单的无连接通信,适合对实时性要求较高但对数据丢失不太敏感的场景。在实际开发中,我们可以根据具体需求选择合适的协议类型来构建网络应用,从简单的客户端 - 服务器架构到复杂的分布式系统,socket 库都能为我们提供坚实的基础。掌握 socket 编程,将为你打开网络编程世界的大门,让你能够开发出各种具有网络通信功能的应用程序。我是橙色小博,关注我,一起在人工智能领域学习进步!

http://www.xdnf.cn/news/1746.html

相关文章:

  • 拆解华为Pura X新发现:“仿生”散热与钛合金“骨架”
  • G3学习笔记
  • [C] 第6章 C51函数
  • 音视频之H.265/HEVC量化
  • 项目中数据结构为什么用数组,不用List
  • [Redis] Redis最佳实践
  • 【bmc1】概要,构建image
  • NVIDIA自动驾驶安全与技术读后感
  • 轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!
  • 【国产化之路】VPX-3U :基于D2000 /FT2000的硬件架构到操作系统兼容
  • postgres 导出导入(基于数据库,模式,表)
  • 优先级队列和仿函数的讲解(底层实现)
  • AWS 中国区 CloudFront SSL 证书到期更换实战指南
  • Missashe考研日记-day26
  • c++内存分布
  • 黑马点评--图形化界面连接redis
  • 【刷题】第三弹——二叉树篇(上)
  • 探寻健康密码:养生从日常细节开始
  • 10天学会嵌入式技术之51单片机-day-6
  • 一道有趣的xxe过滤题(html实体化绕过)
  • QSPI flash xip模式运行
  • 树型结构(知识点梳理及例题精讲)
  • 京东商品详情API接口调用技术指南‌
  • OCP证书介绍
  • 小白自学python第二天
  • kubernetes》》k8s》》Heml
  • 深入浅出 Python 协程:从异步基础到开发测试工具的实践指南
  • Linux-01
  • 如何使用 Apache 配置用户主页 ?
  • 如何检测Python项目哪些依赖库没有使用