【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的方法ÿ…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
Electron简介(附电子书学习资料)
一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...
若依项目部署--传统架构--未完待续
若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...
