前言
昨天讲解了关于从零入门python的第一遍,编程语法必修内容,比如python3基础入门,列表与元组,字符串,字典,条件丶循环和其他语句丶函数丶面向对象丶异常和文件处理 。
今天讲第二篇:python并发编程:网络编程
本系列文根据以下学习路线展开讲述,由于内容较多,:从零开始学python到高级进阶路线图
第一章:网络编程
1.网络编程
网络编程是指使用计算机网络进行通信的编程技术。在Python中,可以使用socket
模块来实现网络编程。
socket
是一个封装了TCP/IP
协议的网络编程库,它提供了一种通用的网络编程接口,可以用于创建客户端和服务器端程序。在Python中,可以使用socket
模块来创建socket
对象,然后使用该对象进行网络通信。
下面是一个简单的网络编程示例,其中创建了一个服务器端和一个客户端,客户端向服务器端发送消息,服务器端接收到消息后将其打印出来:
服务器端代码:
import socket
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP地址和端口号
server_socket.bind(('127.0.0.1', 8888))
# 监听端口
server_socket.listen(5)
print('服务器已启动,等待客户端连接...')
# 等待客户端连接
client_socket, client_address = server_socket.accept()
print('客户端已连接,地址为:', client_address)
# 接收客户端消息
data = client_socket.recv(1024)
print('接收到客户端消息:', data.decode())
# 关闭socket连接
client_socket.close()
server_socket.close()
客户端代码:
import socket
# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(('127.0.0.1', 8888))
# 发送消息
client_socket.send('Hello, server!'.encode())
# 关闭socket连接
client_socket.close()
在PyCharm
中编译和运行Matlab
文件,需要先安装Matlab
并配置好环境变量。然后,在PyCharm
中打开Matlab
文件,点击运行按钮即可编译和运行Matlab
文件。如果需要传递参数,可以在运行配置中设置。
2.TCP/IP简介
TCP/IP
是一种网络协议,它是互联网的基础协议。TCP/IP
协议族包括了许多协议,其中最重要的是TCP
和IP
协议。
TCP
协议是一种面向连接的协议,它提供了可靠的数据传输服务。TCP
协议通过三次握手建立连接,然后通过数据分段和确认机制来保证数据的可靠传输。
IP
协议是一种无连接的协议,它提供了数据包的传输服务。IP协议通过路由选择算法来确定数据包的传输路径,然后将数据包传输到目的地。
在网络编程中,我们通常使用TCP
协议来进行数据传输。TCP
协议提供了可靠的数据传输服务,适用于需要保证数据传输可靠性的场景,如文件传输、邮件传输等。而IP
协议则适用于需要快速传输数据的场景,如视频流传输、实时通信等。
3.网络设计模块
1.Socket简介
Socket
是一种通信机制,它允许不同的进程在网络上进行通信。在Python中,Socket
是通过socket
模块来实现的。Socket
通常用于客户端和服务器之间的通信,但也可以用于进程之间的通信。
2.Socket模块使用
Python中的socket
模块提供了一组函数和类,用于创建和操作Socket
。常用的函数和类包括:
socket()
:创建一个Socket对象。bind()
:将Socket绑定到一个特定的地址和端口。listen()
:开始监听连接请求。accept()
:接受一个连接请求,并返回一个新的Socket对象。connect()
:连接到一个远程Socket。send()
:发送数据。recv()
:接收数据。
3.服务器
在Python中,可以使用socket
模块创建一个服务器。服务器通常需要绑定到一个特定的地址和端口,并监听连接请求。当有客户端连接到服务器时,服务器会接受连接请求,并创建一个新的Socket
对象来处理客户端请求。
以下是一个简单的Python服务器示例:
import socket
HOST = '127.0.0.1' # 服务器地址
PORT = 8888 # 服务器端口号
# 创建一个Socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到地址和端口
server_socket.bind((HOST, PORT))
# 开始监听连接请求
server_socket.listen(1)
print('Server is running on {}:{}'.format(HOST, PORT))
while True:
# 接受一个连接请求,并返回一个新的Socket对象
client_socket, client_address = server_socket.accept()
print('Client connected from {}:{}'.format(client_address[0], client_address[1]))
# 处理客户端请求
data = client_socket.recv(1024)
print('Received data: {}'.format(data.decode()))
# 发送响应数据
response = 'Hello, client!'
client_socket.send(response.encode())
# 关闭连接
client_socket.close()
4.客户端
在Python中,可以使用socket
模块创建一个客户端。客户端通常需要连接到一个远程Socket
,并发送请求数据。当服务器响应请求时,客户端会接收响应数据。
以下是一个简单的Python客户端示例:
import socket
HOST = '127.0.0.1' # 服务器地址
PORT = 8888 # 服务器端口号
# 创建一个Socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到远程Socket
client_socket.connect((HOST, PORT))
# 发送请求数据
request = 'Hello, server!'
client_socket.send(request.encode())
# 接收响应数据
response = client_socket.recv(1024)
print('Received data: {}'.format(response.decode()))
# 关闭连接
client_socket.close()
5.文件下载器
文件下载器是一个常见的网络应用程序,它可以从远程服务器下载文件并保存到本地。在Python中,可以使用socket
模块和urllib
模块来实现文件下载器。
以下是一个简单的Python文件下载器示例:
import socket
import urllib.request
HOST = '127.0.0.1' # 服务器地址
PORT = 8888 # 服务器端口号
FILE_URL = 'http://example.com/file.txt' # 文件下载地址
FILE_NAME = 'file.txt' # 文件保存路径
# 创建一个Socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到远程Socket
client_socket.connect((HOST, PORT))
# 发送请求数据
request = 'GET {}\r\n'.format(FILE_URL)
client_socket.send(request.encode())
# 接收响应数据
response = client_socket.recv(1024)
print('Received data: {}'.format(response.decode()))
# 下载文件并保存到本地
with open(FILE_NAME, 'wb') as f:
while True:
data = client_socket.recv(1024)
if not data:
break
f.write(data)
# 关闭连接
client_socket.close()
4.补充内容
1.网络编程中的UDP协议
UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,它不保证数据包的可靠性和顺序性,但是传输速度快,适用于一些对数据可靠性要求不高的应用场景,如视频、音频等实时传输。
在Python中,使用socket
模块可以实现UDP
协议的网络编程。下面是一个简单的UDP
服务器和客户端的示例:
UDP
服务器:
import socket
# 创建UDP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP地址和端口号
server_socket.bind(('127.0.0.1', 8888))
while True:
# 接收数据
data, addr = server_socket.recvfrom(1024)
print('Received from %s:%s.' % addr)
print('Data: %s' % data.decode())
# 发送数据
server_socket.sendto('Hello, client!'.encode(), addr)
UDP
客户端:
import socket
# 创建UDP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
client_socket.sendto('Hello, server!'.encode(), ('127.0.0.1', 8888))
# 接收数据
data, addr = client_socket.recvfrom(1024)
print('Received from %s:%s.' % addr)
print('Data: %s' % data.decode())
# 关闭套接字
client_socket.close()
在UDP
协议中,发送数据时需要指定目标地址和端口号,接收数据时会返回发送方的地址和端口号。由于UDP
协议不保证数据的可靠性和顺序性,因此在实际应用中需要考虑数据丢失、重复、乱序等问题。
2.UDP协议与TCP协议的区别
UDP
协议和TCP
协议是两种常用的网络传输协议,它们有以下几点区别:
- 连接方式:
TCP
协议是面向连接的协议,而UDP
协议是无连接的协议。TCP
协议在传输数据之前需要先建立连接,而UDP
协议不需要。 - 可靠性:
TCP
协议是可靠的协议,它保证数据的可靠传输,而UDP
协议是不可靠的协议,它不保证数据的可靠传输。 - 传输效率:
UDP
协议比TCP
协议传输效率高,因为UDP
协议不需要建立连接和维护连接状态,而TCP
协议需要。 - 数据包大小:
UDP
协议传输的数据包大小限制为64KB,而TCP
协议没有限制。 - 应用场景:
TCP
协议适用于对数据传输可靠性要求较高的场景,如文件传输、邮件传输等;而UDP
协议适用于对数据传输实时性要求较高的场景,如视频直播、语音通话等。
3.UDP协议代码实现方式
UDP
协议是一种无连接的协议,它不保证数据传输的可靠性和顺序性,但是具有传输速度快的优点。下面是Python中使用UDP
协议进行网络编程的代码实现方式:
服务器端代码:
import socket
# 创建UDP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP地址和端口号
server_socket.bind(('127.0.0.1', 8888))
# 接收数据
while True:
data, addr = server_socket.recvfrom(1024)
print('Received from %s:%s.' % addr)
print('Data: %s' % data.decode())
# 发送数据
server_socket.sendto('Hello, client!'.encode(), addr)
客户端代码:
import socket
# 创建UDP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
client_socket.sendto('Hello, server!'.encode(), ('127.0.0.1', 8888))
# 接收数据
data, addr = client_socket.recvfrom(1024)
print('Received from %s:%s.' % addr)
print('Data: %s' % data.decode())
# 关闭套接字
client_socket.close()
在上面的代码中,服务器端首先创建了一个UDP
套接字,并绑定了IP
地址和端口号。然后通过recvfrom()
方法接收客户端发送的数据,并通过sendto()
方法向客户端发送数据。客户端同样创建了一个UDP
套接字,并通过sendto()
方法向服务器端发送数据,然后通过recvfrom()
方法接收服务器端发送的数据。最后,客户端关闭套接字。