J'essaie actuellement de créer une petite démo où je connecte une socket web entre mon ordinateur et mon hôte local ws://localhost:8080/ws
. Je veux que le socket Web surveille un fichier sur mon ordinateur pour les changements. S'il y a des changements, envoyez un message. La connexion et la sortie sont surveillées à l'aide d'Advanced Rest Client.Comment envoyer un message lorsque des modifications de fichiers ont été détectées? Twisted et Web Sockets
Existe-t-il une méthode spécifique que je peux utiliser sur la classe pour vérifier en permanence le contenu de ce fichier?
EDIT
J'ai mis en place un observateur en utilisant watchdog
qui détecte tous les cas pour les fichiers dans un répertoire spécifié. Toutefois, mon message n'est pas envoyé dans la méthode sendFSEvent
et j'ai également réalisé que mon client n'est pas enregistré lorsque je me connecte à la prise Web.
Voici mon code dans server.py
import sys
import os
from watchdog.observers import Observer
from twisted.web.static import File
from twisted.python import log
from twisted.web.server import Site
from twisted.internet import reactor, defer
from autobahn.twisted.websocket import WebSocketServerFactory, \
WebSocketServerProtocol, listenWS
from MessangerEventHandler import MessangerEventHandler
class WsProtocol(WebSocketServerProtocol):
def connectionMade(self):
print("Connection made")
WebSocketServerProtocol.connectionMade(self)
def onOpen(self):
WebSocketServerProtocol.onOpen(self)
print("WebSocket connection open")
def onMessage(self, payload, isBinary):
print("Message was: {}".format(payload))
self.sendMessage("message received")
def sendFSEvent(self, json):
WebSocketProtocol.sendMessage(self, json)
print('Sent FS event')
def onClose(self, wasClean, code, reason):
print("Connection closed: {}".format(reason))
WebSocketServerProtocol.onClose(self, wasClean, code, reason)
class WsServerFactory(WebSocketServerFactory):
protocol = WsProtocol
def __init__(self, url='ws://localhost', port=8080):
addr = url + ':' + str(port)
print("Listening on: {}".format(addr))
WebSocketServerFactory.__init__(self, addr)
self.clients = []
def register(self, client):
if not client in self.clients:
print("Registered client: {}".format(client))
self.clients.append(client)
def unregister(self, client):
if client in self.clients:
print("Unregistered client: {}".format(client))
self.clients.remove(client)
self._printConnected()
def _printConnected(self):
print("Connected clients:[")
def notify_clients(self, message):
print("Broadcasting: {}".format(message))
for c in self.clients:
c.sendFSEvent(message)
print("\nSent messages")
if __name__ == '__main__':
if len(sys.argv) < 2:
print("Usage: python server_defer.py <dirs>")
sys.exit(1)
log.startLogging(sys.stdout)
ffactory = WsServerFactory("ws://localhost", 8080)
ffactory.protocol = WsProtocol
listenWS(ffactory)
observers = []
for arg in sys.argv[1:]:
dir_path = os.path.abspath(arg)
if not os.path.exists(dir_path):
print('{} does not exist.'.format(dir_path))
sys.exit(1)
if not os.path.isdir(dir_path):
print('{} is not a directory.'.format(dir_path))
sys.exit(1)
# Check for and handle events
event_handler = MessangerEventHandler(ffactory, reactor, os.getcwd())
observer = Observer()
observer.schedule(event_handler, path=dir_path, recursive=True)
observer.start()
observers.append(observer)
try:
reactor.run()
except KeyboardInterrupt:
for obs in observers:
obs.stop()
reactor.stop()
print("\nGoodbye")
sys.exit(1)
Toute aide serait grandement appréciée.
Merci,
Brian
Dans quel système d'exploitation exécuterez-vous cette application? –
Windows en ce moment, mais passera à Linux (Red Hat). – Brian
En * nix, il y a l'attribut 'mtime' d'un fichier (cf' os.path.getmtime (path) ') que vous pouvez vérifier périodiquement. Une autre option consiste à calculer une somme de contrôle pour le fichier et à agir lorsqu'il est modifié. – boardrider