Qt中利用TCP实现多个客户端之间相互发送消息系以及服务器的群发信息

Qt中利用TCP实现多个客户端之间相互发送消息系以及服务器的群发信息

标签: QTtcp服务器socket
2141人阅读 评论(1) 收藏 举报
本文章已收录于:

前两天写了个简单的服务器和客户端之间的数据传送,主要是为了熟悉一下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

1
0
 
 
  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值