gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:15:01 24 4
gpt4 key购买 nike

我有一个客户端程序和一个服务器程序,它们使用 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/

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