Дебаг выводит
"send-screen" QSize(-1, -1) ""
"" QSize(-1, -1) ""
"" QSize(-1, -1) ""
..................................
"" QSize(-1, -1) ""
"" QSize(-1, -1) ""
Почему изображение и последняя строка не читаются?
Сигнал readyRead() присылается при получении пакета данных. Вероятно, когда вы его получаете, данные пришли ещё не все, сокет просто не может логически разделить пакеты так как вам необходимо . Возможно проблема сейчас и не в этом, но столкнуться с этим придётся, поэтому сразу реализуйте проверку на кол-во данных. Здесь на форуме уже писали (вроде и я писал) как поступить в этом случае. Есть метод bytesAvailable() у QIODevice и есть ваш пакет данных, размер которого необходимо знать до отправки, соответственно при приёме можно вычислить все ли необходимые данные уже находиться в буфере сокета, после чего считывать.
Если на вскидку, то всё просто, писать сначала в QByteArray а потом его и отправлять:
отправка:
C++ (Qt)
...
QByteArray msg;
QDataStream stream(&msg, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_4_6);
stream << some_data;
stream << some_data;
stream << some_data;
sendPacket(msg);
}
void sendPacket(QByteArray data)
{
qint32 _size = data.size();
if(data.size())
{
p_ioDevice->write((char*)&_size, sizeof(_size));
p_ioDevice->write(data);
qDebug() << "[net] send packet with size:" << data.size();
}
}
quint32 чтобы работало везде на 32-х и на 64-х битах одинаково
p_ioDevice - это сокет.
получение:
C++ (Qt)
void net::ready_read() // from signal readyRead()
{
while(checkMessage())
{
qint32 _size=0;
QByteArray data;
// read packet size
qint64 _readed = p_ioDevice->read((char*) &_size, sizeof(_size));
if((sizeof(_size)==_readed) && (_size>0))
{
// read data
data = p_ioDevice->read(_size);
if(data.size() != _size)
{
// error!!!
// disconnect, ...
return;
}
packet_ready(data);
}
}
}
bool net::checkMessage()
{
// check packet size
qint32 _size=0;
qint64 _bytes_available = p_ioDevice->bytesAvailable();
if(_bytes_available < sizeof(_size)) return false;
qint64 _peek_size = p_ioDevice->peek((char*)&_size, sizeof(_size));
if(_peek_size != sizeof(_size)) return false;
if(0 == _size)
{
p_ioDevice->read(4); // empty packet
return false;
}
_bytes_available = p_ioDevice->bytesAvailable();
if(_bytes_available < sizeof(_size) + _size) return false;
return true;
}
void net::packet_ready(QByteArray msg)
{
QDataStream stream(&msg, QIODevice::ReadOnly);
stream.setVersion(QDataStream::Qt_4_6);
stream >> some_data
stream >> some_data
...
}