Я пытаюсь написать чат-программу с помощью Qt. Это половина завершена, но у нее есть некоторые проблемы.UDP-клиент-клиент в C++/Qt
Прежде всего, я получаю сообщение об ошибке, когда хочу отправить свое письменное сообщение в lineedit клиенту. Это QString
, но writeDatagram
отправляет только QByteArray
. Я googled это и есть некоторые способы для преобразования QString
в QByteArray
, но я ищу лучшее решение. Думаю, что я должен использовать connectToHost()
, но read()
и write()
не работают.
Вторая и главная проблема заключается в том, что я не могу непрерывно отправлять и получать сообщения! Очевидно, этого еще не произошло, но я знаю, что с ним что-то не так, потому что я тестировал его на Qt-консоли, и он тоже не работал.
Я новичок в программировании GUI и Socket, поэтому я много искал, прежде чем публиковать эту тему.
Обновление: Моя первая проблема решена, но теперь UDP-пакеты не получают отправки и получения, не говоря уже о работе как приложение чата.
Обновление: Я выяснил, в чем была проблема, и я решил это. Код нуждается в двух объектах QUdpSocket
. Я также обновил код. Теперь он полностью функциональный. Если у вас есть другие материалы, я бы хотел их послушать, иначе у меня есть мой ответ.
Сервер:
#include "schat.h"
#include "ui_schat.h"
schat::schat(QWidget *parent) :
QWidget(parent),
ui(new Ui::schat)
{
ui->setupUi(this);
socketServerc=new QUdpSocket(this);
socketServer=new QUdpSocket(this);
socketServer->bind(QHostAddress::LocalHost, 8001);
connect(socketServer,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));
}
schat::~schat()
{
delete ui;
}
void schat::on_sendButton_clicked()
{
QString word=ui->lineEdit->text();
ui->textBrowser->append(word);
QByteArray buffer;
buffer=word.toUtf8();
QHostAddress sender;
quint16 senderPort;
socketServerc->writeDatagram(buffer.data(), QHostAddress::LocalHost, 7000);
}
void schat::readPendingDatagrams()
{
while (socketServer->hasPendingDatagrams()) {
QByteArray buffer;
buffer.resize(socketServer->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socketServer->readDatagram(buffer.data(), buffer.size(),&sender, &senderPort);
ui->textBrowser->append(buffer.data());
}
}
Клиент:
#include "uchat.h"
#include "ui_uchat.h"
uchat::uchat(QWidget *parent) :
QWidget(parent),
ui(new Ui::uchat)
{
ui->setupUi(this);
clientSocket=new QUdpSocket(this);
clientSocketc=new QUdpSocket(this);
clientSocketc->bind(QHostAddress::LocalHost, 7000);
connect(clientSocketc,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));
}
uchat::~uchat()
{
delete ui;
}
void uchat::on_sendButton_clicked()
{
QString word=ui->lineEdit->text();
ui->textBrowser->append(word);
QByteArray buffer;
buffer.resize(clientSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
buffer=word.toUtf8();
clientSocket->writeDatagram(buffer.data(), QHostAddress::LocalHost, 8001);
}
void uchat::readPendingDatagrams()
{
while (clientSocketc->hasPendingDatagrams()) {
QByteArray buffer;
buffer.resize(clientSocketc->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
clientSocketc->readDatagram(buffer.data(), buffer.size(),&sender, &senderPort);
ui->textBrowser->append(buffer.data());
}
}
@Jermer Friesner Извините за поздний ответ. Спасибо, моя первая проблема решена. Теперь у меня нет ошибок. но сервер и клиент просто не общаются. Просто «Hello! From client» появляется на сервере chatbox и ничего больше. UDP-пакеты не получают отправки, и я не знаю, почему. со мной все в порядке. – Arwen
@Jeremey Friesner Еще раз спасибо. Я не знаю, как я пропустил это в первую очередь. после исправления проблемы теперь мой код работает нормально. – Arwen