pra*_*tom 3 python twisted python-2.7
我使用twisted python编写了服务器部分.现在有4个客户端连接到服务器,后者向服务器发送一些数据.如果客户端1向服务器发送一些数据,则服务器将该数据转发给客户端4,类似地,当客户端2向服务器发送数据时,服务器将该数据转发给客户端3.因此我的问题是如何根据IP地址选择特定客户端我必须向其发送数据.在我看到的使用代码后向客户端发送数据的扭曲示例中
self.transport.write("string")
Run Code Online (Sandbox Code Playgroud)
如何指定我必须向其发送数据的客户端的IP地址?
我在tcp服务器和客户端的服务器也是tcp(python twisted)
self.transport.write( "字符串")
在你指的是实例中,self
是一个实例Protocol
或的子类Protocol
(或某个对象提供 IProtocol
无子类Protocol
,它也是完全细).
self.transport
因此,它 是一个提供的对象ITransport
(也许它提供了更具体的ITCPTransport
,ISSLTransport
但在这个问题的背景下并不重要).
在Twisted中,提供 的对象ITransport
表示两个端点之间的连接.此类连接可能是IPv4/TCP连接或IPv6/TLS连接或AF_UNIX连接.所有这些类型的连接的共同点是它们只有两个端点.数据可以从一个端点"发送"并在另一个端点"接收"(反之亦然).
原因self.transport.write("string")
显然不包括任何self.transport
已包含该信息的寻址信息.
由于self.transport
表示连接(并且只有一个连接:不多也不少)并且每个连接都有两个端点,这两个端点的地址必然是其中的一部分self.transport
(如果不是,则self.transport
不能表示该连接).
并且该对象实际上比这更具体:它代表连接的一侧.它知道两个端点中的哪一个"在这里",哪个在其他地方.这意味着当您向其写入数据时,self.transport
只能发送一个可能的地址:由此表示的连接的端点self.transport
不是"此处".
按照惯例,该端点具有名称.它是"同行".接口ITransport
定义了一个方法,getPeer
该方法向您公开传输对象表示的连接的"对等"地址. self.transport.getPeer()
返回表示该地址的对象.该对象的确切形状取决于您拥有的连接类型.
您问我如何根据IP地址选择特定客户端.如果实际情况是流经系统的数据的目的地由IP地址明确指定,那么您可以使用它getPeer
来查找与所需地址匹配的连接.
但是,在建立连接后停止使用连接的端点地址更为常见.由于NAT的部署程度,IP地址信息往往不可靠.这不是总是错在你的应用层协议嵌入IP地址,但它是很难想象的例子,其中它是正确的.
幸运的是,替代方案更容易. self.transport
已经代表了某种联系.这只是一个普通的旧Python对象.一旦您知道哪两个客户端要彼此交换数据,您只需要使用这些对象将数据发送到正确的位置.
例如,如果您的服务器只接受四个连接,并且工厂保存对它所创建的IProtocol
提供程序的引用以处理每个连接(请考虑一下这一点:因为每个ITransport
提供程序只代表一个连接,所以它必须是什么是指具有transport
引用其中一个属性的协议对象?如果两个协议对象引用相同的传输...并且单个协议对象的transport
属性不可能引用多个对象...)作为属性one
,two
,three
,four
然后当那些协议中的对象中的一个来实现它的dataReceived
这样的方法:
def dataReceived(self, bytes):
message = self._parseNewData(bytes)
if message.complete():
self.factory.four.transport.write(message.tostring())
Run Code Online (Sandbox Code Playgroud)
这必须将数据写入建立到服务器的第四个连接.此示例中没有明确的寻址.只是小心使用某些Python对象.
仔细使用某些Python对象是这个问题的总体答案.