Qt 局域網(wǎng)通訊系統(tǒng)——客戶端間通信(綜合)

客戶端間通信功能預(yù)覽

聊天通信效果

信號(hào)關(guān)聯(lián)機(jī)制

整體的邏輯關(guān)系實(shí)現(xiàn)

//用戶上線顯示(包括自身和其他用戶)
connect(c,SIGNAL(getUserInfSuccess(int)),this,SLOT(displayUser(int)));

//好友密浑、黑名單亏娜、陌生人關(guān)系改變
connect(c,SIGNAL(changeRelation(ToolButton*,int,int)),this,SLOT(changeUserRelation(ToolButton*,int,int)));

//處理聊天消息    connect(c,SIGNAL(haveTalkMessage(int,QString)),this,SLOT(haveTalkMessage(int,QString)));
//用戶下線處理
connect(c,SIGNAL(userOffline(int)),this,SLOT(userOffline(int)));

//下線成功后界面處理
connect(c,SIGNAL(OfflineSuccess()),this,SLOT(OfflineSuccess()));

各部分具體實(shí)現(xiàn):

1薇溃、用戶信息顯示

新用戶上線后章喉,顯示他的信息

void ChatDlg::displayUser(int userid)
{

    //為新用戶創(chuàng)建toolbutton和聊天室
    Client* c = Common::getClientInstance();
    RelationUser* user= c->getUserInfById(userid);
    ToolButton* toolBtn = new ToolButton(userid);
    _toolButtons[userid] = toolBtn;
    ChatRoomDlg* chatRoom = new ChatRoomDlg(userid);
    _rooms[userid] = chatRoom;
    connect(toolBtn,SIGNAL(showChatRoom(int)),this,SLOT(showChatRoom(int)));

    //設(shè)置顯示信息
    QString iconPath = QString(":/Resources/registface/") + QString::number(user->face) + ".png";
    toolBtn->setIcon(QIcon(iconPath));
    toolBtn->setTextRows(QStringList() << user->display << user->sign);
    if( FRIEND == user->relation )
    {
        _layoutFriend->addWidget(toolBtn);
    }
    else if( BLACK == user->relation )
    {
        _layoutBlack->addWidget(toolBtn);
    }
    else if( STRANGER == user->relation )
    {
        _layoutStranger->addWidget(toolBtn);
    }
}

2搜锰、用戶關(guān)系改變

改變用戶之間的好友關(guān)系

void ChatDlg::changeUserRelation(ToolButton* relationUser,int oldRelation,int newRelation)
{
    Q_UNUSED(oldRelation);
    Client* c = Common::getClientInstance();
    c->getUserInfById(relationUser->getUserid())->relation = newRelation;
    if( FRIEND == newRelation )
    {
        _layoutFriend->addWidget(relationUser);
    }
    else if( BLACK == newRelation )
    {
        _layoutBlack->addWidget(relationUser);
    }
    else if( STRANGER == newRelation )
    {
        _layoutStranger->addWidget(relationUser);
    }

}
3伴郁、通信消息處理
void ChatDlg::haveTalkMessage(int userid,QString talk)
{
    _rooms[userid]->doTalkMessage( talk );
    if(activeRoom != _rooms[userid] )
    {
        //為方便用戶讀取新消息,將有消息的toolbutton設(shè)置特殊stylesheet提醒用戶
        _toolButtons[userid]->setStyleSheet("background-color: rgb(170, 255, 255);");
    }
    Client* c = Common::getClientInstance();

    //將聊天消息表示在toolbutton上
    _toolButtons[userid]->setTextRows(QStringList()<<c->getDisplay()<<c->getSign()<<talk);
}
4蛋叼、用戶下線處理

其他用用戶下線后的處理

void ChatDlg::userOffline(int userid)
{
    //取得下線用戶的layou后焊傅,刪除
    Client* c = Common::getClientInstance();
    RelationUser* userInf = c->getUserInfById(userid);
    QVBoxLayout* userLayout;
    if( FRIEND == userInf->relation )
    {
        userLayout = _layoutFriend;
    }
    else if( BLACK == userInf->relation )
    {
        userLayout = _layoutBlack;
    }
    else if( STRANGER == userInf->relation )
    {
        userLayout = _layoutStranger;
    }
    userLayout->removeWidget(_toolButtons[userid]);

    //清理結(jié)構(gòu)體
    _toolButtons[userid]->close();
    _toolButtons.remove(userid);
    _rooms[userid]->close();
    _rooms.remove(userid);
}
5、下線界面處理

用戶下線后除了關(guān)系消息處理外狈涮,界面也是需要處理的狐胎。

void ChatDlg::OfflineSuccess()
{
    //offline成功后,關(guān)閉所有窗口
    foreach(ChatRoomDlg* cr, _rooms)
    {
        cr->close();
    }
    close();
}

聊天類型消息區(qū)別

1歌馍、聊天消息格式
//表示聊天信息
void ChatRoomDlg::doTalkMessage(QString message)
{
    ui->txtbro_msg->setTextColor(Qt::blue);
    QFont font = ui->txtbro_msg->font();
    font.setPointSize(12);
    ui->txtbro_msg->setFont(font);
    QString time = QDateTime::currentDateTime().toString("hh:mm:ss");
    QString dispName = Common::getClientInstance()->getUserInfById( _userid )->display;
    ui->txtbro_msg->append(time + tr(" [") + dispName +  tr("] 對(duì)你說:"));
    ui->txtbro_msg->append(message);
}
2握巢、消息發(fā)送
//發(fā)送消息,并表示在本聊天室中
void ChatRoomDlg::on_tb_sendMsg_clicked()
{
    QString message = ui->txtEdt_msg->toHtml();
    ui->txtbro_msg->setTextColor(Qt::blue);
    QFont font = ui->txtbro_msg->font();
    font.setPointSize(12);
    ui->txtbro_msg->setFont(font);
    QString time = QDateTime::currentDateTime().toString("hh:mm:ss");
    QString dispName = Common::getClientInstance()->getUserInfById( _userid )->display;
    ui->txtbro_msg->append(time + tr("你對(duì) [") + dispName +  tr("] 說:"));
    ui->txtbro_msg->append(message);
    Client* c = Common::getClientInstance();
    c->sendChatMessage(_userid,ui->txtEdt_msg->toPlainText());
    ui->txtEdt_msg->clear();
    ui->txtEdt_msg->setFocus();
}

3骆姐、聊天消息基本格式
//發(fā)送聊天信息
void Client::sendChatMessage(int receiverUserid,QString message)
{
    QMap<QString,QString> msg;
    msg["requestKind"]= QString::number(TALK);
    msg["receiver"] = QString::number(receiverUserid);
    msg["message"]= message;

    _clientSocket->sendMessage(msg);
}

消息類型區(qū)分

//處理用戶消息
void Client::receiveMessage(QMap<QString,QString> message)
{
    int requestKind = message["requestKind"].toInt();

    //處理消息的代碼過多镜粤,才分成函數(shù)進(jìn)行調(diào)用
    if( REGISTER_SUCCESS == requestKind)
    {
        //處理注冊(cè)成功消息
        doRegisterSuccess(message);
    }
    else if(LOGIN_SUCCESS == requestKind )
    {
        //處理登陸成功消息
        doLoginSuccess(message);
    }
    else if(LOGIN_NO_ACCOUNT  == requestKind )
    {
        //處理登陸失敗消息
        doLoginNoAccount(message);
    }
    else if(GET_USER_INF_SUCCESS == requestKind)
    {
        //處理取得其他用戶成功消息
        doGetUserInfSuccess(message);
    }
    else if(USER_ONLINE == requestKind)
    {
        //處理其他用戶上線消息
        doUserOnline(message);
    }
    else if(HAVE_TALK_MESSAGE == requestKind)
    {
        //處理其他用戶發(fā)送的消息
        doHaveTalkMessage(message);
    }
    else if(USER_OFFLINE == requestKind)
    {
        //處理其他用戶下線消息
        doUserOffline(message);
    }
    else if(OFFLINE_SUCCESS == requestKind)
    {
        //處理本用戶下線成功消息
        doOfflineSuccess(message);
    }
    return ;
}

聊天基礎(chǔ)界面

聊天界面

運(yùn)行效果

客戶端通信運(yùn)行效果.gif

服務(wù)器客戶端系統(tǒng)完整源碼

下載地址:

還有 2% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
支付 ¥50.00 繼續(xù)閱讀
  • 序言:七十年代末捏题,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肉渴,更是在濱河造成了極大的恐慌公荧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同规,死亡現(xiàn)場(chǎng)離奇詭異循狰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)券勺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門绪钥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关炼,你說我怎么就攤上這事程腹。” “怎么了儒拂?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵寸潦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我社痛,道長(zhǎng)见转,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任蒜哀,我火速辦了婚禮斩箫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撵儿。我一直安慰自己乘客,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布统倒。 她就那樣靜靜地躺著寨典,像睡著了一般。 火紅的嫁衣襯著肌膚如雪房匆。 梳的紋絲不亂的頭發(fā)上耸成,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音浴鸿,去河邊找鬼井氢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岳链,可吹牛的內(nèi)容都是我干的花竞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼约急!你這毒婦竟也來了零远?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤厌蔽,失蹤者是張志新(化名)和其女友劉穎牵辣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奴饮,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纬向,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戴卜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逾条。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖投剥,靈堂內(nèi)的尸體忽然破棺而出师脂,到底是詐尸還是另有隱情,我是刑警寧澤江锨,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布危彩,位于F島的核電站,受9級(jí)特大地震影響泳桦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娩缰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一灸撰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拼坎,春花似錦浮毯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盛龄,卻和暖如春饰迹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背余舶。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工啊鸭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匿值。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓赠制,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挟憔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钟些,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,700評(píng)論 0 15
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,092評(píng)論 1 32
  • 一烟号、簡(jiǎn)歷準(zhǔn)備 1、個(gè)人技能 (1)自定義控件政恍、UI設(shè)計(jì)汪拥、常用動(dòng)畫特效 自定義控件 ①為什么要自定義控件? Andr...
    lucas777閱讀 5,190評(píng)論 2 54
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,930評(píng)論 6 13
  • 斑點(diǎn)最煩人抚垃,如果選擇用護(hù)膚品淡斑喷楣,那么斑點(diǎn)只可以慢慢淡化,效果不明顯鹤树,要是你選擇激光淡斑铣焊,那么淡斑后的肌膚會(huì)變的敏...
    愛美麗113閱讀 385評(píng)論 0 0