Основные вопросы о связи через сокеты Python; работа с netcat

Прежде всего позвольте мне сказать, что я не программист, но мне всегда удавалось делать то, что мне нужно, с помощью Python. Мой текущий проект - сетевой кодировщик для SageTV. SageTV PVR отправляет команды сетевому кодировщику, работающему на порту 4510, который, в свою очередь, настраивает карту захвата, а затем запускает запись ffmpeg на основе переданных параметров. Затем он продолжает прислушиваться к дальнейшим инструкциям и обрабатывать эти команды.

Я установил SageTV и могу общаться с помощью netcat. Это результат использования netcat:

root@debian# nc -l -k -p 4510
VERSION
1
STOP
OK

В приведенном выше примере. Сервер SageTV ответил «ВЕРСИЯ», я набрал «1», затем он ответил «СТОП», и я ответил «ОК».

Я пытался найти хороший пример того, как преобразовать то, что делает netcat, в скрипт Python. Я нашел различные примеры, но я просто не могу найти тот, который будет слушать и даже просто показывать то, что показывает сервер. Может ли кто-нибудь показать мне или указать хороший пример? Я знаю, что это должно быть очень легко сделать, но я безуспешно бился головой об этом. Любая помощь будет принята с благодарностью.


person dinki    schedule 29.09.2015    source источник
comment
Начните с socket(7), чтобы понять, что на самом деле делает netcat. Затем просмотрите кратко страницу socket, прежде чем продолжить на asyncio и / или _ 4_.   -  person Kevin    schedule 29.09.2015


Ответы (1)


Пример кода с использованием python3 и asyncio:

import asyncio

@asyncio.coroutine
def handler(reader, writer):
    def send(msg):
        print("send to device: {}".format(msg))
        writer.write((msg + '\n').encode())

    print("device connected")
    while True:
        msg = yield from reader.readline()
        if not msg:
            print("device disconnected")
            break
        msg = msg.decode().strip()
        print("got from device: {}".format(msg))

        if msg == 'VERSION':
            send('1')
        elif msg == 'STOP':
            send('OK')

loop = asyncio.get_event_loop()
coro = asyncio.start_server(handler, '0.0.0.0', 4510, loop=loop)
server = loop.run_until_complete(coro)
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

Для документации начните с https://docs.python.org/3/library/asyncio.html

person sisoft    schedule 29.09.2015
comment
Спасибо! Это именно то, что мне нужно. Могу я побеспокоить вас еще одним делом. Сервер отвечает следующим образом: BUFFER SageSlingBox-1 TV Tuner | 3 | 83886080 | D: \ Media \ tvrecordings \ SageSlingBox1on1921680204510TVTuner-0.mpgbuf | Лучше всего, я пытаюсь вытащить путь к файлу из этого беспорядка, но я ' m испытывает трудности, поскольку видит \ tvrecordings как \ t vзаписи. Вкладка vrecordings. Есть идеи о том, как очистить msg? Я попытался заменить \ на /, но не могу заставить это работать. - person dinki; 29.09.2015
comment
используйте экранирование путем удвоения \\: \\tvrecordings - person sisoft; 29.09.2015