Сообщение QLocalSocket to QLocalServer, поврежденное во время передачи

Мне не удалось найти подобную проблему, поэтому здесь идет:

Я отправляю QString из QLocalSocket в QLocalServer через два приложения. Принимающее (QLocalServer) приложение действительно получает сообщение, но кажется, что кодировка совершенно неправильная.

Если я отправлю QString = «x» из QLocalSocket (клиент), я получу иностранный (китайский?) Символ в QLocalServer. Мой код буквально скопирован с Сайт Nokia для разработчиков

Если я распечатываю сообщение через QDebug, я получаю «??». Если я запускаю его в окне сообщения, печатаются китайские иероглифы. Я безуспешно пытался перекодировать полученное сообщение в UTF-8, Latin1 и т. Д.

Код выглядит следующим образом:

//Client
int main(int argc, char *argv[])
{
QLocalSocket * m_socket = new QLocalSocket();
m_socket->connectToServer("SomeServer");

if(m_socket->waitForConnected(1000))
{
//send a message to the server
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << "x";
out.device()->seek(0);
m_socket->write(block);
m_socket->flush();
QMessageBox box;
box.setText("mesage has been sent");
box.exec();
...
}

//Server - this is within a QMainWindow
void MainWindow::messageReceived()
{
QLocalSocket *clientConnection = m_pServer->nextPendingConnection();

while (clientConnection->bytesAvailable() < (int)sizeof(quint32))
clientConnection->waitForReadyRead();connect(clientConnection, SIGNAL(disconnected()),
clientConnection, SLOT(deleteLater()));

QDataStream in(clientConnection);
in.setVersion(QDataStream::Qt_4_7);
if (clientConnection->bytesAvailable() < (int)sizeof(quint16)) {
return;
}

QString message;
in >> message;

QMessageBox box;
box.setText(QString(message));
box.exec();
}

Любая помощь высоко ценится.

1

Решение

Клиент сериализует const char* в то время как сервер десериализует QString, Это не совместимо. Первый буквально записывает байты строки, последний сначала кодирует в UTF-16. Итак, я предполагаю, что на стороне сервера необработанные строковые данные «fff» декодируются в QString, как если бы это были данные UTF-16 … возможно, в результате получается символ U + 6666, 晦.

Попробуйте изменить клиента, чтобы также сериализовать QString, т.е.

// client writes a QString
out << QString::fromLatin1("fff");

// server reads a QString
QString message;
in >> message;
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]