J'ai un serveur socket Web qui se connecte aux clients. Le code suivant est: -Twisted Python - Pousser les données vers la socket Web
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
class Chat(LineReceiver):
def __init__(self, users):
self.users = users
self.name = None
self.state = "GETNAME"
def connectionMade(self):
self.sendLine("What's your name?")
def connectionLost(self, reason):
if self.users.has_key(self.name):
del self.users[self.name]
def lineReceived(self, line):
if self.state == "GETNAME":
self.handle_GETNAME(line)
else:
self.handle_CHAT(line)
def handle_GETNAME(self, name):
if self.users.has_key(name):
self.sendLine("Name taken, please choose another.")
return
self.sendLine("Welcome, %s!" % (name,))
self.name = name
self.users[name] = self
self.state = "CHAT"
def handle_CHAT(self, message):
# Need to send the message to the connected clients.
class ChatFactory(Factory):
def __init__(self):
self.users = {} # maps user names to Chat instances
def buildProtocol(self, addr):
return Chat(self.users)
reactor.listenTCP(8123, ChatFactory())
reactor.run()
Les clients se connectent au code ci-dessus (serveur) et envoient les données au serveur.
Maintenant, j'ai un autre script python, fondamentalement un scrapper qui scraps le web, le traite et finalement besoin d'envoyer les données aux clients connectés.
script.py
while True:
# call `send_message` function and send data to the connected clients.
Comment puis-je parvenir ?? Tout exemple serait d'une grande aide !!
MISE À JOUR
After using Autobahn
J'ai un serveur qui va chercher les données de l'API 3ème partie. Je veux envoyer ces données à tous les clients socket Web connectés. Voici mon code: -
class MyServerProtocol(WebSocketServerProtocol):
def __init__(self):
self.connected_users = []
self.send_data()
def onConnect(self, request):
print("Client connecting: {0}".format(request.peer))
def onOpen(self):
print("WebSocket connection open.")
self.connected_users.append(self) # adding users to the connected_list
def send_data(self):
# fetch data from the API and forward it to the connected_users.
for u in self.users:
print 1111
u.sendMessage('Hello, Some Data from API!', False)
def onClose(self, wasClean, code, reason):
connected_users.remove(self) # remove user from the connected list of users
print("WebSocket connection closed: {0}".format(reason))
if __name__ == '__main__':
import sys
from twisted.python import log
from twisted.internet import reactor
factory = WebSocketServerFactory(u"ws://127.0.0.1:9000")
factory.protocol = MyServerProtocol
reactor.listenTCP(9000, factory)
reactor.run()
Mon serveur ne recevra jamais un message ou recevra probablement, mais au moment il n'y a pas de cas d'utilisation, donc pas besoin d'événement OnMessage
pour cet exemple).
Comment écrire ma fonction send_data
pour envoyer des données à tous mes clients connectés?
Quoi de 'send_message'? Où sont les "websockets"? –
'send_message' sera une fonction via laquelle les données seront transmises aux clients web connectés (sockets)? – PythonEnthusiast
"websockets" est un protocole spécifique - https://en.wikipedia.org/wiki/WebSocket - qui ne semble pas être utilisé dans votre exemple de code. Si vous avez vraiment besoin de WebSockets, jetez un oeil à Autobahn. –