python - 网络编程

网络的基本概念

1. IP地址

IP地址是网络中每个设备的唯一标识。在IPv4中,它由四个数字组成,每个数字的范围是0到255,例如192.168.1.1。

案例
假设您想查看自己的计算机IP地址,可以使用Python的socket模块:

import socket
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
print(f"Host name: {hostname}")
print(f"IP Address: {ip_address}")

运行结果

Host name: your_computer_name
IP Address: 192.168.1.100

解释
这段代码首先获取计算机的主机名,然后解析为IP地址。

2. 端口

端口是计算机上运行的进程或服务访问网络的接口,范围从0到65535。HTTP服务通常在端口80运行。

案例
创建一个简单的服务器,监听本地8080端口:

import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen()
print("Server is listening on port 8080")
server_socket.close()

运行结果

Server is listening on port 8080
3. 协议

协议定义了数据如何在网络上进行传输。最常见的协议是TCP/IP和HTTP。

案例
使用TCP协议发送一个简单的消息:

import socket# 创建socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
client_socket.connect(('localhost', 8080))
# 发送数据
client_socket.sendall(b'Hello, server!')
# 关闭连接
client_socket.close()

使用Python的socket模块

在学习Python网络编程中,掌握如何使用socket模块创建客户端和服务器是非常关键的。这里我们会详细介绍如何通过TCPUDP协议进行socket编程,包括代码示例、运行结果及解释,并介绍常见问题及解决方案。

创建基本的TCP客户端和服务器

服务器端:

import socketdef tcp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('localhost', 9999))server_socket.listen(1)print("TCP server is listening on port 9999...")while True:client_socket, addr = server_socket.accept()print(f"Connection from {addr}")data = client_socket.recv(1024)print("Received:", data.decode())client_socket.sendall(b"Hello from server!")client_socket.close()# 调用服务器函数
tcp_server()

客户端:

import socketdef tcp_client():client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('localhost', 9999))client_socket.sendall(b"Hello, server!")response = client_socket.recv(1024)print("Received:", response.decode())client_socket.close()# 调用客户端函数
tcp_client()

运行结果

  • 服务器输出:Connection from ('127.0.0.1', random_port), Received: Hello, server!
  • 客户端输出:Received: Hello from server!

解释
服务器和客户端通过TCP协议建立连接,客户端发送消息后,服务器接收并响应。

创建基本的UDP客户端和服务器

服务器端:

import socketdef udp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_socket.bind(('localhost', 9998))print("UDP server is listening on port 9998...")while True:data, addr = server_socket.recvfrom(1024)print(f"Received from {addr}: {data.decode()}")server_socket.sendto(b"Hello from UDP server!", addr)# 调用服务器函数
udp_server()

客户端:

import socketdef udp_client():client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)message = b"Hello, UDP server!"client_socket.sendto(message, ('localhost', 9998))data, server = client_socket.recvfrom(1024)print("Received:", data.decode())client_socket.close()# 调用客户端函数
udp_client()

运行结果

  • 服务器输出:Received from ('127.0.0.1', random_port): Hello, UDP server!
  • 客户端输出:Received: Hello from UDP server!

解释
UDP服务器和客户端不建立持久的连接,客户端直接发送数据到服务器,服务器处理后返回响应。

TCP与UDP的区别
  • 连接:TCP是面向连接的(需要建立连接),UDP是无连接的。
  • 可靠性:TCP保证数据正确性和顺序,UDP可能丢包。
  • 速度:TCP较慢,UDP较快。
常见问题与解决方案
  1. 问题:客户端连接失败。

    • 解决方案:确认服务器地址和端口号正确,服务器已经启动。
  2. 问题:数据发送/接收不完整。

    • 解决方案:对于TCP,增加数据接收循环直到接收到所有数据;对于UDP,检查数据包大小不要超过缓冲区。
  3. 问题:端口已在使用。

    • 解决方案:更换端口或检查端口是否被其他程序占用。
  4. 问题:网络延迟或连接中断。

    • 解决方案:实现超时重连逻辑,使用心跳机制检查连接状态。
  5. 问题:接收到异常数据或格式错误。

    • 解决方案:在数据发送前后添加特定格式或标识,接收时进行检查和验证。

这些基础知识和示例将帮助你理解并开始使用Python进行TCP和UDP的网络编程。

线程、进程和异步编程

多线程和并发编程是编写高效和响应式程序的重要组成部分,尤其在处理需要同时进行多项任务的网络编程时尤为重要。这里,我们将深入了解线程、进程和异步编程的概念,并通过使用Python的threadingmultiprocessingasyncio模块来展示这些概念的具体应用。

概念
  1. 线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程共享进程的资源。
  2. 进程:进程是操作系统结构的基础,是资源分配和执行的单位,包括内存空间、文件、状态等。每个进程至少包含一个线程。
  3. 异步编程:异步编程是一种编程模式,用于独立于主程序线程执行任务,使主程序可以在等待任务完成时继续执行,提高应用效率。

使用threadingmultiprocessing模块实现并发

threading模块

案例
使用threading模块创建两个并发执行的线程,每个线程打印0到4的数字。

import threading
import timedef print_numbers(thread_name):for i in range(5):print(f"{thread_name} prints {i}")time.sleep(1)# 创建线程
thread1 = threading.Thread(target=print_numbers, args=("Thread1",))
thread2 = threading.Thread(target=print_numbers, args=("Thread2",))# 启动线程
thread1.start()
thread2.start()# 等待线程完成
thread1.join()
thread2.join()

运行结果

Thread1 prints 0
Thread2 prints 0
Thread1 prints 1
Thread2 prints 1
...

解释
这个示例展示了如何使用线程进行并发执行,线程1和线程2交替执行。

multiprocessing模块

案例
使用multiprocessing模块计算两个数组的点积。

from multiprocessing import Process, Queuedef dot_product(vec1, vec2, out_queue):out_queue.put(sum(x * y for x, y in zip(vec1, vec2)))vec1 = [1, 2, 3]
vec2 = [4, 5, 6]
queue = Queue()
process = Process(target=dot_product, args=(vec1, vec2, queue))process.start()
process.join()
result = queue.get()
print("Dot product:", result)

运行结果

Dot product: 32

解释
这个示例通过进程计算两个向量的点积,使用队列来获取进程的输出结果。

学习asyncio模块和异步IO

案例
使用asyncio模块创建一个简单的异步网络请求。

import asyncioasync def fetch_data():print("Start fetching")await asyncio.sleep(2)  # 模拟IO操作print("Done fetching")return {'data': 1}async def main():result = await fetch_data()print("Result:", result)# 运行异步主函数
asyncio.run(main())

运行结果

Start fetching
Done fetching
Result: {'data': 1}

解释
这个示例中,fetch_data函数模拟了一个异步的IO操作,main函数等待它完成,并打印结果。

常见问题与解决方案

  1. 问题:线程之间的数据竞争。

    • 解决方案:使用锁(threading.Lock())或其他同步机制来保护数据。
  2. 问题:进程间通信复杂。

    • 解决方案:使用队列(multiprocessing.Queue())或管道(`multip

rocessing.Pipe()`)。

  1. 问题asyncio任务长时间未响应。

    • 解决方案:设置超时时间,例如使用asyncio.wait_for()
  2. 问题:主线程结束时,其他线程还未完成。

    • 解决方案:在主线程中使用thread.join()确保所有线程完成。
  3. 问题:异步函数嵌套调用复杂。

    • 解决方案:使用async/await语法清晰地组织异步代码。

通过这些实例和解释,希望你能对Python的多线程、多进程和异步编程有更深的理解和应用。

更多问题咨询

Cos机器人

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

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

相关文章

比较美观即将跳转html源码

源码介绍 比较美观即将跳转html源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面 源码截图 比较美观的一个跳转界面,修改方法如上&…

Vitis HLS 学习笔记--AXI4 主接口

目录 1. 简介 2. 认识MAXI 3. MAXI突发操作 3.1 全局/本地存储器 3.2 MAXI优势与特点 3.3 查看MAXI报告 3.3.1 HW Interfaces 3.3.2 M_AXI Burst Information 3.4 MAXI 资源消耗 4. 理解 Volatile 4.1 标准C/C中的 volatile 4.2 HLS 中的 volatile 5. 总结 1. 简介…

idea中使用GlassFish服务器启动项目

idea中使用GlassFish服务器进行测试 1.项目背景 当前在研究openMDM项目, 不过该项目不是springboot项目, 并且是使用GlassFish进行war部署的, 但是需要在idea中进行项目的二次开发,故需要进行idea启动项目并且进行开发和调试 2.GlassFish是什么 GlassFish是一个web服务器, …

ROS学习笔记(14)拉普拉斯变换和PID

0.前提 近些时间在对睿抗的ROS仿真赛进行小组安排,对小组成员进行了一些安排,也要求他们以本次比赛写下自己的比赛经历博客,他们的培训由我来安排和负责,因此我得加吧油,起码保证我的进度得快过他们,才能安…

图像处理技术与应用(三)

图像处理技术与应用入门 图像信息 切片 from skimage import io # 使用 io.imread() 函数来读取图像 img io.imread(cc.jpg) ] roi img[100:5000, 500:1780] # 显示ROI区域 io.imshow(roi) io.show() # 显示图像 红色文字段定义感兴趣的区域(ROI&#xff09…

ArcGIS基础:便捷分享图层包和地图包

1、分享图层包: 首先,选中要分享的数据,右键创建图层包,修改保存路径。 找到项目描述那一栏,将摘要、标签、描述都填写分享图层包的相关内容。 一切设置好之后,点击右上角的【分析】按钮。 点击分析之后…

【PyTorch与深度学习】2、PyTorch张量的运算API(上)

课程地址 最近做实验发现自己还是基础框架上掌握得不好,于是开始重学一遍PyTorch框架,这个是课程笔记,这个课还是讲的简略,我半小时的课听了一个半小时。 1. 张量 1.1 张量操作 (1)chunk:将一…

蓝桥杯ctf2024 部分wp

数据分析 1. packet 密码破解 1. cc 逆向分析 1. 欢乐时光 XXTEA #include<stdio.h> #include<stdint.h> #define DELTA 0x9e3779b9 #define MX (((z>>5^y<<2)(y>>3^z<<4))^((sum^y)(key[(p&3)^e]^z))) void btea(unsigned int* v…

Linux软件包管理器——yum

文章目录 1.什么是软件包1.1安装与删除命令1.2注意事项1.3查看软件包1.3.1注意事项&#xff1a; 2.关于rzsz3.有趣的Linux下的指令 -sl 1.什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

单路双电源三态控制的电平转换总线收发器AiP74LVC1T45

AiP74LVC1T45框图 AiP74LVC1T45引脚定义 AiP74LVC1T45丝印 概述 AiP74LVCH1T45是一个双电源带三态控制的总线收发器&#xff0c;具有3状态输出&#xff0c;可实现双向电平转换。它们具有两个1位输入输出端口(A和B)&#xff0c;一个方向控制输入(DIR)和双电源引脚(VCC(A)和VCC(…

C语言 | Leetcode C语言题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; #define max(a, b) (((a) > (b)) ? (a) : (b))bool canJump(int* nums, int numsSize){int cover 0;int i;// 只可能获取cover范围中的步数&#xff0c;所以i<coverfor(i 0; i < cover; i) {// 更新cover为从i出发能到达的最大…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址&#xff1a;https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程&#xff08;优先级从先到后&#xff09; 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows&#xff1a;C:\Windows\System32\drivers\etc\hostsLinux&#xff1a;/etc/hosts 使用外部的域名解析服务器解析&#xff…

LMDeploy 量化部署 LLM-VLM 实践 学习笔记

视频链接 https://www.bilibili.com/video/BV1tr421x75B/?vd_sourcea1ce254b4a97f9f687a83e661793cb2c 什么是模型部署 部署指的是已经开发好的大模型投入使用&#xff0c;要把模型部署到服务器或者移动端里&#xff0c;如何在有限的资源里加载大模型&#xff1f; 比如你好不…

网络安全 SQLmap-tamper的使用

目录 使用SQLmap Tamper脚本 1. 选择合适的Tamper脚本 2. 在命令行中使用Tamper脚本 3. 组合使用Tamper脚本 4. 注意和考虑 黑客零基础入门学习路线&规划 网络安全学习路线&学习资源 SQLmap是一款强大的自动化SQL注入和数据库取证工具。它用于检测和利用SQL注入漏…

计算机网络之传输层TCP\UDP协议

UDP协议 用户数据报协议UDP概述 UDP只在IP数据报服务之上增加了很少功能&#xff0c;即复用分用和差错检测功能 UDP的主要特点&#xff1a; UDP是无连接的&#xff0c;减少开销和发送数据之前的时延 UDP使用最大努力交付&#xff0c;即不保证可靠交付&#xff0c;可靠性由U…

关于google search console工具提交sitemap.xml无法抓取的问题解决办法

其实这个问题很好解决。 第一种情况&#xff1a;利用工具为我们的网站自动生成静态的sitemap.xml文件。这种可以检查下是否完整&#xff0c;然后上传到根目录下去&#xff0c;再去google search console提交我们的网站地图。 第二种情况&#xff1a;同样利用工具自动生成动态s…

AI图书推荐:AI驱动增长—ChatGPT和Bard 用于企业流程自动化

这本书《AI驱动增长—ChatGPT和Bard 用于企业流程自动化》&#xff08;ChatGPT and Bard for Business Automation: Achieving AI-Driven Growth&#xff09;由Tom Taulli撰写&#xff0c;主要探讨了ChatGPT和Bard两种人工智能技术在商业自动化中的应用&#xff0c;以及如何通过…

逆向案例三十——webpack登录某游戏

网址&#xff1a;aHR0cHM6Ly93d3cuZ205OS5jb20v 步骤&#xff1a; 进行抓包分析&#xff0c;找到登录接口&#xff0c;发现密码有加密 跟栈分析&#xff0c;从第三个栈进入&#xff0c;打上断点&#xff0c;再次点击登录 明显找到password,它由o赋值&#xff0c;o由a.encode(…