当前位置: 首页 > news >正文

【30天玩转python】网络编程基础

网络编程基础

网络编程是指编写能够在网络上进行通信的程序,通过网络进行数据的发送与接收。Python 提供了许多库和工具来进行网络编程,如 socketurllibrequests。在这篇文章中,我们将介绍网络编程的基础知识,并演示如何使用 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 提供了更加友好的接口。
  • 在实际开发过程中,网络程序需要考虑异常处理和超时问题,以保证程序的健壮性和稳定性。

通过掌握这些网络编程的基础知识,你可以开始编写简单的网络应用程序,处理客户端与服务器之间的通信。在此基础上,你还可以进一步学习高级的网络编程技术,如异步编程和高并发处理。


http://www.mrgr.cn/news/29184.html

相关文章:

  • 基于表格滚动截屏(表格全部展开,没有滚动条)
  • 23.网工入门篇--------介绍一下园区网典型组网架构及案例实践
  • Hadoop学习--第一章 Hello大数据分布式
  • HTML之表单学习记录
  • 大数据技术在金融风控中的应用
  • vue2使用 <component> 标签动态渲染不同的表单组件
  • python爬虫之正则表达式(3)
  • java日志框架之JUL(Logging)
  • JavaScrip中的this、作用域代码输出题
  • 深入理解Redis:缓存穿透、缓存击穿、缓存雪崩及双写一致性
  • 【乐企-业务篇】乐企前置条件规则枚举
  • 基于Qt的串口调试工具串口常见问题
  • NASA:ATLAS/ICESat-2 L3 A陆地冰高度,版本6
  • Java应用的数据库连接池连接回收策略
  • 使用MongoDB存储和查询数据的Python函数实现
  • Java | Leetcode Java题解之第413题等差数列划分
  • 数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2
  • 输煤传送带异物识别检测数据集 yolo数据集 2400张
  • 创建自定义LLM类:更灵活地使用你的语言模型
  • 通信工程学习:什么是OLT光线路终端
  • 在Unity UI中实现UILineRenderer组件绘制线条
  • 【强化学习】如何在不提供标签的情况下通过试错的方式来学习?
  • java四种内置线程池介绍
  • Python面试宝典第49题:字符串压缩
  • DigiDNA推出iMazing 3.0.4,支持Apple Vision Pro
  • 【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作