gpt4 book ai didi

c++ - C++/Qt 中的 UDP 服务器-客户端聊天

转载 作者:行者123 更新时间:2023-11-30 04:11:44 24 4
gpt4 key购买 nike

我正在尝试使用 Qt 编写聊天程序。它已完成一半,但存在一些问题。

首先,当我想在 lineedit 中将我的书面消息发送给客户端时出现错误。它是一个QString,但是writeDatagram 只发送一个QByteArray。我用谷歌搜索了一下,有一些方法可以将 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());

}

}

最佳答案

将 QString 转换为 QByteArray 确实是要做的事情。原因是 UDP 数据包只携带一系列字节——但 QString 并没有明确地表示一个字节序列,它表示一个概念字符序列(又名 QChars)。因此,为了将该 QString 放入字节数组中,您必须决定要将其编码为哪种二进制表示形式。例如,如果你想使用 UTF8 编码(我会推荐)对字符串进行编码,你将使用 QString 的 toUtf8() 方法来获取表示 UTF8 编码的 QByteArray,并且接收方将使用 QString 的 fromUtf8() 方法来转换接收到的字节返回到 QString 中。还有其他编码(ascii、latin1、local8Bit),但它们可能无法像 UTF8 那样处理国际化。

至于你的第二个问题(“我无法连续发送和接收消息”),你将不得不更明确和描述发生的事情与你期望发生的事情。我不知道“持续”在这种情况下是什么意思。

关于c++ - C++/Qt 中的 UDP 服务器-客户端聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20125641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com