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; } } } }
//用于接受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; } } } }