Python 文档中的示例提供了实现客户端-服务器系统的基本背景。但是,在两者之间添加代理需要对示例代码进行一些应用。
客户端-代理-服务器系统的骨架模型
客户
客户应该做以下事情:
- 阅读将要发送的文件
- 创建套接字并建立到代理的 TCP 连接
socket.socket()
,proxysock.connect()
与SOCK_STREAM
- 将步骤 1 中存储到变量中的文件数据发送到代理
- 等待答复
- 关闭连接
代理人
代理,基本上既是一种服务器又是一种客户端,应该做以下事情:
- 创建监听套接字,等待来自客户端的传入连接,接受并存储传入连接的句柄
socket.socket()
, proxyserversock.bind()
, proxyserversock.listen()
,proxyserversock.accept()
- 从传入连接中读取数据
- 将接收到的数据存入文件
- 创建套接字并建立到服务器的 TCP 连接
socket.socket()
,serversock.connect()
再次与SOCK_STREAM
- 将从客户端接收到的数据发送到服务器
- 等待回答
- 将答案传递给客户
- 关闭与服务器和客户端的连接,但保持监听套接字打开
serversock.close()
,clientsock.close()
服务器
服务器应该做以下事情:
- 创建一个监听套接字,等待来自代理的传入连接,接受并存储传入连接的句柄
socket.socket()
, serversock.bind()
, serversock.listen()
,serversock.accept()
- 从传入连接中读取数据
- 将接收到的数据存入文件
- 向代理发送答案
proxyclientsock.sendall()
- 关闭连接,但保持监听套接字打开
补充说明
实现上述基本模型后,您可以轻松开始添加更多功能。例如,您可以在第 3 步和第 4 步之间的代理中添加休眠,而不是直接将从客户端接收到的数据发送到服务器,您可以读取文件并发送内容 - 这样您可以在之前手动更改文件它被发送到服务器。
如果您想真正了解网络编程的基础知识,我还建议您阅读Beej 的网络编程指南。这些示例是用 C 语言编写的,但基本原则也适用于 Python(以及其他语言)。