Есть клиент, который выполняет функции:
1. Отправлять запрос серверу.
2. Отправлять сообщения серверу.
3. Получать сообщения от сервера.
Есть сервер, выполняющий функции:
1. Он получает сообщения от клиента производит действия на сервере, отсылает ответ.
2. Сам посылает сообщения клиенту.
Программа работает в таком режиме. Устанавливаем соединение, а дальше посылаем и принимает сообщения от сервера, после выхода из программы закрываем соединение. Вся передача сообщений происходит в одном сокете.
Сервер состоит из clientsocket.h - наследуется от QTcpSocket в котором производятся вычисления, server.h - наследуется от QTcpServer переопределяет incomingConnection и главной функции.
На сервере clientsocket.cpp используем QTimer для посылки самостоятельных сообщений клиенту.
slot для отправки сообщений.
void ClientSocket::sendSignalLevel()
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << quint16(0);//размер сообщения
out << signalLevel_d2;//команда клиенту
out << signalLevel_;//уровень сигнала int
out.device()->seek(0);
out << quint16(block.size() - sizeof(quint16));
write(block);
}
Так же, там есть функция отправки ответа на сообщения клиента.
void ClientSocket::readClient()
{
QDataStream in(this);
in.setVersion(QDataStream::Qt_4_7);
if (nextBlockSize == 0)
{
if (bytesAvailable() < (int)sizeof(quint16))
return;
in >> nextBlockSize;
}
if (bytesAvailable() < nextBlockSize)
return;
else
nextBlockSize = 0;
//3 байт - команда серверу
quint8 commandClient;
in >> commandClient;
qDebug() << "Received command " << commandClient;
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
//команды от клиента
switch(commandClient)
{
case powerOn_d1 :
{
d1.powerState = true;
//size of data
out << quint16(0);
//command to client
out << powerOn_d1_Good;
out << d1.powerState << d1.attenuatorValue << d1.amperage_voltage_conformity
<< d1.amperage << d1.voltage;
break;
}
....
}
out.device()->seek(0);
out << quint16(block.size() - sizeof(quint16));
qDebug() << "transmitted size of block: " << quint16(block.size() - sizeof(quint16));
write(block);
}
Вообщем у меня возник вопрос.
Когда клиент посылает много сообщений серверу. Мне кажется сервер иногда не успевает обрабатывать, все полученные сообщения от клиента и отсылает только некоторые из них, из за этого клиент работает не корректно. Есть предположение что сервер не успевает записывать данные в сокет, так как он в то же время посылает уровень сигнала клиенту. Я на сервере используются две функции write(). Как мне избавится от такой проблемы, чтобы сервер принимал все сообщения от клиента и записывал все ответы, и в то же время посылал уровень сигнала в виде сообщения?