2013-11-21 110 views
0

我正在尝试使用Qt编写一个聊天程序。它已经完成了一半,但有一些问题。在C++/Qt中的UDP服务器 - 客户端聊天

首先,当我想以lineedit方式将写入的消息发送到客户端时,我得到一个错误。这是一个QString,但writeDatagram只发送一个QByteArray。我GOOGLE了它,并有一些方法将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不能明确地表示字节序列,它表示一系列名义字符(又名QChars)。因此,为了将该QString放入一个字节数组中,您必须决定将其编码为哪个二进制表示。例如,如果你想用UTF8编码来编码字符串(我会推荐),你可以使用QString的toUtf8()方法来获取表示UTF8编码的QByteArray,并且接收者将使用来自Utf8()方法的QString接收到的字节回到QString中。还有其他编码(ascii,latin1,local8Bit),但它们可能无法像UTF8那样处理国际化。至于你的第二个问题(“我无法持续发送和接收消息”),你将不得不对发生的事情和预期发生的事情做更明确和描述性的描述。我不知道在这方面“持续”意味着什么。

+0

@Jermer Friesner对不起,回复晚了。 感谢你解决了我的第一个问题。现在我没有得到任何错误。但服务器和客户端根本不通信。只有“Hello!from client”出现在服务器聊天室上,仅此而已。 UDP数据包不会发送,我不知道为什么。一切似乎与我同在。 – Arwen

+0

@Jeremey Friesner再次感谢你。我不知道我是如何错过它的。解决问题后,我的代码现在工作正常。 – Arwen