Beispiel #1
0
void ThreadNet::udpProcessUsrLeft(QString *usrKey)
{
  if(usrKey == GlobalData::settings_struct.profile_key_str)
    {
      emit usrLeft(usrKey);

      qDebug()<<"@ThreadNet::udpProcessUsrLeft(): Myself left.";
    }

  qDebug()<<"@ThreadNet::udpProcessUsrLeft(): Someone left.";
  emit usrLeft(usrKey);
}
void Widget::processPendingDatagrams()
{
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size());
        QDataStream in(&datagram, QIODevice::ReadOnly);
        int msgType;
        in >> msgType;
        QString usrName,ipAddr,msg;
        QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");

        switch(msgType)
        {
        case Msg:
            in >> usrName >> ipAddr >> msg;
            ui->msgBrowser->setTextColor(Qt::blue);
            ui->msgBrowser->setCurrentFont(QFont("Times New Roman",12));
            ui->msgBrowser->append("[ " +usrName+" ] "+ time);
            ui->msgBrowser->append(msg);
            break;

        case UsrEnter:
            in >>usrName >>ipAddr;
            usrEnter(usrName,ipAddr);
            break;

        case UsrLeft:
            in >>usrName;
            usrLeft(usrName,time);
            break;

        case FileName: {
            in >> usrName >> ipAddr;
            QString clntAddr, fileName;
            in >> clntAddr >> fileName;
            hasPendingFile(usrName, ipAddr, clntAddr, fileName);
            break;
        }

        case Refuse: {
            in >> usrName;
            QString srvAddr;
            in >> srvAddr;
            QString ipAddr = getIP();

            if(ipAddr == srvAddr)
            {
                srv->refused();
            }
            break;
        }
        }
    }
}
Beispiel #3
0
//用于接受UDP广播发送来的消息
void Widget::processPendingDatagrams()
{
    //接受函数首先调用QUdpSocket类的成员函数hasPendingDatagrams()
    //以判断是否有可供读取的数据
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        /* 如果有可供读取的数据,则通过pendingDatagrams()函数获取当前可供读取的
         * UDP报文大小,并据此大小分配接受缓冲区datagram,最后使用QUdpSocket类的
         * 成员函数readDatagram()读取相应数据
         */
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size());
        QDataStream in(&datagram, QIODevice::ReadOnly);
        int msgType;
        //首先获取信息类型,然后对不同信息类型进行不同的操作
        in >> msgType;
        QString usrName, ipAddr, msg;
        QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
        switch(msgType)
        {
        case Msg:
            /* 如果是普通的聊天消息Msg,那么久获取其中的用户名、IP地址和内容信息等数据,
             * 然后将用户名和聊天内容显示在界面左上角的信息浏览器msgBrowser中,在显示
             * 聊天信息的同时还显示系统当前日期时间,系统当前日期时间利用
             * QDateTime::currentDateTime()
             * 获取
             */
            in >> usrName >> ipAddr >> msg;
            ui->msgBrowser->setTextColor(Qt::blue);
            ui->msgBrowser->setCurrentFont(QFont("Times New Roman", 12));
            ui->msgBrowser->append("[" + usrName + "]" + time);
            ui->msgBrowser->append(msg);
            break;
        case UsrEnter:
            /* 如果是新用户加入UsrEnter,那么久获取其中的用户名和IP地址信息,
             * 然后使用usrEnter()函数进行新用户登录的处理
             */
            in >> usrName >>ipAddr;
            usrEnter(usrName, ipAddr);
            break;
        case UsrLeft:
            /* 如果是用户退出UsrLeft,那么获取其中的用户名,然后使用usrLeft()函数
             * 进行用户离开的处理
             */
            in >> usrName;
            usrLeft(usrName, time);
            break;
        case FileName:
        {
            in >> usrName >> ipAddr;
            QString clntAddr, fileName;
            in >> clntAddr >> fileName;
            hasPendingFile(usrName, ipAddr, clntAddr, fileName);
            break;
        }
        case Refuse:
        {

            in >> usrName;
            QString srvAddr;
            in >> srvAddr;
            QString ipAddr = getIP();
            if(ipAddr == srvAddr)
            {
                srv->refused();
            }
            break;
        }
        }
    }
}