【Python网络编程】学习Socket编程,打造网络应用!
【Python网络编程】学习Socket编程,打造网络应用!
网络编程是现代计算机科学中的重要一环,几乎所有的应用都依赖网络传输数据。无论是创建简单的客户端-服务器模型,还是构建复杂的网络应用,Socket 编程都是关键的技术之一。本文将详细介绍 Python 中的 Socket 编程,帮助你构建自己的网络应用。
目录
- 什么是 Socket 编程?
- 网络通信的基本原理
- Socket 编程的核心模块
- 创建简单的服务器
- 创建客户端并与服务器通信
- TCP 和 UDP 的区别
- 多线程网络编程
- 数据传输中的编码与解码
- 错误处理与网络异常管理
- 如何打造一个简单的聊天应用

1. 什么是 Socket 编程?
Socket(套接字)是网络通信的基本工具,它定义了在网络中的设备如何通过 IP 地址和端口进行通信。Socket 编程是指通过编写代码创建、管理和操作这些套接字,进行网络数据的传输与处理。
在 Python 中,Socket 编程允许我们通过网络传递数据,实现客户端和服务器之间的通信。Python 提供了内置的 socket 模块,使得网络编程变得相对简单。

2. 网络通信的基本原理
网络通信可以分为两种基本模式:
- TCP(Transmission Control Protocol,传输控制协议):一种面向连接的协议,保证数据的可靠传输。
- UDP(User Datagram Protocol,用户数据报协议):一种无连接的协议,速度快,但不保证数据传输的可靠性。
网络通信的基本流程:
- 服务器监听特定的 IP 和端口,等待客户端请求。
- 客户端发起连接请求,与服务器建立通信。
- 双方通过 Socket 进行数据的发送和接收。
- 关闭连接,释放资源。

3. Socket 编程的核心模块
在 Python 中,socket 模块是实现网络编程的核心工具。常用的方法和类包括:
socket():创建一个新的 Socket 对象。bind():绑定 Socket 到指定的 IP 和端口。listen():使服务器进入监听状态,等待客户端连接。accept():接受客户端的连接请求。connect():客户端向服务器发起连接请求。send():向对方发送数据。recv():接收对方发送的数据。
导入模块的基本代码如下:
import socket

4. 创建简单的服务器
服务器端是网络通信的核心,负责监听客户端的连接请求并与其进行交互。下面是一个简单的服务器示例,它等待客户端连接并发送一条欢迎消息。
import socket# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取本地主机名
host = '127.0.0.1'
port = 9999# 绑定端口
server_socket.bind((host, port))# 设置最大连接数
server_socket.listen(5)print(f"Server is listening on {host}:{port}")while True:# 建立客户端连接client_socket, addr = server_socket.accept()print(f"Connected to {addr}")# 发送消息到客户端message = 'Welcome to the server!\n'client_socket.send(message.encode('utf-8'))# 关闭连接client_socket.close()
代码解析:
socket.AF_INET:表示使用 IPv4 地址。socket.SOCK_STREAM:表示使用 TCP 协议。bind():将服务器绑定到本地的 IP 和指定端口。listen():服务器开始监听客户端连接。accept():接受客户端的连接请求,返回客户端的套接字对象和地址。

5. 创建客户端并与服务器通信
客户端负责发起与服务器的通信请求。下面是一个简单的客户端示例,它连接到服务器并接收欢迎消息。
import socket# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器
host = '127.0.0.1'
port = 9999
client_socket.connect((host, port))# 接收来自服务器的消息
message = client_socket.recv(1024).decode('utf-8')
print(f"Message from server: {message}")# 关闭连接
client_socket.close()
代码解析:
connect():客户端尝试连接到指定 IP 和端口的服务器。recv():接收服务器发送的消息。

6. TCP 和 UDP 的区别
在网络编程中,TCP 和 UDP 是两种常用的传输协议。它们的主要区别在于:
- TCP:面向连接,保证数据可靠传输。通信过程包括连接建立、数据传输、连接断开。
- UDP:无连接,不保证数据传输的顺序和完整性,但速度较快。
TCP 示例
前面创建的服务器和客户端即是基于 TCP 的通信。它适用于需要数据完整性的场景,如文件传输、消息传递等。
UDP 示例
下面是一个基于 UDP 的简单服务器和客户端。
UDP 服务器:
import socket# 创建 UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址和端口
host = '127.0.0.1'
port = 8888
server_socket.bind((host, port))print(f"UDP Server is listening on {host}:{port}")while True:data, addr = server_socket.recvfrom(1024)print(f"Received message from {addr}: {data.decode('utf-8')}")
UDP 客户端:
import socket# 创建 UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服务器地址
host = '127.0.0.1'
port = 8888# 发送数据
message = "Hello, UDP server!"
client_socket.sendto(message.encode('utf-8'), (host, port))# 关闭 socket
client_socket.close()

7. 多线程网络编程
在实际应用中,服务器通常需要同时处理多个客户端的连接。可以使用 Python 的 threading 模块实现多线程的网络编程,确保每个客户端的请求都能被独立处理。
多线程服务器示例:
import socket
import threadingdef handle_client(client_socket):message = 'Hello from the server!'client_socket.send(message.encode('utf-8'))client_socket.close()# 创建 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 9999))
server_socket.listen(5)
print("Server is listening...")while True:client_socket, addr = server_socket.accept()print(f"Connected to {addr}")# 创建新线程处理客户端连接client_handler = threading.Thread(target=handle_client, args=(client_socket,))client_handler.start()

8. 数据传输中的编码与解码
在网络传输中,数据通常以字节形式发送。为了能够传递字符串或其他复杂数据,必须将其编码为字节,接收时再解码为原始数据。
# 编码
message = "Hello, world!"
encoded_message = message.encode('utf-8')# 解码
decoded_message = encoded_message.decode('utf-8')
print(decoded_message)

9. 错误处理与网络异常管理
网络通信过程中可能会遇到各种错误,如连接超时、网络断开等。可以通过捕获异常来确保程序在异常情况下仍然能够正常运行。
import sockettry:client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('127.0.0.1', 9999))
except ConnectionRefusedError:print("Failed to connect to the server.")
except socket.timeout:print("Connection timed out.")
finally:client_socket.close()

10. 如何打造一个简单的聊天应用
下面是一个简单的多人聊天应用,使用 TCP 和多线程技术。
聊天服务器:
import socket
import threadingclients = []def broadcast(message, sender_socket):for client in clients:if client != sender_socket:client.send(message)def handle_client(client_socket):while True:try:message = client_socket.recv(1024)broadcast(message, client_socket)except:clients.remove(client_socket)client_socket.close()breakserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 5555))
server_socket.listen(5)
print("Chat server started...")while True:client_socket, addr = server_socket.accept()clients.append(client_socket)print(f"Connected to {addr}")client_handler = threading.Thread(target=handle_client, args=(client_socket,))client_handler.start()
客户端:
import socket
import threadingdef receive_messages(client_socket):while True:try:message = client_socket.recv(1024).decode('utf-8')print(message)except:print("An error occurred!")client_socket.close()breakdef send_messages(client_socket):while True:message = input("")client_socket.send(message.encode('utf-8'))client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 5555))# 创建两个线程:一个用于接收消息,另一个用于发送消息
receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))
send_thread = threading.Thread(target=send_messages, args=(client_socket,))receive_thread.start()
send_thread.start()
代码解析:
- 服务器端:管理所有连接的客户端,通过
broadcast函数将消息广播给所有其他客户端,并使用多线程同时处理多个连接。 - 客户端:两个线程分别用于接收和发送消息,确保可以同时发送和接收信息。
这个简单的聊天应用允许多个客户端连接到服务器,客户端可以实时发送和接收消息。虽然这是一个基础模型,但它展示了如何通过 Socket 编程和多线程技术构建实时网络应用。

总结
通过本文,你已经学习了如何使用 Python 的 socket 模块实现网络编程,从基本的服务器和客户端创建,到 TCP 和 UDP 协议的差异,再到多线程编程和异常处理。Socket 编程是网络应用的核心技术,它为我们提供了与外部系统和设备进行通信的能力。
Socket 编程可以用来构建各种网络应用,从简单的聊天程序到复杂的分布式系统。随着对 Socket 编程的深入理解,你可以灵活运用这些技术来构建更复杂的网络通信模型,处理并发连接、进行数据加密传输、以及更多高性能的网络架构。
通过实践这些代码示例,你将掌握网络编程的基础知识,能够为构建自己的网络应用奠定坚实的基础。

相关文章:
【Python网络编程】学习Socket编程,打造网络应用!
【Python网络编程】学习Socket编程,打造网络应用! 网络编程是现代计算机科学中的重要一环,几乎所有的应用都依赖网络传输数据。无论是创建简单的客户端-服务器模型,还是构建复杂的网络应用,Socket 编程都是关键的技术…...
docker (desktopcompose) download
docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell...
即时通讯:单聊消息逻辑
在线消息(对方在线) 1.client发送消息到msg_server 2.msg_server判断消息有效性,每秒发送的消息不能超过限制,无误后转发给db_server 3.db_server判断为单聊 查找对应的会话,不存在则创建两个会话(双方…...
Libevent源码剖析之reactor
1 简介 reactor 是一种事件驱动的并发处理模式,常用于网络服务器和事件循环系统中。它主要的功能是通过单线程或者多线程处理I/O操作,避免阻塞,并且能够高效处理大量并发的事件。 one loop per thread or process,以下摘自 reacto…...
分享一套SpringBoot+Vue民宿(预约)系统
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue民宿(预约)系统,分享下嘿嘿。 项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,…...
Linux——应用软件的生命周期
功能开发测试: 功能性测试 对应开发框架的测试用例代码的漏洞扫描 Web服务器版本应用开发语言的依赖关系和版本信息是否会造成类似内存泄露等影响系统性能的问题压力测试应用的部署 获取应用代码以及应用静态文件的代码包将安装包中的文件按照服务器配置的架构&…...
【Linux】exec系列函数详细介绍
首先,exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思: l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execl:l 为 list 可变参数列表 原型:int execl(const char *path, cons…...
ARINC 429总线协议
一、概述 ARINC 是美国航空无线电公司英文字头的缩写, 该公司1977年7月21日出版了“ARINC 429规范”一书,429规范就是飞机电子系统之间数字式数据传输的标准格式,在飞机上使用429总线的电子设备均应遵守这个规范,这样才能保证电子…...
Qt解决槽函数中发送的信号的参数会变化带来的错误
connect(item, &MusicItemWidget::playRequest, this, [this] { emit playMusic(QUrl(this->m_mediaPath); ); 如上图,this->m_mediaPath是个成员变量,但自己的初衷是发送一个最开始捕获的值,那么可以使用下面的方法…...
C C++ 如何编写库级接口
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
安装TDengine数据库3.3版本和TDengine数据库可视化管理工具
安装TDengine数据库3.3版本和TDengine数据库可视化管理工具 一、下载安装包二、解压安装包三、部署四、启动服务五、进入数据库六、创建数据库、表和往表中插入数据七、测试 TDengine 性能八、使用数据库九、查询数据十、TDengine数据库可视化界面 一、下载安装包 TDengine-cl…...
详解CAS
一、CAS是什么? CAS是Java中Unsafe类里面的一个方法,是Compare and Swap的缩写,中文翻译成比较并交换,主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性,实现并发算法时常用到的一种技术。它包含三…...
《环境感知方案:探索未来智能世界的关键技术》
《环境感知方案:探索未来智能世界的关键技术》 一、环境感知方案的研究现状(一)机器人领域的环境感知(二)农业领域的环境感知(三)智能网联汽车领域的环境感知 二、先进的环境感知技术࿰…...
Android 编译时出现Android resource linking failed.without required default value.
错误信息如下: Execution failed for task :app:processDebugResources. > A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction> Android resource linking failedwarn: removing r…...
golang ws升级为wss
首先需要一份openssl证书 1.安装openssl windows安装openssl 的下载地址在 https://slproweb.com/products/Win32OpenSSL.html 无脑点安装就行,记得最后安装完成的页面取消勾选 安装完成后记得配置环境变量 2.生成证书 openssl req -x509 -days 36500 -nodes …...
FFMPEG录屏(17)--- 使用 DwmRegisterThumbnail 捕获指定窗口图像数据
使用 DwmRegisterThumbnail 捕获指定窗口图像数据 在 Windows 平台上,捕获指定窗口的图像数据可以通过多种方法实现,其中一种高效的方法是使用 [DwmRegisterThumbnail] 本文将介绍如何使用 [DwmRegisterThumbnail] 捕获窗口图像数据,并提供一…...
点亮一个LED(51)
目录 1.LED介绍 2.硬件电路 3.程序设计 3.1.点亮一颗LED 3.2.LED闪烁 3.3.LED流水灯实现 1.LED介绍 发光二极管也具有二极管普遍的特性单向导电性,有阳极和阴极之分 ,上图左侧式插件式LED ,长的引脚是阳极;左侧是贴片式的带…...
Flink窗口分配器WindowAssigner
前言 Flink 数据流经过 keyBy 分组后,下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口,元素可以被分发到一个或多个窗口中,Flink 内置了常用的窗口分配器,包括:tumbling wi…...
【Tinymce】富文本编辑器在vue项目中的使用;引入付费格式刷,上传视频、图片
引言 富文本编辑器有很多,对比了一下,还是决定用tinymce(号称宇宙最强),基础的插件确实好用,但是一些更好用的插件,比如格式刷等都是高级版(付费),当然也有人…...
Java实现简单的5阶m序列密钥生成
选择5阶本原多项式:x^5 x^2 1,初始值为{1,0,0,1,1},易得,递推公式为:ak ak-5 ⊕ ak-2 ,其中k≥5。于是可以写出下面这段代码: class BitsEncode {public static void main(String[] args) {//初始化数组…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
