安卓客户端的QTcpServer无法打印或使用从客户端接收的数据



我正在使用Qt框架在C++中开发客户端服务器应用程序,但客户端可以是android手机和计算机(Qt客户端应用程序)现在我在处理服务器端的数据接收时遇到了麻烦;服务器没有正确接收数据。

首先,我使用以下发送和接收方法在服务器(Qt应用程序)和客户端(Qt程序)之间很好地工作:消息的大小保持在数据包的开头,以帮助检查是否接收到整个消息。

这是向客户端发送消息的方法

void Server::send(const QString &message)
{
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    out << (quint16) 0; // just put 0 at the head of the paquet to reserve place to put the size of the message
    out << message; // adding the message
    out.device()->seek(0); // coming back to the head of the paquet
    out << (quint16) (paquet.size() - sizeof(quint16)); // replace the 0 value by the real size

    clientSocket->write(paquet); //sending...
}

每当收到一块镶木地板时,就会调用此插槽。

void Server::dataReceived()
{
    forever 
    {
        // 1 : a packet has arrived from any client
        // getting the socket of that client (recherche du QTcpSocket du client)
        QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
        if (socket == 0) 
            return; 
        QDataStream in(socket);
        if (dataSize == 0) // if we don't know the size of data we are suppose to receive...
        {
            if (socket->bytesAvailable() < (int)sizeof(quint16)) // we haven't yet receive the size of the data completly then return...
                 return;
            in >> dataSize; // now we know the amount of data we should get
        }
        if (socket->bytesAvailable() < dataSize) 
            return;
        // Here we are sure we got the whole data then we can startreadind
        QString message;
        in >> message;
        //Processing....
        dataSize = 0; // re-initialize for the coming data
    }
}

当服务器与Qt应用程序客户端对话时,这很好地工作,因为那里使用了相同的方法,并且quint16的大小将保持相同的悬停-它不适用于android客户端,然后我尝试了另一种方法,我想忽略发送的消息的大小,但格式化消息的方式使我可以知道它从哪里开始,从哪里结束,然后通过一些控件,我可以获得它,但我被困在这里,因为打印时读取的数据不包含任何内容,但他的大小有一个值(甚至根据客户端发送的文本量而变化)!

void Server::dataReceived() // a packet is received!
{
    QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
    if (socket == 0)
        return;

    QByteArray data= socket->readAll(); //reading all data available
    QString message(data)
    qDebug() << data;        // this prints nothing!
    qDebug() << data.size();//  But this prints a non null number, wich means we got something, and that number varies according to the amount of text sent!
    qDebug() << message;    // this also prints notghing!
} 

附言:它甚至不适用于Qt应用客户端。

你能帮我找出问题所在吗?我有点困惑tcp协议是如何处理数据的,如果你能的话,也建议我一个好的方法。

这是我为制作的安卓类

class QTcpSocket implements Runnable {
    private String ip="";
    private int port;
    private Socket socket;
    private PrintWriter printWriter;
    private DataOutputStream dataOutputStream;
    private DataInputStream dataInputStream;
    public QTcpSocket(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }
      public void setIp(String ip) {
          this.ip = ip;
      }
      public String getIp() {
          return this.ip;
      }
    public void setPort(int port) {
        this.port = port;
    }
    public void run() {
        try {
            socket = new Socket(this.ip, this.port);
            dataOutputStream = new DataOutputStream( socket.getOutputStream() );
            dataInputStream = new DataInputStream(socket.getInputStream());
            String response = dataInputStream.readUTF();
            dataOutputStream.writeUTF("Hello server!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void sendMessage(String message) {
        try {
            dataOutputStream.writeUTF(message);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void disconnect() {
        try {
            printWriter.flush();
            printWriter.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public boolean isClosed() {
        return socket.isClosed();
    }
}

将'data'中所有值为0的字节替换为值20,然后再次打印。我想您没有看到任何打印内容,因为第一个字节是0。您也可以替换为"X"。您是否已经用write()替换了writeUTF()?

20是空格字符。但你也看不到任何打印,所以最好使用X字符。字符串将被打印,直到符合\0字符(表示字符串的末尾)为止。因为什么都没印,我一开始就以为是对的。所以writeUTF导致前导0。我只能解释,如果所有字符都加倍。你发送的第一个字符是什么?

但现在:先发送消息大小,使其等于您的qt客户端。

最新更新