crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Andrewshkovskii
  опции профиля:
сообщение 8.12.2011, 11:03
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Есть клиент и сервер. Постоянно обмениваются сообщениями разной длинны.
Сейчас, что бы понять, где кончается одно сообщение и начинается другое, используется конвенция сообщений такая :
Цитата
%длина_всего_соообщения%|%тело сообщения%


Но с этим иногда бывают косяки. Есть ли какие-то ещё конвенции или парадигмы, как лучше общаться сокетам большими сообщениями?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
kuzulis
  опции профиля:
сообщение 8.12.2011, 14:43
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата
Я вроде говорил о том, что над протоколом, а не внутри. Зачем Вы мне все это написали?

Я тебе и написал про "НАД".

Цитата
Я не протокол пишу, а пытаюсь понять - как лучше передавать сообщения между сокетами, что бы соблюдалась целостность при передаче данных кусками (именно так оно работает в реальности).

Я тебе написал как. Если не понимаешь - то брось это дело.
Без некоего протокола передачи - у тебя ничего не получится. Бросай в общем..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 8.12.2011, 16:09
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Цитата(kuzulis @ 8.12.2011, 14:43) *
Цитата
Я вроде говорил о том, что над протоколом, а не внутри. Зачем Вы мне все это написали?

Я тебе и написал про "НАД".

Цитата
Я не протокол пишу, а пытаюсь понять - как лучше передавать сообщения между сокетами, что бы соблюдалась целостность при передаче данных кусками (именно так оно работает в реальности).

Я тебе написал как. Если не понимаешь - то брось это дело.
Без некоего протокола передачи - у тебя ничего не получится. Бросай в общем..

Не брошу.

Цитата(ssoft @ 8.12.2011, 15:43) *
Цитата(Andrewshkovskii @ 8.12.2011, 15:05) *
Косяки в производителельности таких алгоритмов разбора сообщения - операции со строками в основном.


Здесь есть пример сборки сообщения из сокета.
сборка сообщения
Никаких операций со строками производить не нужно.
С одной стороны отправил QByteArray, с другой получил.

Дело в том, что я все это для питона собираю - там я использую строки и сериализованный json, а не bytearray.
Кстати, вот код, если кому интересно :
def on_ready_read(self):
        data = str(self.readAll())
        while data:
            if not self.wait_len and '|' in data:#new data and new message
                    self.wait_len , data = data.split('|',1)
                    if match('[0-9]+', self.wait_len) and (len(self.wait_len) <= MAX_WAIT_LEN) and data[0]=='{':#okay, this is normal length
                        self.wait_len = int(self.wait_len)
                        self.temp = data[:self.wait_len]
                        data = data[self.wait_len:]
                    else:#oh, it was crap
                        self.wait_len , self.temp = '',''
                        return
            elif self.wait_len:#okay, not new message, appending
                self.temp+=data[:(self.wait_len-len(self.temp))]
                data=data[len(self.temp):]
            elif not self.wait_len and not '|' in data:#crap
                return
            if self.wait_len and self.wait_len == len(self.temp):#okay, full message
                    self.data_ready.emit(self.temp)
                    self.wait_len ,self.temp = '',''
                    if not data:
                        return


Сообщение отредактировал Andrewshkovskii - 8.12.2011, 19:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Andrewshkovskii   Прием данных по сокету. Какие конвенции лучше?   8.12.2011, 11:03
- - sidsukana   А чем тебя не устраивает обмениваться структурами?...   8.12.2011, 11:21
- - kuzulis   ЦитатаЕсть ли какие-то ещё конвенции или парадигмы...   8.12.2011, 12:17
|- - Andrewshkovskii   Цитата(kuzulis @ 8.12.2011, 12:17) Цитата...   8.12.2011, 14:05
- - ssoft   Цитата(Andrewshkovskii @ 8.12.2011, 12:03...   8.12.2011, 13:34
- - kuzulis   ЦитатаЯ вроде говорил о том, что над протоколом, а...   8.12.2011, 14:43
|- - Andrewshkovskii   Цитата(kuzulis @ 8.12.2011, 14:43) Цитата...   8.12.2011, 16:09
- - ssoft   Цитата(Andrewshkovskii @ 8.12.2011, 15:05...   8.12.2011, 15:43
- - Влад   Цитата(Andrewshkovskii @ 8.12.2011, 12:03...   9.12.2011, 15:45
|- - Andrewshkovskii   Цитата(Влад @ 9.12.2011, 15:45) Цитата(An...   9.12.2011, 16:26
- - Влад   Гмм. Что-то это из категории загадок.... :-) Во-п...   10.12.2011, 19:19
|- - Andrewshkovskii   Цитата(Влад @ 10.12.2011, 19:19) Гмм. Что...   10.12.2011, 22:42
|- - BRE   Цитата(Andrewshkovskii @ 10.12.2011, 23:4...   10.12.2011, 22:56
- - Andrewshkovskii   Т.е. , если я передаю файл, скажем, 1 гб, и где-то...   10.12.2011, 23:49
- - BRE   Если пакет теряется - стек будет просить его переп...   11.12.2011, 0:06
- - Влад   А если ты эту ошибку не обрабатываешь, то это баг ...   11.12.2011, 13:05
|- - BRE   Цитата(Влад @ 11.12.2011, 14:05) (С колле...   11.12.2011, 14:35
- - Andrewshkovskii   Сообщение перемещено Сюда   14.12.2011, 22:18


Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.4.2025, 15:38