2015-09-29 1 views
0

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

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

[email protected]# nc -l -k -p 4510 
VERSION 
1 
STOP 
OK 

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

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

+0

Start с [ 'гнездо (7)'] (http://linux.die.net/man/7/socket), чтобы понять, что делает netcat. Затем возьмите * краткий * взгляд на ['socket'] (https://docs.python.org/3/library/socket.html), прежде чем продолжить [' asyncio'] (https: //docs.python. org/3/library/asyncio.html) и/или ['socketserver'] (https://docs.python.org/3/library/socketserver.html#module-socketserver). – Kevin

ответ

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

+0

Спасибо! Это именно то, что мне нужно. Если я могу беспокоить вас еще одним делом. Сервер отвечает назад с пути окна, как это: BUFFER SageSlingBox-1 ТВ-тюнер | 3 | 83886080 | D: \ Media \ tvrecordings \ SageSlingBox1on1921680204510TVTuner-0.mpgbuf | Лучший Я пытаюсь вытащить FilePath из этого jumble, но у меня есть мир трудности, поскольку он видит \ tvrecordings как \ t vrecordings. Вставить записи. Любая идея о том, как дезинфицировать msg? Я попытался заменить \ с /, но я не могу заставить это работать. – dinki

+1

использование ускорения путем удвоения \\: '\\ tvrecordings' – sisoft

Смежные вопросы