我正在尝试使用Qt编写一个聊天程序。它已经完成了一半,但有一些问题。在C++/Qt中的UDP服务器 - 客户端聊天
首先,当我想以lineedit方式将写入的消息发送到客户端时,我得到一个错误。这是一个QString
,但writeDatagram
只发送一个QByteArray
。我GOOGLE了它,并有一些方法将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”出现在服务器聊天室上,仅此而已。 UDP数据包不会发送,我不知道为什么。一切似乎与我同在。 – Arwen
@Jeremey Friesner再次感谢你。我不知道我是如何错过它的。解决问题后,我的代码现在工作正常。 – Arwen