繁体   English   中英

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

[英]sending data to particular client from twisted server

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

self.transport.write("string")

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

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

self.transport.write( “字符串”)

在你指的是实施例中, self是的实例Protocol或子类Protocol (或提供对象IProtocol没有子类Protocol ,这也完全细)。

因此, self.transport是一个提供 ITransport的对象(可能它提供了更具体的ITCPTransportISSLTransport但在这个问题的上下文中并不重要)。

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

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

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

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

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

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

但是,在建立连接后停止使用连接的端点地址更为常见。 由于NAT的部署程度,IP地址信息往往不可靠。 它并不总是错在你的应用层协议嵌入IP地址,但它很难想象的例子,其中它是正确的。

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

例如,如果您的服务器只接受四个连接,并且工厂保存对IProtocol 提供程序的引用,则会创建它来处理每个连接(请考虑一下这一点:因为每个ITransport提供程序只代表一个连接,它是否意味着具有transport属性引用其中一个的协议对象?如果两个协议对象引用相同的传输...并且单个协议对象的transport属性不可能引用多个对象... )作为属性onetwothreefour然后当其中一个协议对象实现其dataReceived方法时,如下所示:

def dataReceived(self, bytes):
    message = self._parseNewData(bytes)
    if message.complete():
        self.factory.four.transport.write(message.tostring())

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM