двунаправленная связь через QTcpSocket

Я пишу приложение, которое связывается через QTcpSocket между сервером и клиентом.

Сервер представляет собой приложение с графическим интерфейсом на стандартном ПК.

Клиент представляет собой консольное приложение на Raspberry pi.

client.cpp

#include "client.h"#include <QHostAddress>
#include <cstdio>
Client::Client() :
QObject()
{
socket = new QTcpSocket(this);
printf("try to connect.\n");
connect(socket, SIGNAL(connected()),
this, SLOT(onConnected()));
connect(socket, SIGNAL(readyRead()),
this, SLOT(readyRead()));
}

void Client::onConnected()
{
printf("Connection established.\n");
//    char buffer[1024];
//    forever
//    {
//        while(socket->canReadLine())
//        {
//            QByteArray ba = socket->readLine();
//            printf("from server: %s", ba.constData());
//        }
//        printf(">> ");
//        gets(buffer);
//        int len = strlen(buffer);
//        buffer[len] = '\n';
//        buffer[len+1] = '\0';
//        socket->write(buffer);
//        socket->flush();
//    }
}
void Client::readyRead(){
if(socket->canReadLine())
{
QByteArray ba = socket->readLine();
printf("from server: %s", ba.constData());
}else{
printf(":(");
}
}

void Client::connectToServer()
{
socket->connectToHost(QString("192.168.0.103"), 5100);
}

server.cpp

#include "server.h"#include <QTcpServer>
#include <QTcpSocket>
#include <cstdio>
#include <QtDebug>

Server::Server(int listenPort)
:QObject()
{
port = listenPort;
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()),
this, SLOT(onNewConnection()));
}

void Server::listen()
{
server->listen(QHostAddress::Any, port);
}
void Server::sendMessage(QString message){
qDebug() << message;
QByteArray response;
response.append(message);
qDebug() <<   socket->peerAddress() ;
socket->write(response);
socket->flush();
}

void Server::onNewConnection()
{
socket = server->nextPendingConnection();

if(socket->state() == QTcpSocket::ConnectedState)
{

qDebug()<<socket->peerAddress();\
emit onConnectionEstablished(socket->peerAddress().toString());

}
connect(socket, SIGNAL(disconnected()),
this, SLOT(onDisconnected()));
connect(socket, SIGNAL(readyRead()),
this, SLOT(onReadyRead()));
}

void Server::onReadyRead()
{

if(socket->canReadLine())
{
QByteArray ba = socket->readLine();

emit onMessageRecieved(QString(ba));QByteArray response("maslO!");

// some code which parses arrived message
// and prepares response

socket->write(response);
socket->flush();
}
//else just wait for more data
}

void Server::onDisconnected()
{
printf("Connection disconnected.\n");
disconnect(socket, SIGNAL(disconnected()));
disconnect(socket, SIGNAL(readyRead()));
socket->deleteLater();
}

Это код. Итак, теперь описание проблемы:

Я запускаю серверное приложение, а затем клиентское приложение на Raspberry.
Оба приложения подключаются, я вижу это в методе «onNewConnection» в Server.cpp.

Но когда я пытаюсь что-то отправить клиенту, используя «sendMessage» в server.cpp, клиент ничего не показывает.
Я должен получить данные с сервера в методе «readyRead» в client.cpp, но он никогда не вызывается. Что я не прав?

Мой друг сказал мне проверить, получаю ли я одинаковую версию QT на обеих платформах. Итак, я проверил, и это не так, но может быть, это проблема?

Raspberry pi, Arch Linux без x-сервера

QMake version 3.0
Using Qt version 5.2.1 in /usr/lib

Сервер, Linux Mint

QMake version 3.0
Using Qt version 5.2.0 in /home/adam/Qt/5.2.0/gcc_64/lib

Можете ли вы дать мне несколько советов по улучшению этого кода?

1

Решение

Задача ещё не решена.

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

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

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