1. 程式人生 > >windows客戶端開發--xmpp協議gloox庫

windows客戶端開發--xmpp協議gloox庫

很多聊天室客戶端都使用了xmpp協議。

這個協議被人們詬病很多,但是對於簡單的訊息傳送還是有很大的使用價值的。

XMPP is the open standard for messaging and presence。

gloox is a popular library for the Extensible Messaging and Presence Protocol (XMPP), formerly known as Jabber.

所以寫了一個簡單的例子,如何使用gloox連線伺服器,監聽訊息,以及如何應答。

首先是設定 MessageHandler:

class Bot : public
MessageHandler { public: Bot() { JID jid("[email protected]"); client = new Client( jid, "botpwd" ); connListener = new ConnListener(); client->registerMessageHandler( this ); client->registerConnectionListener(connListener); client->connect(true
); }

這裡我們建立了一個客戶端,有ID和密碼。

接下來,我們需要ConnectionListener就處理連線。
而ConnectionListener一定要registered with 客戶端。這個一會再說。

現在是連線伺服器,我們採用non-bloking的方式。

為了能夠處理訊息,我們要實現handleMessage方法:

virtual void handleMessage( const Message& stanza, MessageSession* session = 0 ) {
    cout << "Received message: "
<< stanza << endl; Message msg(stanza.subtype(), stanza.from(), "Tell me more about " + stanza.body() ); client->send( msg ); }

這時候我們需要connectlisenner來處理連線,需要重寫純虛擬函式:

class ConnListener : public ConnectionListener {
public:
    virtual void onConnect() {
        cout << "ConnListener::onConnect()" << endl;
    }
    virtual void onDisconnect(ConnectionError e) {
        cout << "ConnListener::onDisconnect() " << e << endl;
    }
    virtual bool onTLSConnect(const CertInfo& info) {
        cout << "ConnListener::onTLSConnect()" << endl;
        return true;
    }
};

上面程式碼重要的是onTLSConnect()函式。

全部程式碼:

#include <iostream>
#include <string>
#include <gloox/client.h>
#include <gloox/message.h>
#include <gloox/messagehandler.h>
#include <gloox/connectionlistener.h>

using namespace std;
using namespace gloox;

ostream& operator<<(ostream& os, Message::MessageType type) {
    switch (type) {
        case Message::Chat:
            os << "Chat";
            break;
        case Message::Error:
            os << "Error";
            break;
        case Message::Groupchat:
            os << "Groupchat";
            break;
        case Message::Headline:
            os << "Headline";
            break;
        case Message::Normal:
            os << "Normal";
            break;
        case Message::Invalid:
            os << "Invalid";
            break;
        default:
            os << "unknown type";
            break;
    }
}

ostream& operator<<(ostream& os, const Message& stanza) {
    os << "type:'" << stanza.subtype() <<  "' from:'" << stanza.from().full() << "' body:'" << stanza.body() << "'";
    return os;
}

class ConnListener : public ConnectionListener {
public:
    virtual void onConnect() {
        cout << "ConnListener::onConnect()" << endl;
    }
    virtual void onDisconnect(ConnectionError e) {
        cout << "ConnListener::onDisconnect() " << e << endl;
    }
    virtual bool onTLSConnect(const CertInfo& info) {
        cout << "ConnListener::onTLSConnect()" << endl;
        return true;
    }
};

class Bot : public MessageHandler {
public:
    Bot() {
        JID jid("[email protected]");
        client = new Client( jid, "botpwd" );
        connListener = new ConnListener();
        client->registerMessageHandler( this );
        client->registerConnectionListener(connListener);
        client->connect(true);
    }

    ~Bot() {
        delete client;
        delete connListener;
    }

    virtual void handleMessage( const Message& stanza, MessageSession* session = 0 ) {
        cout << "Received message: " << stanza << endl;
        Message msg(Message::Chat, stanza.from(), "Tell me more about " + stanza.body() );
        client->send( msg );
    }

private:
   Client* client;
   ConnListener* connListener;
};

int main() {
    Bot b;
}

相關推薦

windows客戶開發--xmpp協議gloox

很多聊天室客戶端都使用了xmpp協議。 這個協議被人們詬病很多,但是對於簡單的訊息傳送還是有很大的使用價值的。 XMPP is the open standard for messaging and presence。 gloox is a popular

windows客戶開發--使用tinyxml解析xml檔案

例如,微信windows客戶端使用的duilib庫中,介面就是用xml進行描述的。所以,今天我們就來談一談windows客戶端中,也就是C++中如何解析xml。很多時候,我們都使用.ini檔案來儲存一些資料。xml確實是有很多的優點,某種程度上來說也確實可以完全取代ini,但

Windows客戶開發--WMI技術介紹

                     時光荏苒,六道輪迴。2004年,初中,歐錦賽,希臘神話,17歲的C羅哭成了淚人!2016年,工作,歐洲盃,能否再讓C羅哭成淚人?123想要獲得計算機硬體的詳細資訊,我們可以使用WMI。今天就作為開篇,談一談什麼是WMI? Windows Management Inst

Windows客戶開發--通過CREDENTIAL儲存使用者名稱和密碼

                     做windows客戶端,尤其是c/s開發,幾乎都要接觸到使用者的登入。需要使用者名稱和密碼,那麼我們往往要對使用者名稱和密碼就行儲存。方案1:寫入ini配置檔案 用過配置檔案儲存使用者名稱和密碼,密碼肯定是不能實明文了,需要採用一定的加密演算法。 但是,這是最大的麻煩

windows客戶開發--duilib顯示html

                     今天與大家分享的就是duilib這個庫中,如何做到顯示html的。有些控制元件,如Text可以通過showhtml函式來設定是否顯示html富文字。加粗{b}加粗{/b}1斜體{i}斜體{/i}1下劃線{u}下劃線{/u}1被選中{s}被選中{/s}1換行{n}1連結

windows客戶開發--讓你的客戶崩潰之前生成dump檔案

debug時候我們可以很快速、精確的定位問題所在。 但是對於release版本,我們往往無能為力。 尤其面對一群難纏的客戶,情況就會更加糟糕。 而且對於release版本來說,crash的時候日誌系統往往起不到任何作用。而且,我們也不可能捕獲所有的異常,更

windows客戶開發--獲取windows系統中檔案的MIME

首先,什麼是MIME,是不是檔案的字尾名呢? 當然不是。 有時候我們需要獲取某個檔案的字尾名,這也許對你來說太小case了,你可能不加思考的寫了一個函式,更加檔名字串查詢最後一個’.’,然後取最有一個’.’之後的字串,即為我們要得到的字尾名。 看似非常完美

Windows客戶開發--截圖並儲存為JPG檔案

JPG和PNG的區別: PNG is a true color lossless format. In practice it can accomplish a compression on standard photos of a factor of 2-3

windows客戶開發--如何測量一個字串顯示的物理長度

首先需要說明的是,我所說的字串的長度,不是string的length,也不是string的size。我指的是顯示的長度,即物理長度。 緣由: 之所以要提到這個,是因為遇到了一些問題。 再使用duilib進行開發時,發現label控制元件不能自適應寬度。

Windows客戶開發簡介(三)

         之前的一篇文章裡,我簡單概要的介紹了一下介面庫的知識。既然是跟介面有關,那麼必然少不了很多關於繪製的內容。對於Windows開發而言,介面繪製使用的一類API就是所謂的“GDI”。          GDI這個東西可有歷史了,但是我們就不去追根朔源了。首先

windows客戶開發--通過ShellExecute函式開啟瀏覽器

在我們的客戶端中常常會有一些link,點選後希望通過瀏覽器導航到該連結。 我們是通過ShellExecute函式來實現的。 ShellExecute的功能是執行一個外部程式(或者是開啟一個已註冊的檔案、開啟一個目錄、列印一個檔案等等),並對外部程式有一定的控

Windows 下使用Git 客戶訪問 GitLab 原始碼管理

Windows 下使用Git 客戶端訪問 GitLab 原始碼管理庫 在Windows下使用Git客戶端訪問GitLab原始碼資源: 第一步: 客戶端下載地址: http://download.csdn.net/detail/accesine960/9913786

HTTP/FTP客戶開發:libwww、libcurl、libfetch 以及更多

原文:http://hi.baidu.com/zkheartboy/blog/item/e40fc362f5d985dee6113ad9.html       網頁抓取和ftp訪問是目前很常見的一個應用需要,無論是搜尋引擎的爬蟲,分析程式,資源獲取程式,WebService

HDFS Java 客戶開發開發環境:Windows

HDFS是一個分散式檔案系統,既然是檔案系統,就可以對其中的檔案進行操作,比如說新建資料夾、上傳檔案,重新命名檔案,下載檔案,刪除檔案、列舉所有檔案等操作。 HDFSClient.java package com.looc.client; import

Putty+Xming實現在Windows客戶顯示Linux服務器的圖形化程序

圖形 服務 gnome 運行 打開 執行 -- 服務器 cati 走了不少彎路啊~~~言歸正傳,最近研發和我說要在一臺EC2的機器上運行一個帶GUI的程序,當時我就納悶了:EC2的機器應該沒有桌面套件的吧,那該怎麽運行GUI的程序呢?百思不得其解時收到一封郵件,大致意思是某

Android應用開發-小巫CSDN博客客戶開發開篇

ada 下拉 得到 博文 git 發出 列表 util 如何 2014年9月8日 八月十五 祝各位中秋節快樂 小巫斷斷續續花了幾個星期的時間開發了這麽一款應用——小巫CSDN博客,屬於私人定制的這樣的一款應用,整個客戶端的數據全部來自本人博客,是通過爬取本人博客地址htm

移動客戶開發-phongap

ins tools oid jdk1 all rom 安裝 nod file 最麻煩的就是環境搭建list:java sdk 1.6+ 建議 1.8+NodeJS(npm,cnpm)npm 全局安裝npm install -g cordova設置系統變量計算機-》屬性-》

Zabbix 監控 Windows 客戶

agent total load 客戶端 地址 建模 定義 成功 重啟 1. 下載 zabbix 客戶端軟件:www.zabbix.com/downloads/2.2.0/zabbix_agents_2.2.0.win.zip 2. 在 C 盤建一個名為 zabbix 的

Windows客戶配置GitHub的SSH公鑰

... add 繼續 ide file targe http win cati 檢查SSH keys的設置 $ cd ~/.ssh/ 如果顯示”No such file or directory”,跳到第三步,否則繼續。 備份和移除原來的SSH key設置 如果已經存在

2017python windows 客戶最新版本3.6.2安裝教程

python第一章 下載windows版本的python登錄網址 https://www.python.org/getit/ 點擊下載Download Python 3.6.3第二章 安裝python-3.6.2.exe根據下圖提示操作即可。第三章 驗證python客戶端是否安裝成功主