gpt4 book ai didi

c++ - Qt双向客户端服务器使用QTcpSocket和QTcpServer

转载 作者:可可西里 更新时间:2023-11-01 02:30:25 26 4
gpt4 key购买 nike

我正在尝试实现一个双向客户端-服务器程序,其中客户端和服务器可以在彼此之间传递序列化对象。我正在尝试使用 Qt(QTcpSocket 和 QTcpServer)来执行此操作。我已经在 java 中实现了这样的程序,但我无法弄清楚如何使用 Qt 来实现它。我已经检查了 fortune clientfortune server例子......但据我所知,客户端只是向服务器发送信号,服务器向它发送一些数据。我需要客户端和服务器来回发送对象。我不是在寻找一个完整的解决方案,我只是在寻找一些正确方向的指导。

我写了一些代码,它接受连接,但不接受数据。

服务器

这个类是服务器;它应该接受连接并输出正在发送的缓冲区的大小。但是它正在输出 0

#include "comms.h"

Comms::Comms(QString hostIP, quint16 hostPort)
{
server = new QTcpServer(this);
hostAddress.setAddress(hostIP);
this->hostPort = hostPort;


}

void Comms::attemptConnection(){
connect(server, SIGNAL(newConnection()), this, SLOT(connectionAccepted()));
//socket = server->nextPendingConnection();
server->listen(hostAddress,hostPort);
//receivedData = socket->readAll();
}

void Comms::connectionAccepted(){
qDebug()<<"Connected";
socket = new QTcpSocket(server->nextPendingConnection());

char* rec = new char[socket->readBufferSize()];
qDebug()<<socket->readBufferSize();
}

客户

这个类是客户端。它应该发送字符串“hello”。它发送成功(据我所知)

#include "toplevelcomms.h"
#include "stdio.h"

TopLevelComms::TopLevelComms(QString hostIP, quint16 hostPort)
{
tcpSocket = new QTcpSocket();
hostAddress.setAddress(hostIP);
this->hostPort = hostPort;
}


void TopLevelComms::connect(){
tcpSocket->connectToHost(hostAddress,hostPort,QIODevice::ReadWrite);
//tcpSocket->waitForConnected(1);

QString string = "Hello";
QByteArray array;
array.append(string);
qDebug()<<tcpSocket->write(array);
}

请告诉我我做错了什么,或者告诉我在 Qt 中建立我想要的东西的一般逻辑。

最佳答案

QTcpSocket 默认是异步的,所以当你调用 connectToHost 并在相同的上下文中写入时,它不会被发送,因为套接字没有连接。你应该改变你的“客户”代码:

void TopLevelComms::connect(){
tcpSocket->connectToHost(hostAddress,hostPort,QIODevice::ReadWrite);
if(tcpSocket->waitForConnected()) // putting 1 as parameter isn't reasonable, using default 3000ms value
{
QString string = "Hello";
QByteArray array;
array.append(string);
qDebug()<<tcpSocket->write(array);
}
else
{
qDebug() << "couldn't connect";
}
}

注意:你也没有检查是否能听

void Comms::attemptConnection(){
connect(server, SIGNAL(newConnection()), this, SLOT(connectionAccepted()));
//socket = server->nextPendingConnection();

if(server->listen(hostAddress,hostPort))
{
qDebug() << "Server listening";
}
else
{
qDebug() << "Couldn't listen to port" << server->serverPort() << ":" << server->errorString();
}
//receivedData = socket->readAll();
}

最后一件事。请注意,QTcpServer::nextPendingConnection() 返回 QTcpSocket,因此您可以创建新的 QTcpSocket,并将 nextPendingConnection 作为父级

void Comms::connectionAccepted(){
qDebug()<<"Connected";
// WRONG! it will use QTcpSocket::QTcpSocket(QObject * parent)
//socket = new QTcpSocket(server->nextPendingConnection());
// use simple asign
socket = server->nextPendingConnection();
// move reading to slot
connect(socket, SIGNAL(readyRead()), this, SLOT(readSocket()));
}

现在我们将阅读移动到单独的插槽

void Comms::readSocket()
{
// note that dynamic size array is incompatible with some compilers
// we will use Qt data structure for that
//char* rec = new char[socket->readBufferSize()];
qDebug()<<socket->readBufferSize();
// note that QByteArray can be casted to char * and const char *
QByteArray data = socket->readAll();
}

我必须承认,这么小的代码示例有很多错误。您需要了解一些有关 TCP/IP 连接的知识。这些是流,不能保证整个数据 block 会立即到达您手中

关于c++ - Qt双向客户端服务器使用QTcpSocket和QTcpServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8917461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com