扭曲的Python:UDP广播(简单的回声服务器)
我正在尝试调整
Python Twisted –
UDP examples以使用UDP广播.我可以从客户端发送消息并在服务器上接收它,但是,它不会发回消息.
客户: from twisted.internet.protocol import DatagramProtocol from twisted.internet import reactor from socket import SOL_SOCKET,SO_BROADCAST class EchoClientDatagramProtocol(DatagramProtocol): strings = [ "Hello,world!","What a fine day it is.","Bye-bye!" ] def startProtocol(self): self.transport.socket.setsockopt(SOL_SOCKET,SO_BROADCAST,True) self.transport.connect("255.255.255.255",8000) self.sendDatagram() def sendDatagram(self): if len(self.strings): datagram = self.strings.pop(0) self.transport.write(datagram) else: reactor.stop() def datagramReceived(self,datagram,host): print 'Datagram received: ',repr(datagram) self.sendDatagram() def main(): protocol = EchoClientDatagramProtocol() #0 means any port t = reactor.listenUDP(0,protocol) reactor.run() if __name__ == '__main__': main() 服务器: from twisted.internet.protocol import DatagramProtocol from twisted.internet import reactor class EchoUDP(DatagramProtocol): def datagramReceived(self,address): print "Received from address: " + str(address) print str(datagram) self.transport.write(datagram,address) print "Finished sending reply." print "Starting server." reactor.listenUDP(8000,EchoUDP()) reactor.run() 控制台输出: Server: Starting server. Received from address ('192.168.1.137',53737) Hello,world! Finished sending reply. Client: no output. 解决方法
transport.connect创建一个
connected UDP socket
我怀疑服务器的响应没有被客户端捕获,因为它正在侦听来自广播地址的响应,而不是服务器的特定地址. 相反,只需使用self.transport.write(数据,(主机,端口))形式的写入而不首先启动连接 – 这将允许客户端从任何地址接收数据包. from twisted.internet.protocol import DatagramProtocol from twisted.internet import reactor from socket import SOL_SOCKET,True) #self.transport.connect("255.255.255.255",8000) <- not needed self.sendDatagram() def sendDatagram(self): if len(self.strings): datagram = self.strings.pop(0) self.transport.write(datagram,('255.255.255.255',8000)) # <- write to broadcast address here else: reactor.stop() def datagramReceived(self,protocol) reactor.run() if __name__ == '__main__': main() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |