2013-11-21 5 views
0

Я пытаюсь написать чат-программу с помощью 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()); 

    } 

} 

ответ

2

Преобразование QString к QByteArray, действительно, что нужно сделать. Причина в том, что UDP-пакеты содержат только серию байтов, но QString не однозначно представляет последовательность байтов, она представляет последовательность условных символов (a.k.a. QChars). Поэтому, чтобы поместить этот QString в массив байтов, вы должны решить, какое двоичное представление вы хотите закодировать. Например, если вы хотите кодировать строку с использованием кодировки UTF8 (которую я бы рекомендовал), вы должны использовать метод toUtf8() QString для получения QByteArray, представляющего кодировку UTF8, и получатель будет использовать метод QString fromUtf8(), чтобы включить полученные байты возвращаются в QString. Существуют и другие кодировки (ascii, latin1, local8Bit), но они не могут обрабатывать интернационализацию, а также UTF8.

Что касается второй проблемы («Я не могу непрерывно отправлять и получать сообщения»), вы должны быть более ясными и описательными в отношении того, что происходит против того, что вы ожидали. Я не знаю, что означает «непрерывно» в этом контексте.

+0

@Jermer Friesner Извините за поздний ответ. Спасибо, моя первая проблема решена. Теперь у меня нет ошибок. но сервер и клиент просто не общаются. Просто «Hello! From client» появляется на сервере chatbox и ничего больше. UDP-пакеты не получают отправки, и я не знаю, почему. со мной все в порядке. – Arwen

+0

@Jeremey Friesner Еще раз спасибо. Я не знаю, как я пропустил это в первую очередь. после исправления проблемы теперь мой код работает нормально. – Arwen

Смежные вопросы