Автор: breeve 22.12.2011, 18:22
Имею следующий код:
Код клиента:
...
socket->write(name);
socket->write(message);
socket->write(end);
Код сервера:
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
Цитата(breeve @ 22.12.2011, 19:22)
По идее ведь я 3 раза записал в клиенте. Соответственно на сервере должен 3 раза вызваться сигнал readyRead().
Нет, так не работает.
Количество записей в клиенте не гарантирует такое же количество на сервере. Записи могут прийти как разделенные на несколько частей, так и слитые вместе. А может быть и то и другое одновременно.
Здесь на форуме есть темы по сборке сообщений из сокета, например http://www.forum.crossplatform.ru/index.php?showtopic=7790
Цитата(breeve @ 22.12.2011, 19:22)
Объясните пожалуйста как сделать так чтобы последовательно обрабатывать: клиент записал первую порцию, и пока сервер не обработает, он не может записать следующее.
Для этого необходимо разработать протокол взаимодействия клиента и сервера. Сервер должен оповещать клиента о том, что он сообщение обработал.
Автор: Strikevld 23.12.2011, 12:35
Цитата(ssoft @ 23.12.2011, 7:21)
Записи могут прийти как разделенные на несколько частей, так и слитые вместе. А может быть и то и другое одновременно.
Можно ведь переопределить класс, и сделать слияние кусков полученных данных в один кусок!
Я именно так и делал! Добавил сигнал messageIntered и всё!
Правда для полной уверенности пришлось вставить сигнатуры начала и конца сообщения для подтверждения доставки - а это
+ 8 байт (т.е. 4 - начало и 4 - конец) к каждому сообщению!