Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Передача данных, клиенту приходит не строка а массив [RSS Feed]

#1 Авг. 15, 2015 11:11:49

realivan
Зарегистрирован: 2015-08-15
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных, клиенту приходит не строка а массив

Добрый день.
Проблема такая: при передаче данных в виде строки (например, первый пакет “имя”, второй пакет “фамилия”) клиентам приходит массив из строк в виде одного пакета . Причем проблема появляется только тогда, когда клиентов более 1-го, и не постоянно.

# функция чтения сообщения
def read_package(sock, addr=''):
    if addr == '':
        addr = 'server'
    try:
        data = sock.recv(1024).decode('utf-8')
        if data != '>no':
            if '>no' in data:
                data = data.replace('>no', '')
            if data == '':
                data = '>no'
            data = data.split('$')
            l = []
            for k in data:
                if len(k) != 0:
                    l.append(k)
            data = l
            print("<--, '%s' от '%s'" %(data, addr))
    except:
        return None
    return data
# функция сервера передачи сообщения
def send_info(self, data = '', client = False):
        if not client:
            if not self.queue.empty():
                data = self.queue.get(block=False)
                Thread(target = process_data, args = (data,)).start()
        if data != '>no':
            data += '$'
            for s in self.sockets:
                if data != '':
                    s.send(data.encode('utf-8'))
                    print('-->, ', data)                
                else:
                    s.send('>no'.encode('utf-8'))

Отредактировано realivan (Авг. 15, 2015 11:14:28)

Прикреплённый файлы:
attachment 1.jpg (113,8 KБ)

Офлайн

#2 Авг. 15, 2015 17:33:57

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Передача данных, клиенту приходит не строка а массив

realivan
например, первый пакет “имя”,
При передаче данных через сокеты нет понятия пакет. Сокет это потенциально бесконечный поток данных.Если нужны пакеты - вы должны сами разбираться где пакет начинается и кончается. Ваша проблема результат буферизации при передаче данных.



Отредактировано doza_and (Авг. 15, 2015 17:35:02)

Офлайн

#3 Авг. 15, 2015 18:30:00

realivan
Зарегистрирован: 2015-08-15
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных, клиенту приходит не строка а массив

Ваша проблема результат буферизации при передаче данных.
Как можно это исправить?

Офлайн

#4 Авг. 15, 2015 20:49:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Передача данных, клиенту приходит не строка а массив

realivan
Как можно это исправить?
Или использовать более высокоуровневые протоколы. pympi, zeromq, pyro4 почти любая СУБД и т.п.
Или самому придумать протокол - Стартовые стоповые последовательности. Контроль целостности, восстановление при потере коннекта это похоже минимальные требования.



Отредактировано doza_and (Авг. 15, 2015 20:52:52)

Офлайн

  • Начало
  • » Network
  • » Передача данных, клиенту приходит не строка а массив[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version