Qt. QUDPSocket. Реализия клиент-серверной модели

529
04 февраля 2017, 09:22

Написал два класса (по сути одинаковых, за исключением что класс UDPClient, имеет строку client->bind(2424);). Как реализовать обмен сообщениями между сервером и клиентом? Сообщения от сервера до клиента отправляет, а вот наооборот - нет.

Реализация класса UDPServer:

#include "udpserver.h"
UDPServer::UDPServer(QWidget *parent) : QDialog(parent)
{
    server = new QUdpSocket(this);
    connect(server, SIGNAL(readyRead()), this, SLOT(ProcessData()));
    text = new QTextEdit;
    text->setReadOnly(true);
    line = new QLineEdit;
    QPushButton *btn = new QPushButton("Send");
    connect(btn, SIGNAL(clicked(bool)), this, SLOT(SendDatagram()));
    QVBoxLayout *lay = new QVBoxLayout;
    lay->addWidget(text);
    lay->addWidget(line);
    lay->addWidget(btn);
    this->setLayout(lay);
    this->setWindowTitle("Server");
}
UDPServer::~UDPServer()
{
}
void UDPServer::SendDatagram()
{
    QByteArray datagram;
    QDataStream out(&datagram, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_7);
    text->append("Sent: " + line->text());
    out << line->text();
    server->writeDatagram(datagram, QHostAddress::LocalHost, 2424);
    line->clear();
}
void UDPServer::ProcessData()
{
    QByteArray datagram;
    do
        {
            datagram.resize(server->pendingDatagramSize());
            server->readDatagram(datagram.data(), datagram.size());
        } while(server->hasPendingDatagrams());
    QString message;
    QDataStream in(&datagram, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_5_7);
    in >> message;
    text->append("Received: " + message);
}

Реализация класса UDPClient:

#include "udpclient.h"
UDPClient::UDPClient(QWidget *parent) : QDialog(parent)
{
    client = new QUdpSocket(this);
    client->bind(2424);
    connect(client, SIGNAL(readyRead()), this, SLOT(ProcessData()));
    text = new QTextEdit;
    text->setReadOnly(true);
    line = new QLineEdit;
    QPushButton *btn = new QPushButton("Send");
    connect(btn, SIGNAL(clicked(bool)), this, SLOT(SendDatagram()));
    QVBoxLayout *lay = new QVBoxLayout;
    lay->addWidget(text);
    lay->addWidget(line);
    lay->addWidget(btn);
    this->setLayout(lay);
    this->setWindowTitle("Client");
}
UDPClient::~UDPClient()
{
}
void UDPClient::ProcessData()
{
    QByteArray datagram;
    do
      {
            datagram.resize(client->pendingDatagramSize());
            client->readDatagram(datagram.data(), datagram.size());
      } while(client->hasPendingDatagrams());
    QString message;
    QDataStream in(&datagram, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_5_7);
    in >> message;
    text->append("Received: " + message);
}
void UDPClient::SendDatagram()
{
    QByteArray datagram;
    QDataStream out(&datagram, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_7);
    text->append("Sent: " + line->text());
    out << line->text();
    client->writeDatagram(datagram, QHostAddress::LocalHost, 2424);
    line->clear();
}
READ ALSO
Обработка строки даты

Обработка строки даты

Пользователь вводит дату в формате 01/02/17, нужно сохранить дату в трёх переменных int соответственно-day,month,yearЯ разбивал строку с датой на 3 подстроки...

417
Динамическое выделение памяти с++

Динамическое выделение памяти с++

Вопрос заключается в необходимости оператора newОн предназначается для динамического выделения памяти, то есть во время выполнения программы,...

457
Ошибка преобразования char в int

Ошибка преобразования char в int

Имеется следующий код:

400
распознавание четырехугольников в OpenCV

распознавание четырехугольников в OpenCV

Работаю над распознаванием фигур в OpenCVЧтобы найти четырехугольник, смотрю на количество вершин:

542