在C++/Qt中的UDP服务器客户端聊天
UDP Server-Client Chat in C++/Qt
我正在尝试使用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());
}
}
将QString转换为QByteArray确实是一件需要做的事情。原因是UDP数据包只携带一系列字节,但QString并不明确地表示字节序列,它表示一系列概念字符(也称为QChars)。因此,为了将QString放入一个字节数组中,你必须决定要将其编码为哪种二进制表示。例如,如果你想使用UTF8编码对字符串进行编码(我建议使用),你可以使用QString的toUtf8()方法来获得表示UTF8编码的QByteArray,并且接收器将使用QString的fromUtf8()方法将接收到的字节转换回QString。还有其他编码(ascii、latin1、local8Bit),但它们可能无法像UTF8那样处理国际化。
至于你的第二个问题("我无法连续发送和接收消息"),你必须更明确地描述发生了什么,而不是你预期会发生什么。我不知道"持续"在这种情况下意味着什么。
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- ZMQ - 客户端服务器:客户端意外关闭,服务器如何检测到?
- C++服务器/客户端聊天程序
- Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
- 服务器客户端通过原始数据错误C 发送接收结构
- TCP 服务器/客户端:客户端 recv() 返回空白缓冲区
- 在使用 Poll() 的 TCP 服务器 - 客户端连接中,我是否需要手动设置事件?我从来没有到达 POLLOUT 来写
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- 嗅探 QWebsocket 服务器 - 客户端通信
- C++(不是 C)中的示例服务器/客户端代码
- 如何将ZeroMQ用于多个服务器-客户端对
- 语言之间的服务器客户端首选项
- 服务器客户端程序上的QT-QFileSystemModel
- SFML网络服务器/客户端
- 服务器/客户端TCP异步(winsock)//FD_WRITE问题
- 基本服务器/客户端代码出现问题
- 将我的简单winsock服务器/客户端应用程序变形为简单的Web服务器
- C++ Winsock 服务器-客户端远程连接
- 修复:C++服务器/客户端程序:"Connection refused"