Я пишу приложение, которое связывается через 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
Можете ли вы дать мне несколько советов по улучшению этого кода?
Задача ещё не решена.
Других решений пока нет …