Я новичок в Python и нуждаюсь в помощи с архитектурой. Вот моя установка: у меня есть устаревшее клиентское приложение, написанное на LiveCode, которое работает в нескольких местах для отображения синхронизированной информации в зависимости от требований сервера. Думайте об этом как о киоске. Эта клиентская часть никуда не денется.
Серверное приложение - это то, что я переписываю на Python. Моя цель состоит в том, чтобы серверное приложение работало постоянно, прослушивая соединения клиентских сокетов и отправляя / получая данные этим клиентам / от них. Я успешно передал сообщения между этим клиентским приложением LiveCode и скриптом python, который использует Twisted для обработки сокетов, поэтому теперь мне нужно начать обработку этих сообщений. Код выглядит примерно так:
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
class MessageListener(LineReceiver):
def __init__(self, users):
self.users = users
self.name = None
def connectionMade(self):
d = self.transport.getHost()
print("Connection established with {}:{}".format(d.host, d.port))
def connectionLost(self, reason):
print("Connection lost: {}".format(reason))
if self.name in self.users:
del self.users[self.name]
def dataReceived(self, line):
d = self.transport.getHost()
print("Received message from {}:{}...{}".format(d.host, d.port, line))
self.handle_GOTDATA(line)
def handle_GOTDATA(self, msg):
#convert "msg" to string and parse it into the necessary chunks
#*****Go do something based on the requestor and the command*****
#Use if-elif or dictionary to determine which function to run
#based on what the string tells us.
#Should these functions be defined here or in a separate class?
class MessageListenerFactory(Factory):
def __init__(self):
self.users = {} # maps user names to Chat instances
def buildProtocol(self, addr):
return MessageListener(self.users)
reactor.listenTCP(50010, MessageListenerFactory())
reactor.run()
Пара вопросов:
Функция handle_GOTDATA () - это то место, где я беру полученное сообщение, разбираю его на фрагменты, которые говорят мне, что делать с данными, а затем вызываю другую функцию в зависимости от того, что нужно сделать с этими данными. Должен ли я просто определить все 20 этих функций в одном и том же классе «MessageListener» или написать отдельный класс для хранения всех этих функций? Я могу получить 10 сообщений одновременно, и им может потребоваться вызвать одну и ту же функцию, поэтому я не был уверен, что здесь лучший архитектурный подход.
Я также хочу создать графический интерфейс для взаимодействия с сервером для устранения неполадок и мониторинга. Я знаком с Tkinter, и это было бы хорошо для этого, и я могу написать графический интерфейс в отдельном файле и подключить его к серверу через сокет. Но могу ли я использовать тот же прослушиватель сокетов, реализованный выше, и просто передавать ему похожие сообщения? Или мне следует создать отдельный класс и фабрику для прослушивания подключений графического интерфейса?