Desidero chiamare il metodo sendMessage
dall'esterno della classe MyServerProtocol
e inviare un messaggio ai client connessi. Io uso threading
per fare questo.sendMessage dall'esterno in autostrada in esecuzione in thread separato
Quando uso di questo codice:
from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
from twisted.internet import reactor
import threading
class MyServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("Client connecting: {0}".format(request.peer))
def onOpen(self):
print("WebSocket connection open.")
def onMessage(self, payload, isBinary):
if isBinary:
print("Binary message received: {0} bytes".format(len(payload)))
else:
print("Text message received: {0}".format(payload.decode('utf8')))
self.sendMessage(payload, isBinary)
def onClose(self, wasClean, code, reason):
print("WebSocket connection closed: {0}".format(reason))
class Connection(threading.Thread):
def __init__(self):
super(Connection, self).__init__()
def run(self):
self.factory = WebSocketServerFactory("ws://localhost:9000", debug=False)
self.factory.protocol = MyServerProtocol
reactor.listenTCP(9000, self.factory)
reactor.run(installSignalHandlers=0)
def send(self, data):
reactor.callFromThread(self.factory.protocol.sendMessage, self.factory.protocol, data)
connection = Connection()
connection.daemon = True
connection.start()
connection.send('test')
questo errore si verifica:
connection.send('test')
reactor.callFromThread(self.factory.protocol.sendMessage, self.factory.protocol, data)
AttributeError: 'Connection' object has no attribute 'factory'
Se provo a commentare la riga connection.send('test')
, questo errore si verifica:
TypeError: 'NoneType' object is not iterable
Cosa è il problema con il mio codice?
Sto facendo questo nel modo giusto? O c'è un altro modo per inviare messaggi ai client al di fuori della classe del protocollo?
Grazie.
Does self.factory esiste quando si chiama send? Prova a mettere un sonno tra start() e send() e controlla. Inoltre, usa un debugger. – Raito
Hai mai capito come si fa? Sto avendo lo stesso problema. – someuser