【30天玩转python】网络编程基础
网络编程基础
网络编程是指编写能够在网络上进行通信的程序,通过网络进行数据的发送与接收。Python 提供了许多库和工具来进行网络编程,如 socket
、urllib
和 requests
。在这篇文章中,我们将介绍网络编程的基础知识,并演示如何使用 Python 实现简单的网络通信。
1. 网络基础知识
1.1 IP地址
IP地址是用于唯一标识网络设备的数字地址。它分为 IPv4 和 IPv6 两个版本,IPv4 是 32 位地址,而 IPv6 是 128 位地址。常见的 IPv4 地址格式如:192.168.1.1
。
1.2 端口
端口是操作系统用来区分不同网络服务的标识符。一个 IP 地址可以有多个端口,常见的端口号如 HTTP 的 80 端口和 HTTPS 的 443 端口。
1.3 TCP 和 UDP
- TCP(Transmission Control Protocol):一种面向连接的、可靠的传输协议,在通信前需要建立连接,确保数据的完整性和顺序性。
- UDP(User Datagram Protocol):一种无连接、不可靠的传输协议,发送数据时无需建立连接,速度较快但不保证数据到达顺序和完整性。
2. 使用 socket 进行网络编程
socket
是 Python 提供的底层网络编程接口,用于创建网络连接和传输数据。socket
支持 TCP 和 UDP 两种协议。
2.1 使用 TCP 进行网络通信
TCP 是一种可靠的、面向连接的协议,常用于需要保证数据顺序和完整性的应用场景。
示例:TCP 客户端
import socket# 创建TCP客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器
client.connect(('127.0.0.1', 8080))# 发送数据
client.sendall(b'Hello, Server!')# 接收数据
data = client.recv(1024)print(f"Received from server: {data.decode()}")# 关闭连接
client.close()
示例:TCP 服务器
import socket# 创建TCP服务器
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP和端口
server.bind(('127.0.0.1', 8080))# 监听连接
server.listen(5)
print("Server listening on port 8080...")while True:# 接受客户端连接client_socket, client_address = server.accept()print(f"Connection from {client_address}")# 接收数据data = client_socket.recv(1024)print(f"Received: {data.decode()}")# 发送回复client_socket.sendall(b'Hello, Client!')# 关闭客户端连接client_socket.close()
在这个例子中,TCP 客户端和服务器通过 socket
进行通信。服务器使用 bind()
和 listen()
函数来等待客户端连接,并在收到消息后进行回复。
2.2 使用 UDP 进行网络通信
UDP 是一种无连接协议,不保证消息的到达顺序和可靠性,但发送数据速度较快,适用于对实时性要求高的场景,如视频流传输。
示例:UDP 客户端
import socket# 创建UDP客户端
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 发送数据
client.sendto(b'Hello, UDP Server!', ('127.0.0.1', 8080))# 接收数据
data, addr = client.recvfrom(1024)print(f"Received from server: {data.decode()}")# 关闭连接
client.close()
示例:UDP 服务器
import socket# 创建UDP服务器
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定IP和端口
server.bind(('127.0.0.1', 8080))
print("UDP server is waiting for messages...")while True:# 接收数据data, client_address = server.recvfrom(1024)print(f"Received from {client_address}: {data.decode()}")# 发送回复server.sendto(b'Hello, UDP Client!', client_address)
在这个例子中,UDP 客户端和服务器无需建立连接即可发送和接收数据,通信流程简单但不保证数据的到达。
3. 使用 urllib 进行 HTTP 请求
urllib
是 Python 自带的 HTTP 请求库,用于与 Web 服务器进行交互。它支持发送 HTTP 请求并处理响应数据。
3.1 发送 HTTP GET 请求
GET 请求用于从服务器获取数据。
import urllib.requesturl = 'http://www.example.com'
response = urllib.request.urlopen(url)# 读取响应数据
data = response.read()print(data.decode('utf-8'))
3.2 发送 HTTP POST 请求
POST 请求用于向服务器提交数据。
import urllib.request
import urllib.parseurl = 'http://www.example.com/login'
data = urllib.parse.urlencode({'username': 'user', 'password': 'pass'}).encode('utf-8')# 发送POST请求
request = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(request)# 读取响应数据
print(response.read().decode('utf-8'))
4. 使用 requests 进行 HTTP 请求
requests
是一个功能强大且易于使用的第三方 HTTP 请求库,它比 urllib
提供了更简洁的 API。
4.1 安装 requests
首先,使用 pip
安装 requests
:
pip install requests
4.2 发送 HTTP GET 请求
import requestsresponse = requests.get('http://www.example.com')# 读取响应内容
print(response.text)
4.3 发送 HTTP POST 请求
import requestspayload = {'username': 'user', 'password': 'pass'}
response = requests.post('http://www.example.com/login', data=payload)# 读取响应内容
print(response.text)
5. 网络编程中的常见问题
5.1 超时问题
网络通信可能会由于网络问题或服务器响应缓慢而导致超时。可以通过设置超时参数来避免程序长时间等待。
import requeststry:response = requests.get('http://www.example.com', timeout=5)print(response.text)
except requests.Timeout:print("Request timed out")
5.2 异常处理
网络通信时可能会出现各种错误,如连接失败、数据传输中断等。在编写网络程序时,必须捕获并处理这些异常。
import sockettry:client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('127.0.0.1', 8080))
except socket.error as e:print(f"Socket error: {e}")
6. 小结
- TCP 和 UDP 是网络编程的两种常用协议。TCP 保证数据的可靠性和顺序性,适用于大多数网络应用;UDP 速度快但不保证数据的可靠性,适用于实时应用。
- Python 提供了
socket
模块来实现底层网络编程,支持 TCP 和 UDP 的网络通信。 - 对于 HTTP 请求,可以使用 Python 内置的
urllib
或第三方库requests
,其中requests
提供了更加友好的接口。 - 在实际开发过程中,网络程序需要考虑异常处理和超时问题,以保证程序的健壮性和稳定性。
通过掌握这些网络编程的基础知识,你可以开始编写简单的网络应用程序,处理客户端与服务器之间的通信。在此基础上,你还可以进一步学习高级的网络编程技术,如异步编程和高并发处理。
相关文章:
【30天玩转python】网络编程基础
网络编程基础 网络编程是指编写能够在网络上进行通信的程序,通过网络进行数据的发送与接收。Python 提供了许多库和工具来进行网络编程,如 socket、urllib 和 requests。在这篇文章中,我们将介绍网络编程的基础知识,并演示如何使…...

【PCB工艺】如何实现PCB板层间的互连
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议 前言 送给大学毕业后找不到奋斗方向的你…...
FastAPI--如何自定义Docs UI,包括多个APP、静态资源、元数据等
如何mount 一个FastAPI Application? “Mounting” means adding a completely “independent” application in a specific path, that then takes care of handling everything under that path, with the path operations declared in that sub-application. 示例代码 主…...

【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析
一. XDMA IP核两种模式 Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。 而该IP核的另…...

嵌入式-QT学习-小练习
1. 实现多窗口 2. 给按键增加图标 3. 动图展示 结果演示: Mul_Con main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }一、第一个窗口展示 …...
使用 Flask-Limiter 和 Nginx 实现接口访问次数限制
在现代 Web 应用中,针对敏感接口(如短信验证码、登录接口等)的访问次数限制至关重要。通过设置合理的限流策略,可以有效防止接口滥用,避免过多的资源消耗,并提升安全性。本文将通过 Nginx 和 Flask-Limiter…...

【数据结构】排序算法---冒泡排序
文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 冒泡排序(英语:Bubble sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的…...
mysql数据库中事务锁的机制
读锁又称为共享锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 写锁又称为排他锁,简称X锁,排他锁就是不能与其他所并存,如一个事务获取了一个…...
并发工具类-CountDownLatch
CountDownLatch 是 Java 中提供的一种非常有用的并发工具类,位于 java.util.concurrent 包中。它可以使一个或多个线程等待其他线程完成一组特定的操作后再继续执行。CountDownLatch 通过维护一个计数器来实现这一点,计数器的初始值由构造函数设定。每当…...

进程的重要函数
进程的重要函数: fork函数 了解fork函数 通过调用fork()函数,则会产生一个新的进程。调用fork()函数的进程叫做 父进程,产生的新进程则为子进程。 其编码过程: 1.函数功能: 函数头文件 #include <sys/types.h> #include <unistd.h> 函数…...
python 实现average median平均中位数算法
average median平均中位数算法介绍 平均(Mean)和中位数(Median)是统计学中常用的两个概念,用于描述一组数据的中心趋势,但它们并不是算法,而是数据处理的结果。不过,我可以解释如何…...
HTML概述
1. HTML概述 1.1 HTML定义 HTML超文本标记语言,其中超文本是链接,标记也叫标签(即带尖括号的文本)。 1.2 HTML基本骨架 HTML基本骨架是网页模板。 <html><head><title>网页的标题</title></head&…...

【FFT】信号处理——快速傅里叶变换【通俗易懂】
快速傅里叶变换(Fast Fourier Transform, FFT)是一种用于将信号从时间域转换到频率域的算法。 傅里叶变换的核心思想是:任何周期性信号都可以分解成多个不同频率的正弦波或余弦波的叠加。 简单来说,FFT可以帮助我们理解一个信号…...
电脑升级WIN11之后需要注意哪些东西
1.记事本,在前单位时,电脑升级后,记事本会需要手动更新,或手动安装 2.任务栏,WIN11默认任务栏在中间位置,想要调成WIN10一样的位置,分享两个方法 拖拽法(适用于Windows 11 2022年1…...
GEE 教程:利用sentinel-5p数据进行长时序CO一氧化碳的监测分析并结合夜间灯光数据分析
目录 简介 数据 哨兵5号 NOAA/VIIRS/DNB/MONTHLY_V1/VCMCF 函数 ui.Chart.image.series(imageCollection, region, reducer, scale, xProperty) Arguments: Returns: ui.Chart 代码 结果 简介 利用sentinel-5p数据进行长时序CO一氧化碳的监测分析并结合夜间灯光数据…...

【教程】鸿蒙ARKTS 打造数据驾驶舱---前序
鸿蒙ARKTS 打造数据驾驶舱 前面2章我介绍了如何通过定义View绘制箭头以及圆形进度,初步了解了鸿蒙如何进行自定义View。接下来我将通过我最近在带的一个VUE的项目,简单实现了几个鸿蒙原生页面。帮助大家快速上手纯血鸿蒙开发. 本项目基于Api11Stage模…...

Html css样式总结
1.Html css样式总结 CSS 定义 中文名称:层叠样式表 。 英文全称:Cascading Style Sheets ,简称CSS。在网页制作时采用CSS技术,可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。 (1)…...
决策树基础概论
1. 概述 在机器学习领域,决策树(Decision Tree) 是一种高度直观且广泛应用的算法。它通过一系列简单的是/否问题,将复杂的决策过程分解为一棵树状结构,使得分类或回归问题的解决过程直观明了。决策树的最大特点在于可…...

Spring Boot集成Akka Cluster快速入门Demo
1.什么是Akka Cluster? Akka Cluster将多个JVM连接整合在一起,实现消息地址的透明化和统一化使用管理,集成一体化的消息驱动系统。最终目的是将一个大型程序分割成若干子程序,部署到很多JVM上去实现程序的分布式并行运算…...

django学习入门系列之第十点《A 案例: 员工管理系统10》
文章目录 12 管理员操作12.4 密码加密12.5 获取对象(防止id错误--编辑界面等)12.6 编辑管理员12.7 重置密码 往期回顾 12 管理员操作 12.4 密码加密 密码不应该以明文的方式直接存储到数据库,应该加密才放进去 定义一个md5的方法ÿ…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...