Подходит ли многоадресная передача для потоковой передачи от одного до нескольких в пределах локального хоста? - PullRequest
0 голосов
/ 28 января 2012

У меня есть центральный канал данных, который я хочу перераспределить среди многих клиентов. Подача данных производит ок. 1,8 кБ / с. В настоящее время я записываю канал в файл, и каждый клиент читает его конец. Что-то в этом просто кажется неправильным. Вот псевдокод для того, что у меня сейчас ...

Подача:

o = open('feed.txt','a',0) #no buffering, maybe line buffer would be better
while 1:
    data = feed.read(8192)
    data = parse_data(data)
    o.write(data)
    time.sleep(0.01)

Сервер (каждый клиент подключается в новом потоке):

feed = open('feed.txt','r')
feed.seek(-1024,2)
while 1:
   dat = feed.read(1024)
   if len(dat)==0:
       # For some reason if the end of the file is reached
       # i can't read any more data, even there is more.
       # some how backing off seems to fix the problem.
       self.feed.seek(-1024,2)
       self.feed.read(1024)
   buffer += dat
   idx = buffer.rfind('\n')
   if idx>0:
       data = buffer[:idx]
       buffer = buffer[idx+1:]
       for msg in data.split('\n'):
           client.send(msg)
   time.sleep(0.01)

Что я хотел бы сделать, это просто заменить файл сокетом и записать сообщения непосредственно в многоадресные пакеты. Каждый раз, когда новый клиент подключается к серверу, я просто запускаю новый поток и начинаю прослушивать многоадресные пакеты. Существуют ли стандартные шаблоны дизайна для этого случая?

1 Ответ

1 голос
/ 28 января 2012

Еще проще, просто многоадресная рассылка всех клиентов на один и тот же порт.Тогда вашему серверу даже не нужно отслеживать псевдосоединения.

Мы используем аналогичную схему для некоторых программ нашей внутренней сети, основываясь на том факте, что многоадресная рассылка «в основном надежна» в нашей сетевой инфраструктуре.,Мы стресс-тестировали нагрузку и не начинаем отбрасывать пакеты, пока не будет более 30K сообщений / сек.

#!/usr/bin/python

import sys
import socket

ADDR = "239.239.239.9"
PORT = 7999

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((ADDR,PORT))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

while True:
    data, addr = sock.recvfrom(2048)
    print data
    sys.stdout.flush()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...