UDP Client-Serveur de Chat en C++/Qt
Je suis en train d'écrire un programme de chat à l'aide de Qt. Il est à moitié rempli, mais il a quelques problèmes.
Tout d'abord j'ai une erreur quand je veux envoyer mon message écrit dans lineedit pour le client. C'est un QString
, mais le writeDatagram
envoie seulement un QByteArray
. J'ai googlé et il existe quelques moyens pour la conversion de QString
à QByteArray
, mais je suis à la recherche d'une meilleure solution.
Je pense que je devrais utiliser connectToHost()
, mais read()
et write()
ne fonctionnent pas.
Deuxième et principal problème est que je n'arrive pas à envoyer et recevoir des messages en continu! Évidemment, ce n'est pas encore arrivé, mais je sais qu'il ya quelque chose de mal avec elle parce que je l'ai testé sur Qt de la console et il n'a pas de travail là-bas aussi.
Je suis nouveau à l'interface graphique et la programmation Socket, donc j'ai beaucoup cherché avant que je poste ce sujet.
Mise à jour: Mon premier problème résolu, mais maintenant les paquets UDP n'obtenez pas d'envoyer et de recevoir encore moins de travail, comme une application de chat.
Mise à jour: j'ai trouvé quel était le problème et je l'ai résolu. Le code a besoin de deux QUdpSocket
Objets. J'ai aussi mis à jour le code. C'est maintenant pleinement fonctionnel.
Si vous avez d'autres intrants, j'aimerais les écouter, sinon j'ai eu ma réponse.
Serveur:
#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());
}
}
Client:
#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());
}
}
Vous devez vous connecter pour publier un commentaire.
La conversion de la QString à un QByteArray est en effet la chose à faire. La raison en est que les paquets UDP de transporter seulement une série d'octets -- mais un QString ne pas représenter sans ambiguïté une séquence d'octets, il représente une séquence de notionnel de caractères (un.k.un. QChars). Alors, pour la place que QString dans un tableau d'octets, vous devez décider lequel représentation binaire que vous souhaitez encoder comme. Par exemple, si vous voulez encoder la chaîne à l'aide de l'encodage UTF8 (que je recommande), vous pouvez utiliser QString du toUtf8() méthode pour obtenir le QByteArray représentant le codage UTF8, et le destinataire peut utiliser QString du fromUtf8() méthode pour transformer les octets reçus de retour dans un QString. Il y a d'autres encodages aussi (ascii, latin1, local8Bit), mais ils ne peuvent pas gérer l'internationalisation ainsi que de l'utf-8 ne.
Comme pour votre deuxième problème ("je n'arrive pas à envoyer et recevoir des messages en continu"), vous allez avoir à être plus explicite et descriptif à propos de ce qui se passe vs ce que vous vous attendiez. Je ne sais pas ce que "en continu" signifie dans ce contexte.