TwistedPython:UDP广播(简单回显服务器)
我正在尝试适应使用UDP广播。我可以从客户端发送消息并在服务器上接收,但是,它不会发送回消息 客户:TwistedPython:UDP广播(简单回显服务器),python,twisted,Python,Twisted,我正在尝试适应使用UDP广播。我可以从客户端发送消息并在服务器上接收,但是,它不会发送回消息 客户: from twisted.internet.protocol import DatagramProtocol from twisted.internet import reactor from socket import SOL_SOCKET, SO_BROADCAST class EchoClientDatagramProtocol(DatagramProtocol): strin
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, datagram, 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
创建一个
连接的UDP套接字与标准套接字略有不同-它只能向/从单个地址发送和接收数据报,但这并不意味着连接。数据报仍然可能以任何顺序到达,而另一端的端口可能没有人监听。连接的UDP套接字的好处是,它可以提供未交付包的通知。这取决于许多因素,几乎所有这些因素都超出了应用程序的控制范围,但它仍然提供了某些好处,偶尔会使它变得有用
我怀疑来自服务器的响应没有被客户端捕获,因为它正在侦听来自广播地址而不是服务器的特定地址的响应
相反,只需使用self.transport.write(数据,(主机,端口))
写入形式,而无需首先启动连接-这将允许客户端从任何地址接收数据包
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) <- 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, 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()
从twisted.internet.protocol导入数据报协议
从twisted.internet导入
从socket导入SOL\u socket,因此\u广播
EchoClientDatagramProtocol类(DatagramProtocol):
字符串=[
“你好,世界!”,
“今天天气真好。”,
“再见!”
]
def startProtocol(自身):
self.transport.socket.setsockopt(SOL_socket,SO_BROADCAST,True)
#self.transport.connect(“255.255.255.255”,8000)您的意思是让main
成为EchoClientDatagramProtocol
中的一个函数,还是这是一个格式问题?@jozzas:格式问题,我很抱歉。我已经编辑了上面的代码。