我是Qt的新手并决定创建聊天程序。每次有人连接时,从服务器端向每个客户端发送字符串add=name
以通知新客户端已连接,并且向此连接的客户端发送syn=N
这意味着不是N而是每个客户端在此客户端连接之前连接的名称。这是我的代码:
void MainWindow::add_or_delete_from_listview(QString name, User *user, bool ad)
{
if(ad)
{
sync(user);
name = set_string(name);
user_buffer << user;
list << name;
ui->plainTextEdit->appendPlainText("Name: "+name+" ip:"+user->get_socket()->peerAddress().toString()+" got connected");
model->setStringList(list);
send_to_all("add="+name);
}
else
{
name = set_string(name);
user_buffer.removeOne(user);
list.removeOne(name);
ui->plainTextEdit->appendPlainText("Name: "+name+" ip:"+user->get_socket()->peerAddress().toString()+" got disconnected");
model->setStringList(list);
send_to_all("del="+name);
}
}
void MainWindow::send_to_all(QString text)
{
int i = 0;
for(; i<user_buffer.count(); i++)
{
qDebug() << user_buffer[i]->get_socket()->write(text.toLatin1());
}
}
void MainWindow::sync(User* user)
{
QString sync_me ="";
for(int i = 0; i<user_buffer.count(); i++)
{
if(user_buffer[i]->getname() == user->getname())
{
continue;
}
sync_me+="syn="+user_buffer[i]->getname();
qDebug() << user->get_socket()->write(sync_me.toLatin1());
user->get_socket()->waitForBytesWritten(-1);
sync_me.clear();
}
}
使用布尔值ad
我确定客户端是连接还是断开连接,所以我的问题是,说客户端与名称A连接并且已经在与名称B和C聊天,有时(并非总是)客户端A分别获取字符串syn=Bsyn=C
而不是syn=B
和syn=C
,这意味着我正在使用函数waitForBytesWritten
做错事。我希望你能提供帮助。抱歉,如果我的问题很愚蠢。感谢。
P.S 从客户端我正在使用
QString text = sock->readAll().simplified();
qDebug() << text;
if(text.startsWith("msg="))
{
emit action_happened("msg=", text);
}
if(text.startsWith("add="))
{
emit action_happened("add=", text);
}
if(text.startsWith("syn="))
{
emit action_happened("syn=", text);
}
if(text.startsWith("del="))
{
emit action_happened("del=", text);
}
并且在输入的开头我决定如何处理它