1

我仍然是网络编程/python的新手。我想编写一个 python 客户端代理服务器程序,客户端应该能够将文件内容发送到代理,代理应该能够将其存储在文件中,如果需要我应该能够更改文件的内容在将其转发到服务器之前,响应应再次存储在代理端,然后再将其发送回客户端。

所有这一切都通过一个 TCP 连接,对于来自客户端的每个新请求,一个新的 TCP 连接,但是对于一个完整的周期(客户端->代理->服务器->代理->客户端)我需要一个持久连接(我不知道如何实现这一点)。

这甚至可能吗,例如能够在转发到服务器之前从客户端更改/保存文件。请指出正确的方向。任何帮助将不胜感激。感谢您的时间和宝贵的帮助/建议。

问候。

4

2 回答 2

3

Python 文档中的示例提供了实现客户端-服务器系统的基本背景。但是,在两者之间添加代理需要对示例代码进行一些应用。

客户端-代理-服务器系统的骨架模型

客户

客户应该做以下事情:

  1. 阅读将要发送的文件
    • open()fp.read()
  2. 创建套接字并建立到代理的 TCP 连接
    • socket.socket(),proxysock.connect()SOCK_STREAM
  3. 将步骤 1 中存储到变量中的文件数据发送到代理
    • proxysock.sendall()
  4. 等待答复
    • proxysock.recv()
  5. 关闭连接
    • proxysock.close()

代理人

代理,基本上既是一种服务器又是一种客户端,应该做以下事情:

  1. 创建监听套接字,等待来自客户端的传入连接,接受并存储传入连接的句柄
    • socket.socket(), proxyserversock.bind(), proxyserversock.listen(),proxyserversock.accept()
  2. 从传入连接中读取数据
    • clientsock.recv()
  3. 将接收到的数据存入文件
    • open()fp.write()
  4. 创建套接字并建立到服务器的 TCP 连接
    • socket.socket()serversock.connect()再次与SOCK_STREAM
  5. 将从客户端接收到的数据发送到服务器
    • serversock.sendall()
  6. 等待回答
    • serversock.recv()
  7. 将答案传递给客户
    • clientsock.sendall()
  8. 关闭与服务器和客户端的连接,但保持监听套接字打开
    • serversock.close(),clientsock.close()

服务器

服务器应该做以下事情:

  1. 创建一个监听套接字,等待来自代理的传入连接,接受并存储传入连接的句柄
    • socket.socket(), serversock.bind(), serversock.listen(),serversock.accept()
  2. 从传入连接中读取数据
    • proxyclientsock.recv()
  3. 将接收到的数据存入文件
    • open()fp.write()
  4. 向代理发送答案
    • proxyclientsock.sendall()
  5. 关闭连接,但保持监听套接字打开
    • proxyclientsock.close()

补充说明

实现上述基本模型后,您可以轻松开始添加更多功能。例如,您可以在第 3 步和第 4 步之间的代理中添加休眠,而不是直接将从客户端接收到的数据发送到服务器,您可以读取文件并发送内容 - 这样您可以在之前手动更改文件它被发送到服务器。

如果您想真正了解网络编程的基础知识,我还建议您阅读Beej 的网络编程指南。这些示例是用 C 语言编写的,但基本原则也适用于 Python(以及其他语言)。

于 2013-08-06T21:19:12.237 回答
1

我真的不知道您在套接字编程方面的经验。如果您不了解套接字以及如何处理它,那将是一个很大的学习曲线[至少对我来说]。但我绝对建议您查看扭曲的框架 Python 。http://twistedmatrix.com。我发现它有很好的文档记录并且得到了很大的支持。你可以做这么多的事情是很少的时间很少了解。

于 2013-08-06T21:45:46.340 回答