扭曲的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() (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
