Python网络编程

1.背景

​ 局域网上连接有两个设备:树莓派、PC。树莓派仅有供电没有连接其他外设,树莓派上定时执行爬虫脚本,需要经常查看爬虫日志信息检查运行状态。其中一个解决方案就是:通过TCP/IP协议,树莓派作为服务器,PC作为服务端,按需将日志信息发送到PC上。实现前述需求使用的技术是:Python网络编程。

硬件设备连接示意如下图所示:

示意图

下文是对相关基本概念和具体实现的介绍。

2.Python网络编程

首先,介绍一些网络编程方面的背景资料,然后介绍如何使用Python的一些模块来创建网络化的应用程序。

2.1 客户端/服务器

客户端/服务器架构(Client/Server Architecture)是一种分布式计算模型,它将系统划分为客户端和服务器两个部分,客户端和服务器通过网络进行通信,实现协同工作。

在客户端/服务器架构中,客户端是指向服务器请求服务的计算机或设备,它通过网络连接到服务器,向服务器发送请求并接收响应。服务器是指提供服务的计算机或设备,它接收客户端的请求并返回响应结果。客户端和服务器之间通过网络连接进行通信,客户端向服务器发送请求并等待响应,服务器接收请求并处理请求,最终将响应结果返回给客户端。

客户端/服务器架构广泛应用于各种计算机系统和应用程序中,包括Web应用程序、数据库系统、文件传输协议、邮件系统、即时通讯工具等等。

客户端/服务器对应于背景中问题的具体实例就是:Raspberry作为服务器存储着需要发送的日志信息,PC作为客户端发起连接请求,raspberry和pc完成网络连接后,pc发出数据请求,raspberry通过网络协议将数据发送到pc,数据发送完成后断开连接。

2.2 TCP/IP协议

网络中的设备要想实现互相通信,需要统一的通信协议。早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容。为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议。

IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个IP包转发出去。IP包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。

TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

端口和IP地址:在两台计算机通信时,只发IP地址是不够的,因为同一台计算机上跑着多个网络程序。一个TCP报文来了之后,到底是交给浏览器还是QQ,就需要端口号来区分。每个网络程序都向操作系统申请唯一的端口号,这样,两个进程在两台计算机之间建立网络连接就需要各自的IP地址和各自的端口号。一个进程也可能同时与多个计算机建立链接,因此它会申请很多端口。

TCP/IP简介 - 廖雪峰的官方网站 (liaoxuefeng.com)

2.3 通信端点、套接字

通信端点是指网络中的通信双方,它包括本地端点和远程端点。本地端点是指套接字所在主机的IP地址和端口号,远程端点是指连接到本地端点的另一台主机的IP地址和端口号。在套接字通信过程中,本地端点和远程端点进行数据交换,实现数据传输。

套接字(Socket)是一种用于在网络中传输数据的通信机制,它提供了一种通信端点,用于标识网络中的通信双方。套接字是在应用层和传输层之间的接口,它定义了通信的协议、IP地址和端口号等信息。

在计算机网络中,每个主机都有一个唯一的IP地址,用于标识主机在网络中的位置。端口号用于标识主机中的进程。套接字通过IP地址和端口号来标识网络中的通信端点。

套接字和通信端点是网络通信中非常重要的概念,它们是实现网络通信的基础。通过套接字和通信端点,应用程序可以在网络中进行数据传输,实现不同计算机之间的数据交换。

2.4 代码实现

服务端

服务端伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#-*- coding:utf-8 -*-
"""
网络通信服务器
"""
import socket
import threading
import time

log_file = r"D:\Code\TimeVisual\ToolPy\chongbuluo.log"


#每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
time.sleep(1)
print("服务器:发送数据包")
# 打开文件并发送数据
with open(log_file, 'rb') as f:
while True:
data = f.read(1024)
if not data:
print("数据包发送完成")
break
sock.sendall(data)
sock.close()
print('Connection from %s:%s closed.' % addr)


# 获取以太网IPv4地址
def get_ethernet_ipv4():
try:
# 创建套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 连接到百度服务器
s.connect(('www.baidu.com', 80))
# 获取套接字的本地协议地址,即以太网IPv4地址
ethernet_ipv4 = s.getsockname()[0]
s.close()
return ethernet_ipv4
except:
return None


# 创建一个基于IPv4和TCP协议的Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定监听的地址和端口
ethernet_ipv4 = get_ethernet_ipv4()
if ethernet_ipv4 is not None:
print('ipv4:', ethernet_ipv4)
s.bind((ethernet_ipv4, 9999))
else:
s.bind(('127.0.0.1', 9999))

# 开始监听端口
s.listen(5)
print('Waiting for connection...')

# 等待连接
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()

客户端

客户端伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#-*- coding:utf-8 -*-
"""
网络通信客户端
"""
import socket
import time

recv_log = r"D:\Code\TimeVisual\ToolPy\recv.log"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connected = False
connecting_cnt = 0
while not connected and connecting_cnt < 5:
try:
# 建立连接:
s.connect(('192.168.1.105', 9999))
connected = True
except socket.error:
print("连接失败,1秒后重试...")
time.sleep(1)
connecting_cnt += 1
# 接受数据文件
print("开始接收数据包...")
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
# 把接收的数据写入文件:

with open(recv_log, 'wb') as f:
for d in buffer:
f.write(d)
print("数据接收完成!")
s.close()

扩展阅读

网络编程 | Python 核心编程 第二版 (jb51.net)

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2023 Wh
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信