首页 > 编程语言 >深入Python网络编程:从基础到实践

深入Python网络编程:从基础到实践

时间:2023-06-25 10:35:50浏览次数:44  
标签:socket Python 编程 实践 网络 import requests

Python,作为一种被广泛使用的高级编程语言,拥有许多优势,其中之一就是它的网络编程能力。Python的强大网络库如socket, requests, urllib, asyncio,等等,让它在网络编程中表现优秀。本文将深入探讨Python在网络编程中的应用,包括了基础的socket编程,到高级的异步IO网络编程,以及我们如何能够充分利用这些工具来开发网络应用。

Socket编程基础

Socket是网络编程的基石。Python的socket模块提供了一套简单的API,可以帮助我们快速地建立网络连接。让我们先来看一个简单的服务器和客户端之间通信的例子:

服务器端:

import socket

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定端口
s.bind(('localhost', 12345))

# 设置最大连接数,超过后排队
s.listen(5) 

while True:
    # 建立客户端连接
    c, addr = s.accept()      
    print ('Got connection from', addr)
    
    # 发送数据
    c.send('Thank you for connecting'.encode())
    
    # 关闭连接
    c.close()                

客户端:

import socket              

# 创建 socket 对象
s = socket.socket()         

# 连接到服务器
s.connect(('localhost', 12345))

# 接收数据
print (s.recv(1024).decode())
s.close()                     

运行服务器端代码,然后运行客户端代码,输出如下:

Got connection from ('127.0.0.1', 51768)
Thank you for connecting

这里使用的是TCP协议进行通信,TCP是一种面向连接的协议,它保证了两台计算机之间的稳定通信。

Socket编程基础及其实践

如上所述,Socket是网络编程的基石。Python的socket模块提供了一套简单的API,以帮助我们快速地建立网络连接。让我们通过一个聊天室应用来更深入地理解socket编程:

# 这是一个简单的命令行聊天室服务器

import socket
import select

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen(10)
inputs = [server_socket]

while inputs:
    rs, _, _ = select.select(inputs, [], [])

    for r in rs:
        if r is server_socket:
            client_socket, _ = r.accept()
            inputs.append(client_socket)
        else:
            msg = r.recv(1024)
            if not msg:
                inputs.remove(r)
            else:
                for socket in inputs:
                    if socket is not server_socket:
                        socket.send(msg)

这个服务器使用select模块来同时处理多个socket连接。当新的客户端连接进来时,它就将这个新的socket添加到输入列表中。当服务器收到一个消息时,它就将这个消息转发给所有其他的客户端。

HTTP网络请求

在Python中,我们常常使用requests库进行HTTP请求。它的使用方法非常直观,让我们看一个简单的例子:

import requests

# 发起 GET 请求
response = requests.get('https://www.example.com')

# 输出响应的文本信息
print(response.text)

HTTP网络请求及其高级用法

在Python中,我们常常使用requests库进行HTTP请求。然而,requests库除了基础的GET,POST请求之外,还支持更多高级的功能,比如session对象、cookie处理和代理设置等。

比如我们可以使用session对象来维持一个会话,这在需要登录后才能访问的网站上非常有用:

import requests

s = requests.Session()

# 先进行登录
s.post('http://httpbin.org/post', data = {'key':'value'})

# 然后访问需要登录后才能看到的页面
r = s.get('http://httpbin.org/cookies')
print(r.text)

异步IO网络编程

Python的 asyncio 库为我们提供了异步IO的能力,让我们可以在网络编程中实现更高效的IO操作。下面是一个简单的异步网络请求的例子:

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

网络数据抓取

Python的网络编程能力也使其成为网络数据抓取的绝佳工具。比如我们可以使用BeautifulSoup库来解析HTML,并抓取我们需要的信息:

import requests
from bs4 import BeautifulSoup

# 发起请求
r = requests.get('http://example.com')

# 解析HTML
soup = BeautifulSoup(r.text, 'html.parser')

# 抓取所有的链接
links = [a['href'] for a in soup.find_all('a', href=True)]
print(links)

Web开发

Python在Web开发方面也表现出色。比如我们可以使用Flask库来快速地开发一个web应用:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello():
    return render_template('index.html')

if __name__ == "__main__":
    app.run()

Flask可以让我们快速地创建一个web应用,而且它还支持路由、模板渲染和静态文件等web开发的基础功能。

FTP服务

你知道Python还可以作为一个FTP服务器吗?pyftpdlib是一个强大的,高度可配置的FTP服务器库。它支持FTP的大部分命令,而且由于它是纯Python编写的,所以在任何Python支持的平台上都可以运行。

One More Thing...

最后,让我分享一个很有用但又很少人知道的技巧:使用Python的http.server

块快速创建一个简单的web服务器。只需要在命令行中输入以下命令:

python -m http.server

这条命令将在你的机器上启动一个简单的HTTP服务器,默认端口为8000。这对于快速分享文件或者进行一些简单的web开发非常有用。

以上就是Python在网络编程方面的基础知识和一些高级用法,希望这些信息能对你有所帮助。

如有帮助,请多关注
个人微信公众号:【Python全视角】
TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

标签:socket,Python,编程,实践,网络,import,requests
From: https://www.cnblogs.com/xfuture/p/17502303.html

相关文章

  • 【雕爷学编程】Arduino动手做(125)---WT588D语音模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • Python的异步
    SimpleDemo错误示范code:importasyncioasyncdeftest(id):print(id,"开始执行")awaitasyncio.sleep(5)print(id,"执行结束")asyncio.run(test(1))asyncio.run(test(2))output:1开始执行1执行结束2开始执行2执行结束这样是不支持异步的,原......
  • Python3 configparser读取含有中文配置config.ini(Windows)显示乱码的解决方法
    最近在配置文件config.ini有中文输出时,python3打印出来显示乱码。初步判断是由于编码问题。在Python3中虽有encoding参数,但是对于有BOM(如Windows下用记事本指定为utf-8)的文件,需要使用utf-8-sig,使用utf-8没办法。配置文件config.ini如下:[TABLEDATA]project_name......
  • 笔记本输入python无提示、也无报错(不提示“不是内部或外部命令,也不是可运行的程序”)
    最近在安装Python的时候发生了很奇怪的现象(安装前):从命令行执行python并不会输出python版本信息,似乎也没有其他反应,也无报错(不提示“不是内部或外部命令,也不是可运行的程序”),再次输入命令wherepython显示C:\Users\quxw\AppData\Local\Microsoft\WindowsApps\python.exe,如下......
  • requests Python中最好用的网络请求工具 基础速记+最佳实践
    简介requests模块是写python脚本使用频率最高的模块之一。很多人写python第一个使用的模块就是requests,因为它可以做网络爬虫。不仅写爬虫方便,在日常的开发中更是少不了requests的使用。如调用后端接口,上传文件,查询数据库等。本篇详细介绍requests的使用。requests是⽤Python......
  • 强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
    强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v01、定义算法相比于Qlearning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到了NatureDQN(即VolodymyrMnih发表的Nature论文)这里才算是基本完善。DQN主要改动的点有三个:使用深度神经网络替......
  • python篇-kivy-kv
    1,Label  遗留问题:加上 markup:True之后,文本不显示了  解决方法:把text_size和color属性注释掉就出现了kivytest.py#coding:utf-8fromkivy.appimportAppfromkivy.uix.floatlayoutimportFloatLayoutfromkivy.uix.labelimportLabelclassKvTest(FloatLa......
  • 百度Amis+React低代码实践
    背景在项目中有集成低代码平台的想法,经过多方对比最后选择了amis,主要是需要通过amis进行页面配置,导出json供移动端和PC端进行渲染,所以接下来讲一下近两周研究amis的新的以及一些简单经验,供大家参考.什么是amisamis是一个低代码前端框架,它使用JSON配置来生成......
  • [ARM 汇编]高级部分—性能优化与调试—3.4.2 ARM汇编程序调试技巧
    在ARM汇编程序开发过程中,调试是一个关键环节。适当的调试技巧可以帮助我们更快地定位问题、解决问题,从而提高开发效率。本节将讲解一些ARM汇编程序的调试技巧,并通过实例进行讲解。使用GDB调试GDB(GNU调试器)是一个功能强大的调试工具,它支持ARM汇编程序的调试。以下是使用GDB进行......
  • Python装饰器
    简单装饰器1.装饰器的本质就是一个函数,在不改变原函数功能的情况下,动态为函数增加功能definfo(func):--本质就是一个函数print(f'调用函数->{func.__name__}')returnfunc......