【问题标题】:pure python socket module纯python套接字模块
【发布时间】:2010-08-14 02:30:44
【问题描述】:

python 中的 socket 模块包装了 _socket 模块,这是 C 实现的东西。同样,socket.socket 将采用必须实现_socket 接口的_sock 参数。在某些方面,_sock 必须是来自_socket 的底层套接字类型的实际实例,因为 C 代码会进行类型检查(与纯 python 不同)。

鉴于您可以为_sock 传递一个类似套接字的对象,看来您可以编写一个可以传递给socket.socket 的套接字仿真器。它需要模拟底层的套接字行为,但在内存中而不是在真实的网络或任何东西上。它不应该与_socket 区分开来。

构建这种仿真需要什么?

我知道,我知道,这不太实用。事实上,我学到了一个艰难的方法,即使用常规套接字更容易,并且不需要假套接字。我曾认为我可以更好地控制带有假套接字的测试环境。不管我“浪费”了多少时间,我发现我在这个过程中学到了很多关于套接字和python的知识。

我猜测任何解决方案都必须是一堆这样的交互对象:

something_that_uses_sockets (like XMLRPCTransport for ServerProxy)
    |
    V
socket.socket
    |
    V
FakeSocket
    |
    V
FakeNetwork
    |
    V
FakeSocket ("remote")
    |
    V
socket.socket
    |
    V
something_else_that_uses_sockets (like SimpleXMLRPCServer)

似乎这基本上是真实套接字的情况,除了真实网络而不是假网络(加上操作系统级套接字),以及_socket 而不是 FakeSocket。

无论如何,只是为了好玩,有什么想法可以解决这个问题吗?

顺便说一句,使用 FakeSocket,您可以在 Google Apps 中做一些类似套接字的事情...

【问题讨论】:

    标签: python sockets emulation


    【解决方案1】:

    已经完成了。 Twisted 将其广泛用于其协议实现的单元测试。一个好的起点是查看some of Twisted's unit tests

    本质上,您只需在您的协议上调用makeConnection,并使用未连接到真实套接字的传输。超级简单!

    【讨论】:

    • 太棒了!这正是我一直在寻找的。也许我终于应该开始研究扭曲了。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2018-06-10
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多