【问题标题】:UDP Server-Client Chat in C++/QtC++/Qt 中的 UDP 服务器-客户端聊天
【发布时间】:2015-10-21 21:38:04
【问题描述】:

我正在尝试使用 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());

    }

}

【问题讨论】:

    标签: c++ qt sockets udp qudpsocket


    【解决方案1】:

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

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

    【讨论】:

    • @Jermer Friesner 抱歉回复晚了。谢谢你,我的第一个问题解决了。现在我没有收到任何错误。但是服务器和客户端根本不通信。只是“Hello!来自客户端”出现在服务器聊天框上,仅此而已。 UDP 数据包没有被发送,我不知道为什么。我觉得一切都好。
    • @Jeremey Friesner 再次感谢您。我不知道我一开始是怎么错过的。现在解决问题后,我的代码可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多