2

Qtを使ってチャットプログラムを書こうとしています。半分は完成していますが、いくつか問題があります。

まず、lineedit で書いたメッセージをクライアントに送信しようとすると、エラーが発生します。ですQStringが、writeDatagramのみが を送信しQByteArrayます。QStringに変換する方法はいくつかありますがQByteArray、より良い解決策を探しています。を使用する必要があると思いますconnectToHost()read()write()機能しません。

2 つ目の主な問題は、メッセージを継続的に送受信できないことです。明らかに、これはまだ発生していませんが、Qt コンソールでテストしたところ、そこでも機能しなかったため、何か問題があることはわかっています。

私は GUI とソケット プログラミングに慣れていないので、このトピックを投稿する前にたくさん検索しました。

更新: 最初の問題は解決しましたが、チャット アプリケーションのように動作するどころか、UDP パケットが送受信されなくなりました。

更新: 何が問題なのかがわかり、解決しました。コードには 2 つの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());

    }

}
4

1 に答える 1