前两天写了个简单的服务器和客户端之间的数据传送,主要是为了熟悉一下QTcpsocket和QTcpserver的用法,然后今天在此基础上实现多个客户端之间的相互通信以及利用服务器可以群发信息。(只是供大家参考,勿喷)
代码运行如图
思路如下:首先每个客户端与服务器相连是会有一个对应的Tcpsocket,把这些sockt全部放入一个list容器中,当客户端有数据发送时,读取是哪个socket中的消息,读取完后,再把消息发送到list中的所有socket中,在客户端判断这个消息是不是发送给自己的,如果是,则接受,否则不接受(在读到是哪个socket中有数据时,也可直接写入到这个socket中),要注意的是对数据进行打包和解包。对数据进行分析,我这个只是一个简单的参考。
创建一个存放socket的list容器:
socket_list= newQList<QTcpSocket*>;
把客户端的socket放入list容器中:
m_tcpsocket = m_tcpserver->nextPendingConnection();
socket_list->append(m_tcpsocket);
connect(m_tcpsocket,SIGNAL(readyRead()),
this,SLOT(readMessage()));
服务器读取客户端的消息并发送出去:
for(int i = 0;i < socket_list->length();i ++)
{
qDebug() << "QDataStream " ;
QDataStream in(socket_list->at(i));
in.setVersion (QDataStream::Qt_5_4);
in >> message;
if(!(message.isEmpty()))
{
qDebug() << "break " ;
break;
}
}
ui->textBrowser->append(tr("reveived client message: '%1'").arg(message));
sendMessage(message);//发送消息
发送出去
void Widget::sendMessage(QString infomation)
{
QString str = infomation;
QByteArray message;
QDataStream out(&message,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_4);
out<<str;
//m_tcpsocket->write(message);
for (int i = 0;i < socket_list->length();i ++)
{
socket_list->at(i)->write(message);
}
}
客户端给服务器发送消息 打包数据:
QString string = ui->le_rec->text() + "|" + ui->le_id->text() + "|" + ui->lineEdit->text();
客户端对服务器发来的的信息进行分析:
QDataStream in(m_tcpsocket);
in.setVersion(QDataStream::Qt_5_4);
QString greeting;
in >> greeting;
QStringList info = greeting.split("|");
qDebug() << "info[0]" << info[0];
qDebug() << "info[1]" << info[1];
qDebug() << "info[2]" << info[2];
if(ui->le_id->text() == info[0])
{
ui->textBrowser->append(tr("'%1'对你说: '%2'").arg(info[1]).arg(info[2]));
}
if(info[0] == "group")//服务器群发消息
{
ui->textBrowser->append(tr("server 说 : '%1'").arg(info[1]));
}
info.clear();//这句话必须有,不然会出现客户端崩溃的情况,超出范围
完整代码下载地址: http://download.csdn.net/download/qq_33425353/9575879