c++ - 如何通过 QSslSocket 分别发送两个字节?

标签 c++ qt ssl qtnetwork

我有一个客户端程序和一个服务器程序,它们使用 QSslSockets 进行通信。在服务器程序中,如果客户端成功连接,我将发送一个字符串 "Snameadded",我还想向它发送服务器上的用户列表,但作为不同的消息,我制作了两个不同的 block 并分别写入它们,但它们被客户端作为一个读取

这是服务器上的代码:

void server::processMess(QString message)
{

    //Message type legend
    // [number]*** [name]*** [message]
    // number = 1, joining server for first time, rest is name
    // number = 2, split by "***", retrive name, receiving name, and rest is message
    // number = 3, disconnecting from server, resy is name


    bool successfullyConnected = false;
    QStringList temp = message.split("***");
    int num = temp.at(0).toInt();

    qDebug() << num;
    qDebug() << "size of socket list:" << myClientSockets.size();
    QString name = temp.at(1);
    if(num == 1)
    {
        QString name = temp.at(1);
        if(clientList.contains(name))
        {
            QByteArray block;
            block.append("Enameinvalid");

            QSslSocket *clientConnection = myClientSockets.at(myClientSockets.size() - 1);
            myClientSockets.pop_back();
            clientConnection->write(block);
            \

        }
        else
        {
            clientList.append(name);
            QByteArray block;
            block.append("Snameadded");
            successfullyConnected = true;


            QSslSocket *clientConnection = myClientSockets.at(myClientSockets.size() - 1);
            qDebug() << "Message created to send back to client: " << QString(block);
            clientConnection->write(block);

           /*
            ClientThread *thisClientThread = new ClientThread();
            thisClientThread->setClientConnection(clientConnection);
            myClientThreads.push_back(thisClientThread);
            connect(thisClientThread, SIGNAL(messageReceived(QString)), this, SLOT(processMess(QString)));
            thisClientThread->start();*/

        }
    }
    else if(num == 2)
    {
        //Direct message correctly
        QString receiver = temp.at(2);
        QSslSocket* receiverConnection = myClientSockets.at(clientList.indexOf(receiver));
        QByteArray block;
        block.append(message);
        receiverConnection->write(block);

    }
    else if(num == 3)
    {
        //Disconnect client
        updateServer(name + "disconnected");
        int position = clientList.indexOf(name);
        clientList.removeAt(position);
        myClientSockets.removeAt(position);
    }
    else
    {
        qDebug() << "Should never reach here";
    }

    if(successfullyConnected)
    {

        QByteArray block;
        block.append("UsersOnServer:");
        for(int i = 0; i < clientList.size(); ++i)
        {
            block.append(clientList.at(i));
            if(i < clientList.size() - 1)
            {
                block.append("***");
            }
        }
        for(int i = 0; i < myClientSockets.size(); ++i)
        {
            QSslSocket *receiverConnection = myClientSockets.at(i);
            receiverConnection->write(block);
        }
    }

    qDebug() << "Messaged received from client: " + message;
    updateServer("Messaged received from client: " + message);


    /*QSslSocket* thisConnection = myClientSockets.pop_back();

    QByteArray incoming = thisConnection->readAll();

    QString message = QString(incoming);

    qDebug() << "Message received from client: " + message;

    return;*/

    /*QByteArray in = tempSocket->readAll();

    QString message = QString(in);

    qDebug() << "Messaged received from client: " + message;
    updateServer(message);
*/


}

这是我客户端的代码: secureSocket->write(block);

if(secureSocket->waitForReadyRead(1000))
{
    QByteArray in = secureSocket->readAll();

    QString serverMess = QString(in);
    if(QString::compare(serverMess, "Snameadded", Qt::CaseSensitive) == 0)
    {
        returnVal = true;
        qDebug() << "added to server";
        connect(secureSocket, SIGNAL(readyRead()), this, SLOT(receiveMess()));
    }
    else if(QString::compare(serverMess, "Enameinvalid", Qt::CaseSensitive) == 0)
    {
        returnVal = false;
        qDebug() << "username already taken";
    }
    qDebug() << "*************Message from server:************** 1" << serverMess;
}

最佳答案

我修复了它,我只是做了 QSslSocket::waitForBytesWritten() 所以它会发送第一个字节数组,然后分别发送第二个字节数组。

关于c++ - 如何通过 QSslSocket 分别发送两个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792833/

相关文章:

qt - mvc 中的自定义排序(QSortFilterProxyModel)只工作一次

c++ - 将 QMenu::addAction 直接连接到 lambda(函数签名不匹配)

ssl - 连接到 HSM 启动错误 48

c++ - 函数模板参数推导模板参数vs默认模板参数vs返回类型

c++ - 为什么只能在头文件中实现模板?

c++ - 使用 pthreads 重新排列数据包

Spring RestTemplate 交换帖子不适用于 SSL 抛出 SunCertPathBuilderException

c++ - C++ 中的 typeid(var_name).name() 函数返回什么?

c++ - 测试从 qt4 迁移到 qt5 的库时出现段错误

python - 运行Web2py后如何添加SSL证书 'one step production deployment'