从扭曲的服务器向特定客户端发送数据

时间:2014-02-01 11:00:10

标签: python python-2.7 twisted

我使用twisted python编写了服务器部分。现在有4个客户端连接到服务器,后者向服务器发送一些数据。如果客户端1向服务器发送一些数据,则服务器将该数据转发给客户端4,类似地,当客户端2向服务器发送数据时,服务器将该数据转发给客户端3.因此我的问题是如何根据IP地址选择特定客户端我必须向其发送数据。在使用代码后我看到将数据发送到客户端的扭曲示例

self.transport.write("string")

如何指定我必须向其发送数据的客户端的IP地址?

我在tcp服务器和客户端的服务器也是tcp(python twisted)

1 个答案:

答案 0 :(得分:5)

  

self.transport.write( “串”)

在您引用的示例中,selfProtocol的实例或Protocol的子类(或提供的对象 {{1}没有子类化IProtocol,这也很完美。)

Protocol因此是提供 self.transport的对象(也许它提供了更具体的ITransportITCPTransport,但这并不重要这个问题的背景)。

在Twisted中,提供的对象 ISSLTransport表示两个端点之间的连接。此类连接可能是IPv4 / TCP连接或IPv6 / TLS连接或AF_UNIX连接。所有这些连接的共同之处在于它们只有两个端点。数据可以从一个端点“发送”并在另一个端点“接收”(反之亦然)。

ITransport显然不包含任何寻址信息的原因是self.transport.write("string")已包含该信息。

由于self.transport表示连接(并且只有一个连接:不多也不少),并且每个连接都有两个端点,这两个端点的地址必然是self.transport的一部分(如果不是,self.transport无法代表该连接。)

该对象实际上比这更具体:它表示连接的一侧。它知道两个端点中的哪一个“在这里”,哪个在其他地方。这意味着当您向self.transport写入数据时,只有一个可以发送的地址:由self.transport表示的连接的端点,而不是“此处”。

按照惯例,该端点有一个名称。它是“同行”。接口self.transport定义了一个方法ITransport,它向您公开传输对象表示的连接的“对等”地址。 getPeer返回表示该地址的对象。该对象的确切形状取决于您的连接类型。

您问如何根据IP地址选择特定客户端。如果确实存在流经系统的数据的目的地由IP地址明确指定的情况,那么您可以使用self.transport.getPeer()来查找与所需地址匹配的连接。

但是,在建立连接后停止使用连接的端点地址更为常见。由于NAT的部署程度,IP地址信息往往不可靠。在您的应用程序级协议中嵌入IP地址并不是始终错误,但 很难想到适当的示例。

幸运的是,替代方案更容易。 getPeer 已经代表某个连接。这只是一个普通的旧Python对象。一旦您知道哪两个客户端要彼此交换数据,您只需要使用对象将数据发送到正确的位置。

例如,如果您的服务器只接受四个连接,并且工厂保存对self.transport 提供程序的引用,那么它会创建以处理每个连接(请考虑这一点)一分钟:由于每个IProtocol提供程序只代表一个连接,对于具有引用其中一个的ITransport属性的协议对象,它必须具有什么意义?如果两个协议对象引用相同的传输。 ..并且单个协议对象的transport属性不可能引用多个对象...)作为属性transportonetwo,{{1然后,当其中一个协议对象实现其three方法时,这样:

four

这必须将数据写入建立到服务器的第四个连接。此示例中没有明确的寻址。只是小心使用某些Python对象。

小心使用某些Python对象是这个问题的总体答案。