Python网络编程基础:探索网络的未知领域

写在开头

在当今数字化时代,网络已经贯穿我们生活的方方面面,成为信息传递和交流的重要媒介。而Python,作为一门强大而灵活的编程语言,自然也在网络编程领域展现出其强大的一面。本文将带领读者进入Python网络编程的未知领域,深入了解网络基础概念、使用Socket进行网络通信的冒险,以及创建简单的客户端-服务器应用的探索过程。

1.网络基础概念:迷人的网络世界

首先,我们来了解一些基础概念,深入网络的迷人世界。网络是由许多相互连接的计算机组成的,它们通过数据链路进行通信。在这个网络中,数据被分割成小的数据包,通过各种协议在计算机之间传递。

1.1 IP地址

IP地址(Internet Protocol Address)

IP地址是用于在网络中唯一标识设备的标识符。它是一个由32位(IPv4)或128位(IPv6)二进制数字组成的地址,用于确保在网络上唯一标识每个设备。IP地址的作用类似于电话号码,它使得数据能够从一个设备传输到另一个设备。IP地址分为内网IP地址和公网IP地址:

  1. 内网IP地址: 在局域网中使用的IP地址,用于在局域网内部识别设备。内网IP地址通常由路由器分配,用于局域网内的通信,但不能直接从互联网访问。

    示例:192.168.1.1

  2. 公网IP地址: 在全球互联网中使用的IP地址,用于在互联网上唯一标识设备。公网IP地址是全球唯一的,使设备能够在互联网上相互通信。

    示例:203.0.113.1

在Python中,你可以使用 socketrequests 库来获取自己电脑的内网IP和公网IP。

获取内网IP

import socketdef get_local_ip():try:# 获取本机电脑名host_name = socket.gethostname()# 获取本机iplocal_ip = socket.gethostbyname(host_name)return local_ipexcept Exception as e:print(f"获取本机IP失败:{e}")return None# 调用函数获取内网IP
local_ip = get_local_ip()
if local_ip:print(f"本机内网IP地址:{local_ip}")
else:print("获取本机内网IP失败")

获取公网IP

import requestsdef get_public_ip():try:# 通过访问一个返回客户端公网IP的API获取公网IPresponse = requests.get("https://api64.ipify.org?format=json")if response.status_code == 200:public_ip = response.json()["ip"]return public_ipelse:print(f"获取公网IP失败,HTTP状态码:{response.status_code}")return Noneexcept Exception as e:print(f"获取公网IP失败:{e}")return None# 调用函数获取公网IP
public_ip = get_public_ip()
if public_ip:print(f"本机公网IP地址:{public_ip}")
else:print("获取本机公网IP失败")

请注意:

  1. 获取内网IP的方法适用于在有网络连接的情况下,通过本机主机名获取内网IP。如果主机名无法解析或网络不可用,可能会导致获取失败。

  2. 获取公网IP的方法通过访问一个提供公网IP的API来获取。在使用此方法时,请确保你的网络连接正常,而且能够访问该API。

1.2 端口号

端口号是用于标识主机上运行的特定应用程序的数字。一个IP地址与一个端口号组合在一起,形成一个套接字(Socket),套接字用于在网络上唯一标识一个进程。端口号的范围是从0到65535,其中0到1023是被保留用于系统服务或常见应用的“知名端口”,而1024到49151是用于注册应用的“注册端口”,49152到65535是动态或私有端口。

  • 知名端口(Well-Known Ports): 0到1023的端口号,通常被一些知名的网络服务使用,如HTTP(80端口)、HTTPS(443端口)、FTP(21端口)等。

  • 注册端口(Registered Ports): 1024到49151的端口号,可以被用户注册的应用或服务使用。

  • 动态或私有端口(Dynamic or Private Ports): 49152到65535的端口号,用于动态分配,一般由客户端应用程序使用。

在网络通信中,源和目标设备之间的通信通过IP地址和端口号的组合实现。例如,一个Web服务器可能监听80端口,客户端通过访问服务器的IP地址和端口号80来获取Web页面。端口号是网络通信中非常重要的一部分,它确保正确的数据到达正确的应用程序。

1.3 协议

网络协议是计算机网络中设备之间进行通信和数据交换的规则和约定的集合。它定义了数据的格式、传输方法、错误检测和纠正等一系列通信细节,确保不同设备和系统之间能够顺利、有效地进行数据交流。网络协议是计算机网络正常运行的基础,它负责管理数据的传输、路由、错误处理以及安全性等方面。

以下是一些常见的网络协议:

  1. TCP/IP协议族: TCP/IP(Transmission Control Protocol/Internet Protocol)是互联网上使用最广泛的一组协议。它包括多个协议,其中最重要的是TCP和IP:

    • TCP(Transmission Control Protocol): 提供可靠的、面向连接的数据传输服务。TCP确保数据的顺序和可靠性,适用于需要高可靠性的应用,如文件传输和网页浏览。

    • IP(Internet Protocol): 负责在网络中寻址和路由,将数据包从源主机传递到目标主机。IPv4和IPv6是两个主要版本的IP协议。

  2. HTTP(Hypertext Transfer Protocol): 用于在Web浏览器和Web服务器之间传递超文本文档。HTTP是无状态的协议,每个请求和响应之间没有状态保持。

  3. HTTPS(Hypertext Transfer Protocol Secure): 基于HTTP协议,通过TLS/SSL加密保护数据传输的协议。HTTPS用于安全的、加密的Web通信,对敏感信息的传输提供了保护。

  4. FTP(File Transfer Protocol): 用于在网络上传输文件的协议。FTP支持上传和下载文件,以及对文件进行管理。

  5. SMTP(Simple Mail Transfer Protocol): 用于电子邮件的传输。SMTP负责发送电子邮件,确保电子邮件从发件人到达收件人的可靠传输。

  6. POP3(Post Office Protocol version 3): 用于从邮件服务器接收电子邮件的协议。POP3允许用户下载邮件到本地设备,通常与SMTP一起使用。

  7. IMAP(Internet Message Access Protocol): 与POP3类似,用于接收电子邮件。IMAP允许用户在邮件服务器上保留邮件的副本,并能够在不同设备上同步邮件状态。

  8. DNS(Domain Name System): 用于将域名(如www.example.com)解析为IP地址。DNS通过域名解析,使用户更方便地访问Internet上的服务。

  9. UDP(User Datagram Protocol): 与TCP一样属于传输层的协议,但是是无连接的、不可靠的协议。UDP适用于实时性要求高、且可以容忍一些数据丢失的场景,如音频和视频流传输。

这些协议构成了互联网上通信的基础,每个协议都有其特定的用途和工作方式。网络协议的存在使得不同设备、操作系统和应用程序能够在互联网上协同工作,实现数据的传输和共享。

2. 使用Socket进行网络通信的冒险

在Python中,Socket是一种通信机制,可以通过它在不同计算机之间传递数据。我们将使用Socket进行网络通信的冒险,通过建立连接、传输数据,来感受网络的魅力。

2.1 Socket 包介绍

在Python中,socket 是用于网络编程的标准库,提供了一组丰富的函数和类,用于创建和管理套接字,从而实现网络通信。

2.1.1. 创建套接字

使用 socket.socket() 函数可以创建一个新的套接字对象。该函数需要两个参数,第一个参数是地址族,第二个参数是套接字类型。

import socket# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2.1.2. 绑定和监听

通过 bind() 方法将套接字绑定到一个地址和端口号,然后使用 listen() 方法开始监听连接请求。

server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)
server_socket.listen(5)

2.1.3. 接受连接

使用 accept() 方法接受客户端的连接请求,并返回一个新的套接字对象和客户端地址。

client_socket, client_address = server_socket.accept()

2.1.4. 发送和接收数据

使用 send() 方法发送数据,使用 recv() 方法接收数据。

data = b'Hello, Server!'
client_socket.send(data)received_data = client_socket.recv(1024)

2.1.5. 关闭连接

使用 close() 方法关闭套接字连接。

client_socket.close()
server_socket.close()

2.1.6. 异常处理

在网络编程中,异常处理是非常重要的一部分。Socket 提供了一些异常类型,如 socket.error,用于处理套接字操作中可能发生的错误。

try:# Socket 操作
except socket.error as e:print(f"Socket 出现错误: {e}")

2.1.7. UDP套接字

除了TCP套接字外,socket 包也支持创建UDP套接字。

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

2.1.8. SSL套接字

对于安全的通信,socket 包支持通过 ssl 模块创建SSL套接字。

import sslcontext = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_socket = context.wrap_socket(server_socket, server_side=True)

2.1.9. 异步IO

在异步编程中,socket 可以与 asyncio 结合使用,实现非阻塞的异步IO操作。

import asyncioasync def handle_client(reader, writer):# 异步处理客户端请求server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)
await server.serve_forever()

2.1.10. 设置选项

setsockopt() 方法允许设置套接字选项,如超时时间等。

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

2.1.11. 获取本地和远程地址信息

使用 getsockname() 方法可以获取套接字的本地地址信息,而 getpeername() 方法可以获取远程地址信息。

local_address = server_socket.getsockname()
remote_address = client_socket.getpeername()

2.1.12. 非阻塞套接字

可以使用 setblocking() 方法将套接字设置为非阻塞模式。

server_socket.setblocking(False)

2.1.13. 超时设置

使用 settimeout() 方法可以设置套接字的超时时间,避免长时间等待。

server_socket.settimeout(10)

2.1.14. 多播

socket 包还提供了支持多播的功能,可以通过 IP_MULTICAST 相关的选项进行设置。

multicast_group = ('224.0.0.1', 10000)
server_socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
server_socket.sendto(b'Multicast Message', multicast_group)

2.1.15. SocketServer 模块

socket 包中还包括了 SocketServer 模块,提供了更高层次的服务器实现,可以更容易地创建基于TCP和UDP的服务器。

import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):def handle(self):# 处理客户端请求server = socketserver.TCPServer(('127.0.0.1', 8888), MyTCPHandler)
server.serve_forever()

2.2 常用的组合

2.2.1 创建Socket连接

首先,我们需要创建Socket对象,并指定通信使用的协议(TCP或UDP)以及IP地址和端口号。

import socket# 创建TCP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定IP地址和端口号
server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)# 监听连接
server_socket.listen(5)
print('等待客户端连接...')

2.2.2 接受和发送数据

一旦建立连接,服务器可以接受来自客户端的连接,并进行数据传输。

# 等待客户端连接
client_socket, client_address = server_socket.accept()
print('连接来自:', client_address)# 接收数据
data = client_socket.recv(1024)
print('接收到的数据:', data.decode('utf-8'))# 发送数据
message = '欢迎加入冒险者联盟!'
client_socket.send(message.encode('utf-8'))

3.简单的客户端-服务器应用:冒险者联盟

现在,我们将通过一个简单的客户端-服务器应用来演示网络通信的过程。在这个应用中,服务器将发送欢迎消息给连接的客户端。

3.1 服务器端代码

# 服务器端代码
import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)
server_socket.bind(server_address)
server_socket.listen(5)print('等待客户端连接...')client_socket, client_address = server_socket.accept()
print('连接来自:', client_address)data = client_socket.recv(1024)
print('接收到的数据:', data.decode('utf-8'))message = '欢迎加入冒险者联盟!'
client_socket.send(message.encode('utf-8'))

3.2 客户端代码

# 客户端代码
import socketclient_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)
client_socket.connect(server_address)message = '你好,冒险者联盟!'
client_socket.send(message.encode('utf-8'))data = client_socket.recv(1024)
print('服务器消息:', data.decode('utf-8'))client_socket.close()

通过这个简单的例子,我们深入了解了网络基础概念、Socket的使用方法以及如何创建一个简单的客户端-服务器应用。

4. 拓展知识:异步编程和网络安全

除了基础知识,网络编程还涉及到许多拓展的领域,例如异步编程和网络安全。异步编程可以提高程序的性能和响应速度,而网络安全则关乎着信息传输的保密性和完整性。

4.1 异步编程

在网络编程中,异步编程变得越来越重要。通过使用asyncio库,我们可以实现异步的网络通信,提高程序的效率。下面是一个简单的异步服务器的例子:

import asyncioasync def handle_client(reader, writer):data = await reader.read(100)message = data.decode('utf-8')addr = writer.get_extra_info('peername')print(f"Received {message!r} from {addr!r}")print("Send: 'Hello, adventurer!'")writer.write("Hello, adventurer!".encode('utf-8'))await writer.drain()print("Closing the connection")writer.close()async def main():server = await asyncio.start_server(handle_client, '127.0.0.1', 8888)addr = server.sockets[0].getsockname()print(f'Serving on {addr}')async with server:await server.serve_forever()asyncio.run(main())

4.2 网络安全

网络安全是一个复杂而关键的领域。在网络通信中,数据

的加密和身份验证是至关重要的。Python中的ssl库可以帮助我们实现安全的网络通信。下面是一个简单的使用SSL的服务器端代码:

import ssl
import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8888)# 使用SSL包装Socket
ssl_server_socket = ssl.wrap_socket(server_socket, keyfile="server-key.pem", certfile="server-cert.pem", server_side=True)ssl_server_socket.bind(server_address)
ssl_server_socket.listen(5)print('等待安全连接...')client_socket, client_address = ssl_server_socket.accept()
print('安全连接来自:', client_address)data = client_socket.recv(1024)
print('接收到的数据:', data.decode('utf-8'))message = '欢迎加入安全的冒险者联盟!'
client_socket.send(message.encode('utf-8'))# 关闭SSL连接
client_socket.close()
ssl_server_socket.close()

写在最后

本文介绍了Python网络编程的基础知识,包括网络基础概念、Socket的使用方法以及通过一个简单的客户端-服务器应用来体验网络通信的过程。通过深入了解网络,我们能够更好地利用Python在网络编程领域展开冒险,创造更多有趣和实用的应用。

在未来的学习中,读者可以进一步探索高级的网络编程技术,如异步编程和网络安全,以拓展自己的知识领域。祝愿各位冒险者在网络的未知领域中取得丰硕的成果!继续探险,迎接更多有趣的挑战。

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

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

相关文章

小航助学2023年9月电子学会Scratch四级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号) 单选题3.00分 删除编辑附件图文 答案:A 第1题角色为一个紫色圆圈,运行程序后,舞台上的图案是?( ) A…

Spring定时任务动态更改(增、删、改)Cron表达式方案实例详解

Spring定时任务动态更改(增、删、改)Cron表达式方案实例详解 最近在做一个需求,用户可以在平台上配置任务计划数据(就是任务的执行和描述的相关信息,包括任务参数、cron表达式),配置后&#xf…

永久安装任何 IPA 文件:TrollStore 助你打破限制 | 开源日报 No.106

Azure/azure-quickstart-templates Stars: 13.4k License: MIT 这个项目是 Azure Resource Manager QuickStart Templates,它包含了社区贡献的所有当前可用的 Azure 资源管理器模板。维护着一个可搜索的模板索引,并提供如何使用或向该存储库做出贡献的…

12.12年末大促,退换货寄件5元起 !

促销新闻报道: 在双十二促销季,闪侠惠递携手圆通、申通、中通、京东、德邦推出了一系列寄件促销活动!在这场活动中,退换货运费贵,你该怎么办?从今天开始,闪侠惠递和五大物流企业为您带来了一场…

Redis核心知识小结

基础 redis为什么快呢? 单线程基于io多路复用底层C语言对数据结构做了优化完全内存的操作 Redis6.0使用多线程是怎么回事? Redis不是说用单线程的吗?怎么6.0成了多线程的? Redis6.0的多线程是用多线程来处理数据的读写和协议解析&#x…

运筹优化 | 模拟退火求解旅行商问题 | Python实现

"""模拟退火旅行商""" import random import numpy as np import math import time import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False location np.loadtxt(city_location.t…

linux 调试工具 GDB 使用

gdb是linux下常用的代码调试工具,本文记录常用命令。 被调试的应用需要使用 -g 参数进行编译,如不确定可使用如下命令查看是否支持debug readelf -S filename | grep "debug" 启动调试 gdb binFile 例如要调试sshd: 调试带参数…

线性回归问题

目录 一、线性回归关键思想 1、线性模型 2、基础优化算法 二、线性回归的从零开始实现 1、生成数据集 2、读取数据集 3、初始化模型参数 4、定义模型 5、定义损失函数 6、定义优化算法 7、训练 三、线性回归的简洁实现 1、生成数据集 2、读取数据集 3、定义模型…

读这篇文章让你彻底了解Redis

我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数…

学习笔记 -- CAN系统基础

一、CAN物理层 一个双节点CAN网络示意图如下,两颗120Ω终端电阻并联呈现总线电阻60Ω。 A、B两个节点的CAN收发器(Transceiver),只负责电平转换。当总线静默时,收发器内部的2.5V电源经15KΩ电阻把CAN-H和CAN-L都拉到2.…

浅入研究 tcache_perthread_struct

Index 前情提要过程总结 前情提要 tcache_perthread_struct 是GLIBC从2.27开始引入的机制,本质就是链表。 最近我在复现CISCN往年题目,刚好想仔细研究研究劫持等的原理是什么,于是就研究了一会。 过程 找ChatGPT要了一段申请删除堆块的示例…

六:Day05_Spring Security01

一、Spring Security引入 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制(认证和授权)框架。它是保护基于 Spring 应用程序的事实标准。 2. 认证授权 认证授权实现平台所有用户的身份认证与用户授权功能。 2.1 什么是用户认证 认证…

关于pytorch中的dim的理解

今天碰到一个代码看起来很简单,但是细究原理又感觉好像不太通不太对劲,就是多维tensor数据的操作,比如:y.sum(dim2),乍一看很简单数据相加操作,但是仔细一想,这里在第3维度的数据到底是横向相加…

DevOps的发展史了解

DevOps的历史发展史可以追溯到2000年代初期,当时软件开发行业开始意识到,软件开发和IT运维之间的问题已经成为阻碍软件开发速度和效率的重要因素。在此之前,软件开发和IT运维是两个相对独立的过程,开发人员开发软件并将其交付给运…

【计算机】硬件体系结构

计算机硬件体系结构 计算机硬件体系结构是指计算机系统的组织和设计,包括处理器、内存、输入/输出设备、总线等各个组件之间的连接和协作方式。硬件体系结构定义了计算机如何执行指令、存储和检索数据以及与外部设备通信。以下是计算机硬件体系结构的主要组成部分&…

[OpenWrt]RAX3000一根线实现上网和看IPTV

背景: 1.我家电信宽带IPTV 2.入户光猫,桥接模式 3.光猫划分vlan,将上网信号IPTV信号,通过lan口(问客服要光猫超级管理员密码,具体教程需要自行查阅,关键是要设置iptv在客户侧的vlan id&#…

Socks5与代理IP技术探析:构建安全高效的网络通信

1. Socks5协议的技术内幕 1.1 握手与身份验证 Socks5协议的握手阶段通过版本协商和灵活的身份验证方式建立安全连接。这确保了通信的可靠性和用户身份的安全。 1.2 数据传输机制 Socks5通过代理实现数据传输,支持TCP和UDP协议,为用户提供了高度灵活的…

FPGA设计流程:从概念到实现的详细指南

目录 引言 1. 概念阶段 1.1 确定需求 1.2 制定规范 2. 设计阶段 2.1 系统设计 2.2 硬件描述语言(HDL)编写 2.3 仿真验证 3. 综合与优化 3.1 逻辑综合 3.2 布局与布线 4. 实现与调试 4.1 下载与配置 4.2 调试与验证 5. 部署与维护 5.1 系统…

vite与webpack的一些技巧

通常项目里会有很多的api与导入导出,为了避免过多而提高效率 vue3的使用过程中:可以读取文件然后异步的获取挂载在属性上面 虽然我知道按需的好处,但有时候很急效率至少就没办法考虑性能, 所以频繁的导出与import导入使用变量申明…

Zibll子比主题最新学习版

Zibll子比主题5.7.1是一款为WordPress平台设计的优秀主题。它具有独特而富有吸引力的设计风格,同时提供了丰富的功能和卓越的性能,使您的网站在众多网站中脱颖而出。以下是对Zibll子比主题5.7.1的详细介绍。 (这是我在“布谷鸟网址导航”上看…