Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
python_11">python系列文章目录
01-Python 基础语法入门:从变量到输入输出,零基础也能学会!
02-Python 流程控制终极指南:if-else 和 for-while深度解析
03-Python 列表与元组全攻略:从新手到高手的必备指南
04-Python 字典与集合:从入门到精通的全面解析
05-Python函数入门指南:从定义到应用
06-Python 函数高级特性:从默认参数到闭包的全面解析
07-Python 模块与包:从零到自定义的全面指南
08-Python异常处理:从入门到精通的实用指南
09-Python 文件操作:从零基础到日志记录实战
10-Python面向对象编程入门:从类与对象到方法与属性
11-Python类的方法与属性:从入门到进阶的全面解析
12-Python继承与多态:提升代码复用与灵活性的关键技术
13-掌握Python魔法方法:如何用__add__和__len__自定义类的行为
14-python面向对象编程总结:从基础到进阶的 OOP 核心思想与设计技巧
15-掌握 Python 高级特性:深入理解迭代器与生成器
16-用 Python 装饰器提升效率:日志与权限验证案例
17-再也不怕资源泄漏!Python 上下文管理器,with语句全攻略
18-Python 标准库必备模块:math、random、os、json 全解析
19-Python 性能优化:从入门到精通的实用指南
20-Python内存管理与垃圾回收全解析
21-Python 代码调试与测试:从 pdb 到 TDD 的全面指南
22-Python 代码风格终极指南:从 PEP 8 到最佳实践全解析
23-Python实现网络通信:Socket模块与TCP/IP协议全解析
文章目录
- Langchain系列文章目录
- python系列文章目录
- 前言
- 一、TCP/IP协议概述
- 1.1 什么是TCP/IP协议
- 1.2 TCP/IP协议的分层结构
- 1.2.1 应用层
- 1.2.2 传输层
- 1.2.3 网络层
- 1.2.4 链路层
- 二、使用`socket`模块实现网络通信
- 2.1 什么是`socket`
- 2.2 创建`socket`对象
- 2.3 `socket`的基本方法
- 2.3.1 绑定地址和端口
- 2.3.2 监听连接
- 2.3.3 接受连接
- 2.3.4 发送和接收数据
- 三、客户端与服务器端程序
- 3.1 服务器端程序
- 3.1.1 创建服务器`socket`
- 3.1.2 绑定地址和端口
- 3.1.3 监听连接
- 3.1.4 接受客户端连接
- 3.1.5 处理客户端请求
- 3.2 客户端程序
- 3.2.1 创建客户端`socket`
- 3.2.2 连接服务器
- 3.2.3 发送数据
- 3.2.4 接收数据
- 四、总结
前言
在互联网时代,网络编程是每个开发者都值得掌握的核心技能之一。从网页浏览到即时聊天,再到物联网设备之间的通信,网络编程无处不在。作为Python学习旅程的第23天,我们将迈入网络编程的世界,探索其基础知识。本文将从TCP/IP协议的基本概念讲起,逐步深入到使用Python的socket
模块实现网络通信,并通过实际代码带你编写客户端和服务器端程序。
无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供清晰的知识框架和实用的代码示例。让我们一起开启这场网络编程的探索之旅吧!
一、TCP/IP协议概述
网络编程的核心在于理解通信协议,而TCP/IP协议是互联网的基石。本节将带你了解它的基本概念和分层结构,帮助你建立网络通信的整体认知。
1.1 什么是TCP/IP协议
TCP/IP协议全称“传输控制协议/网际协议”,是一组用于实现网络通信的协议集合。它定义了设备如何连接到网络,以及数据如何在设备间传输。简单来说,TCP/IP就像网络世界的“交通规则”,确保数据能够准确、高效地到达目的地。
- TCP(传输控制协议):负责数据的可靠传输,保证数据按顺序到达且不丢失。
- IP(网际协议):负责数据的寻址和路由,决定数据从哪里发到哪里。
1.2 TCP/IP协议的分层结构
TCP/IP协议采用四层模型,每一层都有明确的功能。通过分层设计,网络通信变得模块化且易于理解。
1.2.1 应用层
应用层是用户直接接触的部分,负责处理应用程序的通信需求。例如:
- HTTP:浏览网页时使用。
- FTP:传输文件时使用。
- SMTP:发送邮件时使用。
1.2.2 传输层
传输层确保数据的端到端传输,提供可靠性或高效性两种选择:
- TCP:面向连接,保证数据完整,适用于需要高可靠性的场景(如文件下载)。
- UDP:无连接,速度快但不保证数据到达,适用于实时性要求高的场景(如视频直播)。
1.2.3 网络层
网络层负责数据的路由和转发,核心协议是IP。它为每台设备分配一个IP地址,并决定数据包的传输路径。
1.2.4 链路层
链路层是最底层,负责将数据封装成帧并通过物理网络(如以太网或Wi-Fi)传输。它处理硬件相关的工作,如MAC地址。
通过这四层的协作,TCP/IP协议让网络通信变得井然有序。如下图展示了其分层结构:
二、使用socket
模块实现网络通信
Python提供了强大的socket
模块,让我们能够轻松实现网络通信。本节将从socket
的基本概念入手,逐步讲解它的用法。
2.1 什么是socket
socket
(套接字)是网络通信的桥梁,可以看作是应用程序与网络之间的“插座”。通过socket
,程序可以发送和接收数据,实现设备间的通信。
- 应用场景:聊天软件、文件传输工具、Web服务器等都离不开
socket
。 - 类型:常见的有TCP socket(可靠传输)和UDP socket(快速传输)。
2.2 创建socket
对象
在Python中,使用socket
模块的socket()
函数创建socket
对象。需要指定地址族和套接字类型:
python">import socket# 创建TCP socket (AF_INET表示IPv4,SOCK_STREAM表示TCP)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 地址族:
AF_INET
表示IPv4,AF_INET6
表示IPv6。 - 类型:
SOCK_STREAM
用于TCP,SOCK_DGRAM
用于UDP。
2.3 socket
的基本方法
创建socket
后,我们可以通过一系列方法实现通信。以下是常用的操作步骤:
2.3.1 绑定地址和端口
服务器端需要将socket
绑定到特定的IP地址和端口号,以便客户端可以找到它:
python"># 绑定到本机IP (127.0.0.1) 和端口8080
sock.bind(('127.0.0.1', 8080))
- 参数:一个元组,包含IP地址(字符串)和端口号(整数)。
- 常见问题:如果端口被占用,会抛出
OSError
,可以尝试换一个端口。
2.3.2 监听连接
绑定后,服务器端需要调用listen()
开始监听客户端连接:
python"># 监听连接,5表示最大等待连接数
sock.listen(5)
2.3.3 接受连接
当客户端发起连接时,服务器使用accept()
接受连接,返回一个新的socket
对象和客户端地址:
python"># 接受连接
client_sock, client_addr = sock.accept()
print(f"连接来自:{client_addr}")
- 返回值:
client_sock
用于与该客户端通信,client_addr
是客户端的IP和端口。
2.3.4 发送和接收数据
通信的核心是数据的发送和接收,使用send()
和recv()
方法:
python"># 发送数据 (数据需为字节类型)
client_sock.send(b"Hello, client!")# 接收数据 (1024表示最大接收字节数)
data = client_sock.recv(1024)
print(f"收到数据:{data.decode()}")
- 注意:发送数据前需编码(如
encode()
),接收后需解码(如decode()
)。
三、客户端与服务器端程序
掌握了socket
的基本用法后,我们通过实际代码实现一个简单的客户端-服务器通信系统。服务器端接收消息并回显,客户端发送消息并显示响应。
3.1 服务器端程序
服务器端程序负责监听连接并处理客户端请求。以下是完整实现:
3.1.1 创建服务器socket
python">import socket# 创建TCP socket
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3.1.2 绑定地址和端口
python"># 绑定到本机8080端口
server_sock.bind(('127.0.0.1', 8080))
3.1.3 监听连接
python"># 开始监听
server_sock.listen(5)
print("服务器启动,监听端口8080...")
3.1.4 接受客户端连接
python">while True:# 接受连接client_sock, client_addr = server_sock.accept()print(f"客户端 {client_addr} 已连接")
3.1.5 处理客户端请求
python"> # 处理请求while True:data = client_sock.recv(1024)if not data: # 客户端断开时data为空breakprint(f"收到消息:{data.decode()}")client_sock.send(data) # 回显消息client_sock.close()
完整代码:
python">import socketserver_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(('127.0.0.1', 8080))
server_sock.listen(5)
print("服务器启动,监听端口8080...")while True:client_sock, client_addr = server_sock.accept()print(f"客户端 {client_addr} 已连接")while True:data = client_sock.recv(1024)if not data:breakprint(f"收到消息:{data.decode()}")client_sock.send(data)client_sock.close()
运行结果:启动后,服务器会等待客户端连接,并回显收到的消息。
3.2 客户端程序
客户端程序主动连接服务器,发送消息并接收响应。
3.2.1 创建客户端socket
python">import socket# 创建TCP socket
client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3.2.2 连接服务器
python"># 连接服务器
client_sock.connect(('127.0.0.1', 8080))
3.2.3 发送数据
python"># 发送消息
client_sock.send(b"Hello, server!")
3.2.4 接收数据
python"># 接收响应
data = client_sock.recv(1024)
print(f"服务器响应:{data.decode()}")
client_sock.close()
完整代码:
python">import socketclient_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect(('127.0.0.1', 8080))
client_sock.send(b"Hello, server!")
data = client_sock.recv(1024)
print(f"服务器响应:{data.decode()}")
client_sock.close()
运行步骤:
- 先运行服务器端代码。
- 再运行客户端代码,观察服务器端的输出和客户端的响应。
常见问题排查:
- 连接失败:检查服务器是否已启动,IP和端口是否正确。
- 数据乱码:确保发送和接收时编码一致(如都用UTF-8)。
四、总结
通过本篇文章,我们从TCP/IP协议的基础知识入手,了解了网络通信的原理;接着通过socket
模块掌握了Python网络编程的基本方法;最后通过代码示例实现了客户端与服务器端的通信。这为你后续学习更复杂的网络编程奠定了基础。