繁体   English   中英

使用Qt管理流客户端服务器

[英]Manage stream client server with Qt

我想知道客户端-服务器如何管理流。 例如,当我打反击时,它们是从客户端到服务器以及从服务器到客户端发送的大量数据包。 什么是管理流的最佳方法?

我认为 :

服务器发送数据到客户端

 void Server::send(const QString &message)
    {
        QByteArray paquet;
        QDataStream out(&paquet, QIODevice::WriteOnly);

        out << (quint16) 0; //packet size
        out << (quint8)14; //packet type to execute a special action on the client
        out << message; // data, here string but can be another class
        out.device()->seek(0); 
        out << (quint16) (paquet.size() - sizeof(quint16)); //write packet size
        socket->write(paquet);        
    }

客户端从服务器接收数据

void Client::receiveData()
{
    QDataStream in(socket);

    if (size_packet == 0) // size_packet, initilize to 0
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16))
             return;

        in >> tailleMessage;
    }    
    if (socket->bytesAvailable() < tailleMessage)
        return;

    //now I can get data
    quint8 typeObject;
    in >> typeObject;



    switch(typeObject){
        case 1:
            ...
        break;

        case 2:
            ...
        break;

        case 3:
            ...
        break;

            ...
            ...

        case 14:
            QString data; //can be another custom class
            in >> data;
            write(data);
        break;

        //my solution, the server can execute an action on the client depending type packet
    }

    size_packet= 0;
}

我想我必须在客户端和服务器之间使用共享库并序列化我的自定义类。

但是我应该另外做吗? 使用json或xml或协议缓冲区(google)或其他方式?

如@MrEricSir所述,游戏通常使用UDP协议。 它使用数据报,而不是流。 因此,某些数据报在数据传输过程中可能会丢失。 您的协议应处理丢失的数据。 这样的协议通常是二进制的,由于开销,它们不使用xml,json或protobuf。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM