【发布时间】: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 中做一些类似套接字的事情...
【问题讨论】: