python - Twisted UDP - 为什么不听就不能发送?
问题描述
如何在不调用 Reactor.ListenUDP 的情况下发送?如果我尝试,那么我会在协议类中得到一个异常,即传输为 NULL。在您调用 reactor.ListenUDP 之前,它似乎没有在基类中设置。当然,您可以在不收听传入消息的情况下进行发送。毕竟,服务器可能根本不想接收。
----main.py------
import wx
from twisted.internet import wxreactor
from main_window import MainWindow
def main():
app = wx.App(False)
frame = MainWindow(None, 'UDP Demo')
from twisted.internet import reactor
reactor.registerWxApp(app)
reactor.run()
if __name__ == "__main__":
wxreactor.install()
main()
---main_window.py---
# SNIP - Nothing really relevant. Just creates the classes below and hooks up buttons to call their methods
---plugin.py----
from enum import Enum
from twisted.internet.error import CannotListenError
from udp_protocol import UDPProtocol
class PluginBase(object):
"""
This is just a dummy class to match what is in Falco
"""
def __init__(self, app_dist, *args, **kwargs):
pass
class Plugin(PluginBase):
class State(Enum):
"""
Represents the states that the plugin can be in
"""
CLOSED = 0 # Initial state
LISTENING = 1 # After open() is called
RECV_CALLBACK_REGISTERED = 2 # After listen() is called
def __init__(self, app_dist, *args, **kwargs):
super(Plugin, self).__init__(app_dist, *args, **kwargs)
self.state = self.State.CLOSED
self.port = None
self.listener = None
self.listen_callback = None
self.protocol = UDPProtocol(self.on_data_received)
def listen(self, port, isBroadcast, callback, errback=None):
if self.state != self.State.CLOSED:
raise RuntimeError("UDP Plugin already in an opened state")
self.port = port
# Start listening
try:
from twisted.internet import reactor
self.listener = reactor.listenUDP(self.port, self.protocol)
self.state = self.State.LISTENING
callback()
except CannotListenError as err:
error_json = {"error": err[2].strerror}
if errback is not None:
errback(error_json)
def stop_listening(self):
if self.listener is not None:
self.listener.stopListening()
self.listener = None
self.listen_callback = None
self.port = None
self.state = self.State.CLOSED
def send(self, addr, port, data):
# While it seems like one could send without listening for incoming messages,
# twisted's implementation doesn't seem to work that way?
# The transport in the protocol object only gets created when we call reactor.listenUDP,
# as far as I can tell
if self.state == self.State.CLOSED:
raise RuntimeError(
"UDP Plugin must be in an open state before attempting to send")
self.protocol.send(addr, port, data)
# SNIP recv
----udp_protocol.py---
from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor
class MyProtocol(DatagramProtocol):
def datagramReceived(self, data, (host, port)):
print "received %r from %s:%d" % (data, host, port)
self.transport.write(data, (host, port))
def send(self, addr, port, data):
self.transport.write(data, (addr, port))
解决方案
当然,您可以在不收听传入消息的情况下进行发送。
事实证明,没有。但是,没有什么会迫使您对到达的任何传入消息执行任何操作。
推荐阅读
- python - 没有名为“matplotlib.artist”的模块
- c++ - 在 C++ 中返回 Int 函数
- oracle - 语句未在 Oracle 中使用 Execute Immediate 执行
- gtk3 - 替代已弃用的 gtk_alignment_new
- git - 如何使 vsts 上的 git repo 与 mercurial repo 保持同步
- node.js - Docker NodeJS Puppeteer@2.0.0 - 如何修复无法启动 chrome!问题
- angular - 发布 .netcore 角度项目给出“SPA 默认页面中间件无法返回 index.html”,在调试中工作
- angular - 以角度上传后立即显示上传的图像
- javascript - AngularFire 存储 - 类型错误:无法读取未定义的属性 'then'
- javascript - 甜蜜警报在单击按钮上不起作用,单击按钮时未显示警告