【问题标题】:Sending file in a Client-proxy-Server over TCP通过 TCP 在客户端代理服务器中发送文件
【发布时间】:2013-08-06 18:41:41
【问题描述】:

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

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

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

问候。

【问题讨论】:

    标签: python python-2.7 proxy network-programming client-server


    【解决方案1】:

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

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

    客户

    客户应该做以下事情:

    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's Guide to Network Programming。这些示例使用 C 语言编写,但基本原则也适用于 Python(以及其他语言)。

    【讨论】:

    • 感谢您的精彩解释,这绝对应该让我继续前进。不过,按照您的解释,整个周期将是一个持久连接,从外观上看,客户端代理和代理服务器连接似乎是互斥的,那么如何在一个完整的周期内全面创建/建立这种关系,或者默认情况下,如果我按照你的建议进行操作,它会被注意?
    • @ramd 在代理和服务器运行的情况下,每次客户端启动发送文件的过程时,都会建立连接,只有在客户端收到服务器发送的应答后才会关闭连接通过代理。所以是的,每个通信节点(客户端、代理和服务器)的 TCP 连接将在整个周期中保持不变。稍后,如果您的项目变得更复杂,您可能会考虑实现某种keepalive 以确保连接保持连接。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的提醒,我听说过这件事,也快速浏览了一下。那么在扭曲中,我们是否有一些东西可以为我们提供现成的模板/功能/框架来实现开箱即用的客户端-代理-服务器模型?任何指针都会有所帮助。谢谢
    • 我有一段时间没有做网络编程了。我不知道你是否会找到你正在寻找的东西。但是,您会看到 Twisted 是一个大框架。将您的程序分解为小细节。如果你确切地知道你在寻找什么,那么你的代码对于整个系统来说将是小而干净的。现在,想办法阻止客户端从服务器连接,因为只有代理连接到服务器。也许是一个秘密密码。而且,如果你正确定义了你的协议,它应该很容易。就像客户端处理 1 个连接 [代理]、代理 2[客户端、服务器]、服务器 1 [代理]。希望对您有所帮助。
    猜你喜欢
    • 2018-02-28
    • 2023-04-03
    • 2015-05-17
    • 2019-01-01
    • 2011-05-29
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多