crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> сигнал readyRead()
breeve
  опции профиля:
сообщение 22.12.2011, 18:22
Сообщение #1


Участник
**

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

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




Репутация:   1  


Имею следующий код:

Код клиента:
client
...
socket->write(name);
socket->write(message);
socket->write(end);
Код сервера:
server
void parse(){
    socket = server->nextPendingConnection();
    connect(socket, SIGNAL(readyRead()), this, SLOT(s_readMessage()));
}

void s_readMessage()
{
    QByteArray message = temp->readAll();
    ...
}

По идее ведь я 3 раза записал в клиенте. Соответственно на сервере должен 3 раза вызваться сигнал readyRead().
Но почему-то это не всегда так. Если name + message + end размером около 30 байт, то все это на сервере приходит как одно сообщение и сигнал срабатывает только один раз.
Объясните пожалуйста как сделать так чтобы последовательно обрабатывать: клиент записал первую порцию, и пока сервер не обработает, он не может записать следующее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 23.12.2011, 7:21
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

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




Репутация:   3  


Цитата(breeve @ 22.12.2011, 19:22) *
По идее ведь я 3 раза записал в клиенте. Соответственно на сервере должен 3 раза вызваться сигнал readyRead().


Нет, так не работает.
Количество записей в клиенте не гарантирует такое же количество на сервере. Записи могут прийти как разделенные на несколько частей, так и слитые вместе. А может быть и то и другое одновременно.
Здесь на форуме есть темы по сборке сообщений из сокета, например тут

Цитата(breeve @ 22.12.2011, 19:22) *
Объясните пожалуйста как сделать так чтобы последовательно обрабатывать: клиент записал первую порцию, и пока сервер не обработает, он не может записать следующее.


Для этого необходимо разработать протокол взаимодействия клиента и сервера. Сервер должен оповещать клиента о том, что он сообщение обработал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Strikevld
  опции профиля:
сообщение 23.12.2011, 12:35
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(ssoft @ 23.12.2011, 7:21) *
Записи могут прийти как разделенные на несколько частей, так и слитые вместе. А может быть и то и другое одновременно.

Можно ведь переопределить класс, и сделать слияние кусков полученных данных в один кусок!
Я именно так и делал! Добавил сигнал messageIntered и всё!
Правда для полной уверенности пришлось вставить сигнатуры начала и конца сообщения для подтверждения доставки - а это
+ 8 байт (т.е. 4 - начало и 4 - конец) к каждому сообщению!

Сообщение отредактировал Strikevld - 23.12.2011, 12:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 22.11.2024, 7:17