【问题标题】:How to read complete data using QTcpSocket (Qt4.7)如何使用QTcpSocket(Qt4.7)读取完整数据
【发布时间】:2020-01-28 17:22:48
【问题描述】:

我创建了一个 TcpServer 来接收来自客户端的数据。客户发送了很多消息,我想阅读它们。到目前为止,我的 TcpServer.cpp 看起来像这样:



void TcpServer::serverStart()
{
    server = new QTcpServer(this);
    if (!server->listen(QHostAddress("192.168.x.x"), 48583))
    {
        qDebug() << "Not listening";
        server->close();
        delete server;
        return;
    }
    else {
        qDebug() << "Listening";
    }

connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));


}



void TcpServer::newConnection()
{

    socket = server->nextPendingConnection();
    qDebug() << "Client connected";

    connect(socket, SIGNAL(readyRead()), this, SLOT(getData()));
    connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
}


void TcpServer::getData()
{

QByteArray buffer;

while (socket->bytesAvailable())
    {
        buffer.append(socket->readAll());
       }
qDebug() << buffer;
    }




void TcpServer::serverStop()
{
    server->close();
    delete server;
}

我知道我的 getData 函数需要更多才能接收所有内容,但我不明白执行此操作所需的步骤。如果有人能给我一些指点,我将不胜感激!

【问题讨论】:

  • 你在tcp上面用什么,你的应用层协议是什么?
  • 还有 Tcp !我有 2 个应用程序 App1 和 App2 通过 Tcp 相互发送消息,我尝试在两个应用程序之间创建一个工具,该工具将读取来自 App1 的消息,对其进行一些处理,然后将其发送到 App2。
  • 那条评论回答“你的应用层协议是什么?”。您必须在 TCP 之上做一些事情,例如根据某种格式/规范交换一些结构化消息。 是@ezegoing 所问的。 TCP 只是传输协议,您的应用程序必须在“按发送顺序到达的字节”(这是 TCP 为您提供的所有内容)之上期待其他内容。
  • 哦,对不起,我是编程初学者,我没有很多关于消息的信息,但它们被构造为标题并包含字节,我尝试只阅读标题。不知道这能不能回答你的问题?
  • 是的,我现在知道了,但这是我正在为我的实习工作的项目:/ 我将努力提高我的编程知识和技能,当我知道我在说什么时会回来找你,还是谢谢!

标签: c++ qt tcpserver qt4.7


【解决方案1】:

TCP 是一种面向流的传输协议。把它想象成一个连续的数据流。 TCP 还没有定义消息,因为它又是一个连续的数据流。

我从您的评论中得知您没有使用任何应用层协议。您需要一个应用层协议,例如http,然后定义“消息”并为您提供有关如何阅读完整消息的进一步说明。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多