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 socket

server_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 socket

def 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 socket

def 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 socket

def 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 socket

def 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 time

def 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, Queue

def 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 asyncio

async 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.mfbz.cn/a/582307.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask框架进阶-Flask流式输出和受访配置--纯净详解版

Flask流式输出🚀 在工作的项目当中遇到了一种情况,当前端页面需要对某个展示信息进行批量更新,如果直接将全部的数据算完之后,再返回更新,则会导致,前端点击刷新之后等待时间过长,开始考虑到用进…

电脑录制视频快捷键,一键开启录屏新时代(干货)

“最近尝试录制一些电脑上的操作视频,用来制作教学教程。不过,每次录制都要通过菜单或搜索来打开录屏软件,实在是有些繁琐。有没有人知道哪些电脑录制视频的快捷键呀?或者有没有通用的快捷键设置方法?” 在当今数字时…

CMake+qt+Visual Studio

#使用qt Creator 创建Cmake 项目,使用Cmake Gui 生成sln 工程,使用Visual Studio 开发 ##使用qt Creator 创建CMake项目 和创建pro工程的步骤一致,只是在选择构建系统的步骤上选择CMake,接下来步骤完全相同 工程新建完成之后,构建cmake 项…

PE文件(三)节表作业

本次作业以notepad进行演示,如下是其在硬盘上的内存 1.手动解析节表 由标准pe头可知,一共由7个节也就是7个节表,可选pe头的大小是0X00F0,即240字节大小 根据上述我们所获取的信息,找到节表的首地址为0x01F8 .text …

微服务:Nacos注册中心

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Nacos注册中心 一、服务注册与发现1.启动Nacos…

Vite proxy-rewrite 属性详解

在前端开发中,为了避免跨域问题,我们会在vite.config.ts 中配置如下问题 rewrite: 由于不了解Nginx的知识,这个属性一直困扰着我,这个重写有啥用,加和不加有啥影响 server: {host: 0.0.0.0,proxy: {/api: {target: ht…

手机通讯录删除了怎么恢复?这里几个方法超快找回!

当我们不小心删除了手机通讯录中的联系人,或者手机丢失导致通讯录信息丢失,恢复通讯录就变得非常重要了。手机通讯录删除了怎么恢复?我们该如何快速找回这些重要的联系人信息呢?下面我们将介绍2种简单易行的方法,帮助您…

Spark核心名词解释与编程

Spark核心概念 名词解释 1)ClusterManager:在Standalone(上述安装的模式,也就是依托于spark集群本身)模式中即为Master(主节点),控制整个集群,监控Worker。在YARN模式中为资源管理器ResourceManager(国内…

树莓集团整合行业资源 优化数字产业生态圈

树莓集团,作为国际数字影像产业园的运营方以及链主企业,自创立以来,一直致力于整合行业优质资源,为数字科技领域的优秀企业提供一片肥沃的创新土壤。随着信息技术的迅猛发展和数字经济的深入推进,树莓集团深知自身的责…

七彩虹(Colorful)隐星P16 2023款笔记本电脑原装出厂Win11系统镜像下载 带建Recovery一键还原功能

七彩虹原厂Windows预装OEM专用系统,恢复出厂开箱状态一模一样 适用型号:隐星P16 23 链接:https://pan.baidu.com/s/1Ig5MQMiC8k4VSuCOZRQHUw?pwdak5l 提取码:ak5l 原厂W11系统自带所有驱动、出厂时自带的主题与专用壁纸、系…

机器学习在医疗行业的应用:颠覆传统诊疗模式,开启智慧医疗新时代

文章目录 一、精准诊断的突破二、药物研发的革新三、患者管理的智能化四、智能辅助决策系统五、机器学习在医疗行业的前景 随着科技的飞速发展,机器学习作为人工智能的核心技术,正逐渐渗透到各个行业中,其中在医疗行业的应用尤为引人瞩目。机…

Strassen矩阵乘法——C++

【题目描述】 根据课本“Strassen矩阵乘法”的基本原理,设计并实现一个矩阵快速乘法的工具。并演示至少10000维的矩阵快速乘法对比样例。 【功能要求】 实现普通矩阵乘法算法和“Strassen矩阵乘法”算法对相同的矩阵,分别用普通矩阵乘法算法&#xff…

电机控制系列模块解析(11)—— 电流采样

一、电流采样分类 由下图可知,采样电阻的位置不同,电流采样分为输出电流采样、下桥电流采样、母线电流采样。 输出电流采样 定义:输出电流采样是指对电机定子绕组或转子绕组(对于内转子永磁同步电机)输出的电流进行测…

什么是区块链?智能合约有什么用?

一、什么是区块链? 区块链是一种去中心化的分布式账本技术,通过加密和共识机制确保数据的安全和透明。它将交易数据按照时间顺序记录在区块中,并通过链式链接保证了数据的不可篡改性。 二、什么是智能合约? 智能合约是运行在区…

如何修改php版本

我使用的Hostease的Windows虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机,但是没有找到切换PHP以及查看PHP有哪些版本的位置,因此咨询了Hostease的技术支持,寻求帮助了解到可以实现在Plesk面板上找到此切换PHP版本的按钮…

linux tcpdump的交叉编译以及使用

一、源码下载 官网:点击跳转 二、编译 1、解压 tar -xf libpcap-1.10.4.tar.xz tar -xf tcpdump-4.99.4.tar.xz 2、配置及编译 //libpcap: ./configure --hostarm-linux --targetarm-linux CCarm-linux-gcc --with-pcaplinux --prefix$PWD/build//t…

37 线程控制

内核中没有明确的线程的概念,线程作为轻量级进程。所以不会提供线程的系统调用,只提供了轻量级进程的系统调用,但这个接口比较复杂,使用很不方便,我们用户,需要一个线程的接口。应用层对轻量级进程的接口进…

企业如何保证内部传输文件使用的工具是安全的?

企业内部文件的频繁交换成为了日常运营不可或缺的一环。然而,随着数据量的爆炸式增长和网络攻击手段的日益复杂,内网文件传输的安全隐患也日益凸显,成为企业信息安全的薄弱环节。本文将探讨内网文件传输的安全风险、企业常用的防护措施。 内网…

Python轻量级Web框架Flask(12)—— Flask类视图实现前后端分离

0、前言: 在学习类视图之前要了解前后端分离的概念,相对于之前的模板,前后端分离的模板会去除views文件,添加两个新python文件apis和urls,其中apis是用于传输数据和解析数据 的,urls是用于写模板路径的。 …