Python实现网络通信:Socket模块与TCP/IP协议全解析

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!

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协议让网络通信变得井然有序。如下图展示了其分层结构:

应用层
HTTP, FTP, SMTP
传输层
TCP, UDP
网络层
IP
链路层
以太网, Wi-Fi

二、使用socket模块实现网络通信

Python提供了强大的socket模块,让我们能够轻松实现网络通信。本节将从socket的基本概念入手,逐步讲解它的用法。

2.1 什么是socket

socket(套接字)是网络通信的桥梁,可以看作是应用程序与网络之间的“插座”。通过socket,程序可以发送和接收数据,实现设备间的通信。

  • 应用场景:聊天软件、文件传输工具、Web服务器等都离不开socket
  • 类型:常见的有TCP socket(可靠传输)和UDP socket(快速传输)。

2.2 创建socket对象

在Python中,使用socket模块的socket()函数创建socket对象。需要指定地址族和套接字类型:

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地址和端口号,以便客户端可以找到它:

# 绑定到本机IP (127.0.0.1) 和端口8080
sock.bind(('127.0.0.1', 8080))
  • 参数:一个元组,包含IP地址(字符串)和端口号(整数)。
  • 常见问题:如果端口被占用,会抛出OSError,可以尝试换一个端口。

2.3.2 监听连接

绑定后,服务器端需要调用listen()开始监听客户端连接:

# 监听连接,5表示最大等待连接数
sock.listen(5)

2.3.3 接受连接

当客户端发起连接时,服务器使用accept()接受连接,返回一个新的socket对象和客户端地址:

# 接受连接
client_sock, client_addr = sock.accept()
print(f"连接来自:{client_addr}")
  • 返回值client_sock用于与该客户端通信,client_addr是客户端的IP和端口。

2.3.4 发送和接收数据

通信的核心是数据的发送和接收,使用send()recv()方法:

# 发送数据 (数据需为字节类型)
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

import socket# 创建TCP socket
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

3.1.2 绑定地址和端口

# 绑定到本机8080端口
server_sock.bind(('127.0.0.1', 8080))

3.1.3 监听连接

# 开始监听
server_sock.listen(5)
print("服务器启动,监听端口8080...")

3.1.4 接受客户端连接

while True:# 接受连接client_sock, client_addr = server_sock.accept()print(f"客户端 {client_addr} 已连接")

3.1.5 处理客户端请求

    # 处理请求while True:data = client_sock.recv(1024)if not data:  # 客户端断开时data为空breakprint(f"收到消息:{data.decode()}")client_sock.send(data)  # 回显消息client_sock.close()

完整代码

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

import socket# 创建TCP socket
client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

3.2.2 连接服务器

# 连接服务器
client_sock.connect(('127.0.0.1', 8080))

3.2.3 发送数据

# 发送消息
client_sock.send(b"Hello, server!")

3.2.4 接收数据

# 接收响应
data = client_sock.recv(1024)
print(f"服务器响应:{data.decode()}")
client_sock.close()

完整代码

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

运行步骤

  1. 先运行服务器端代码。
  2. 再运行客户端代码,观察服务器端的输出和客户端的响应。

常见问题排查

  • 连接失败:检查服务器是否已启动,IP和端口是否正确。
  • 数据乱码:确保发送和接收时编码一致(如都用UTF-8)。

四、总结

通过本篇文章,我们从TCP/IP协议的基础知识入手,了解了网络通信的原理;接着通过socket模块掌握了Python网络编程的基本方法;最后通过代码示例实现了客户端与服务器端的通信。这为你后续学习更复杂的网络编程奠定了基础。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

click house扩容方案

《ClickHouse扩容方案解析》 当我们谈论数据库的时候,尤其是像ClickHouse这样专为处理大规模数据分析而设计的列式存储数据库时,扩容是一个不可避免的话题。随着数据量的增长和查询复杂度的提升,原有的硬件资源可能不足以支撑高效的查询响应…

【AGI】智谱开源2025:一场AI技术民主化的革命正在到来

智谱开源2025:一场AI技术民主化的革命正在到来 引言:开源,一场技术平权的革命一、CogView4:中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM:人机交互的范式跃迁1. 自然语言驱动的跨…

java8中young gc的垃圾回收器选型,您了解嘛

在 Java 8 的 Young GC(新生代垃圾回收)场景中,对于 ToC的场景,即需要尽可能减少垃圾回收停顿时间以满足业务响应要求的场景,以下几种收集器各有特点,通常 Parnew和 G1 young表现较为出色,下面详…

【数学 矩阵快速幂】P7108 移花接木|普及+

本文涉及知识点 数学 移花接木 题目背景 遥远的圣地生长着一棵不为人知的灵树,或有万山之高。 但有一日,藏匿于根系的腐朽力量爆发,灵树已无法支撑往日屹立冲天的高度。 题目描述 灵树最初的形态可以看作一棵高度为 10 10 10 10 {10}…

2025-03-09 学习记录--C/C++-PTA 习题10-7 十进制转换二进制

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h>void dectobin( int n );int main() {int n;scanf(…

前端 | CORS 跨域问题解决

问题&#xff1a;Access to fetch at http://localhost:3000/save from origin http://localhost:5174 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the request…

fastapi房产销售系统

说明&#xff1a; 我希望用fastapi写几个接口&#xff0c;查询房产交易系统的几条数据&#xff0c;然后在postman里面测试 查询客户所有预约记录&#xff08;含房源信息&#xff09;需要对应销售经理查询客户所有订单&#xff08;含房源信息&#xff09;统计销售经理名下所有房…

导轨式ARM工业控制器:组态软件平台的“神经中枢”

工业自动化领域&#xff0c;组态软件平台扮演着至关重要的角色。它不仅是工业控制系统的“大脑”&#xff0c;更是实现智能化、高效化生产的关键工具。而作为组态软件平台的硬件支撑&#xff0c;导轨式ARM工控机&#xff08;以下简称“工控机”&#xff09;凭借其紧凑的设计、强…

每日一题——矩阵置零问题的原地算法

矩阵置零问题的原地算法 问题描述示例约束条件进阶要求 问题分析难点分析解题思路 代码实现代码说明 测试用例测试用例 1测试用例 2测试用例 3 总结 问题描述 给定一个 m x n 的矩阵&#xff0c;如果矩阵中的某个元素为 0&#xff0c;则需要将其所在的行和列的所有元素都置为 …

Springboot中的@Value注解:用法与潜在问题探索

在Spring Boot开发中&#xff0c;有个非常实用的注解&#xff0c;那就是Value&#xff01;它可以帮助我们轻松地从配置文件中读取属性值。想象一下&#xff0c;在应用程序中管理各种配置&#xff0c;比如数据库连接信息、服务URL或者API密钥等&#xff0c;使用Value是多么方便呀…

C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?

一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域&#xff0c;特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线&#xff0c;涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20&#xff1a;使用现代C特性&#xff0c;如…

25年携程校招社招求职能力北森测评材料计算部分:备考要点与误区解析

在求职过程中&#xff0c;能力测评是筛选候选人的重要环节之一。对于携程这样的知名企业&#xff0c;其能力测评中的材料计算部分尤为关键。许多求职者在备考时容易陷入误区&#xff0c;导致在考试中表现不佳。本文将深入解析材料计算部分的实际考察方向&#xff0c;并提供针对…

golang进阶知识专项-理解值传递

在 Go 语言中&#xff0c;所有函数的参数传递都是值传递&#xff08;Pass by Value&#xff09;。当你将一个变量作为参数传递给函数时&#xff0c;实际上传递的是该变量的副本&#xff0c;而不是变量本身。理解这一点对于避免常见的编程错误至关重要。根据不同的类型&#xff…

RuoYi框架添加自己的模块(学生管理系统CRUD)

RuoYi框架添加自己的模块&#xff08;学生管理系统&#xff09; 框架顺利运行 首先肯定要顺利运行框架了&#xff0c;这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…

中级网络工程师面试题参考示例(1)

一、基础理论 1. OSI七层模型与TCP/IP四层模型的区别是什么&#xff1f;请举例说明第三层&#xff08;网络层&#xff09;和第四层&#xff08;传输层&#xff09;的核心协议。 参考答案&#xff1a; OSI七层模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用…

RHCE9.0版本笔记5:防火墙的本地/远程登录方式

一、防火墙登录方式全景图 华为防火墙支持多种管理访问方式&#xff0c;根据安全等级和场景需求可分为&#xff1a; graph LR A[管理方式] --> B[本地登录] A --> C[远程登录] B --> B1(Console) B --> B2(Web) C --> C1(SSH) C --> C2(Telnet) C --> C…

2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB

一、山羊优化算法 山羊优化算法&#xff08;Goat Optimization Algorithm, GOA&#xff09;是2025年提出的一种新型生物启发式元启发式算法&#xff0c;灵感来源于山羊在恶劣和资源有限环境中的适应性行为。该算法旨在通过模拟山羊的觅食策略、移动模式和躲避寄生虫的能力&…

博弈论算法

一、减法游戏 初始有一个数 n。 两个玩家轮流操作&#xff0c;每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律&#xff1a; 减法游戏只需要判断当前数取模是否为0&#xff0c;即可快速判断胜负。 例题&#xff1a; Leetcode 292. Nim 游戏 …

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…

深度学习驱动的跨行业智能化革命:技术突破与实践创新

第一章 深度学习的技术范式演进与核心架构 1.1 从传统机器学习到深度神经网络的跨越 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代…