gpt4 book ai didi

python - 如何在检测到文件更改时发送消息? Twisted 和 Web 套接字

转载 作者:行者123 更新时间:2023-12-03 11:10:53 26 4
gpt4 key购买 nike

我目前正在尝试创建一个小型演示,在其中连接我的计算机和本地主机 ws://localhost:8080/ws 之间的网络套接字。我希望网络套接​​字监视我计算机上的文件以进行更改。如有变动,请留言。使用 Advanced Rest Client 监控连接和输出。

我可以在类上使用特定方法来不断检查此文件的内容吗?

编辑

我已经使用 watchdog 实现了一个观察器,它可以检测指定目录中文件的任何事件。但是,我的消息没有在 sendFSEvent 方法中发送,我还意识到当我连接到网络套接字时我的客户端没有被注册。

这是我在 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)

如有任何帮助,我们将不胜感激。

谢谢,

布莱恩

最佳答案

大多数企业发行版都带有 inotify,它非常适合监控文件和目录。基本思想是在连接时捕获已连接的 Web 套接字客户端列表。然后创建一个回调,当您正在监视的文件发生更改时将执行该回调。在此回调中,您可以迭代客户端并向它们发送消息,例如 'file: "blah/blah.txt"has changed'。这有点不靠谱,但代码片段应该会为您解决问题。

from functools import partial
from twisted.internet import inotify
from twisted.python import filepath
# the rest of your imports ...


class SomeServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
self.factory.append(self) # <== append this client to the list in the factory


def notification_callback(ignored, filepath, mask, ws_clients):
"""
function that will execute when files are modified
"""
payload = "event on {0}".format(filepath)
for client in ws_clients:
client.sendMessage(
payload.encode('utf8'), # <== don't forget to encode the str to bytes before sending!
isBinary = False)

if __name__ == '__main__':
root = File(".")
factory = WebSocketServerFactory(u"ws://127.0.01:8080")
factory.protocol = SomeServerProtocol
factory.clients = [] # <== create a container for the clients that connect

# inotify stuff
notify = partial(notification_callback, ws_clients=factory.clients) # <== use functools.partial to pass extra params
notifier = inotify.INotify()
notifier.startReading()
notifier.watch(filepath.FilePath("/some/directory"), callbacks=[notify])

# the rest of your code ...

关于python - 如何在检测到文件更改时发送消息? Twisted 和 Web 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44171009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com