xmpp推送服務(wù)smack與springboot結(jié)合(三)

image.png

介紹

XMPP協(xié)議的推送實(shí)現(xiàn)采用的smack庫(kù)艰管,可以與不同的java框架整合使用,這次我使用的springboot框架實(shí)現(xiàn)。

這篇文章主要寫代碼的實(shí)現(xiàn)娘赴,對(duì)XMPP不清楚的,可以看前幾篇文章:

java推送技術(shù)的選擇(一)
openfire服務(wù)的安裝(二)

搭建springboot項(xiàng)目

這里寫圖片描述

pom.xml文件,加入jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--xmpp  smack-->
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-core</artifactId>
            <version>4.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-tcp</artifactId>
            <version>4.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-java7</artifactId>
            <version>4.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-extensions</artifactId>
            <version>4.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.igniterealtime.smack</groupId>
            <artifactId>smack-sasl-provided</artifactId>
            <version>4.1.8</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/libs-snapshot</url>
        </pluginRepository>
    </pluginRepositories>

</project>

與smack結(jié)合主要使用的是上面的5個(gè)jar包跟啤,smack的功能還有很多诽表,需要的可以去看看官方的API文檔

1、smack-core.jar XMPP RFC規(guī)范定義的XMPP核心功能隅肥。

2竿奏、smack-extensions.jar XMPP Standards Foundation定義的擴(kuò)展(XEP)功能。 包括群聊腥放、文件傳輸泛啸、用戶搜索等等。

官方文檔地址:
http://download.igniterealtime.org/smack/docs/latest/javadoc/

配置openfire地址

#openfire服務(wù)器地址
openfire.server=127.0.0.1

發(fā)送XMPP消息

連接XMPP服務(wù)器

XMPPTCPConnectionConfiguration.Builder config=XMPPTCPConnectionConfiguration.builder();
config.setServiceName(openfireServer);
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setSendPresence(true);
config.setCompressionEnabled(false);

XMPPTCPConnection con = new XMPPTCPConnection(config.build());
SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
SASLAuthentication.blacklistSASLMechanism("CRAM-MD5");
return con;

實(shí)現(xiàn)代碼

package com.example.demo;

import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.sasl.provided.SASLPlainMechanism;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.search.ReportedData;
import org.jivesoftware.smackx.search.UserSearchManager;
import org.jivesoftware.smackx.xdata.Form;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * info:
 * Created by shang on 2017/8/1.
 */
@RestController
public class SmackController {

    @Value("${openfire.server}")
    protected String openfireServer;


    @RequestMapping("")
    public Object index(String mobile, String body) {
        return sendSmackMessage(mobile, body, false);
    }




    public boolean sendSmackMessage(String mobile, String body,boolean deliveryReceiptRequest) {
        try {
            if (StringUtils.isEmpty(mobile)) {
                return false;
            }
            XMPPTCPConnection con = getXmpptcpConnection();
            con.connect();
            if (con.isConnected()) {
                SASLAuthentication.registerSASLMechanism(new SASLPlainMechanism());
                con.loginAnonymously();//匿名登錄
                UserSearchManager userSearchManager=new UserSearchManager(con);
                Form searchForm=userSearchManager.getSearchForm("search."+con.getServiceName());
                Form answerForm = searchForm.createAnswerForm();
                answerForm.setAnswer("Username", true);
                answerForm.setAnswer("search", mobile);
                ReportedData data=userSearchManager.getSearchResults(answerForm,"search."+con.getServiceName());
                List<ReportedData.Row> list = data.getRows();

                for (ReportedData.Row row : list) {
                    for (String jid : row.getValues("jid")) {
                        Message m = new Message();
                        m.setBody(body);//設(shè)置消息秃症。
                        m.setTo(jid);//設(shè)置發(fā)送目標(biāo)
                        if(deliveryReceiptRequest){
                            m.setType(Message.Type.normal);
                        }else{
                            m.setType(Message.Type.headline);
                        }
                        m.setSubject(body);
                        con.sendStanza(m);
                    }
                }
            }
            con.disconnect();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    private XMPPTCPConnection getXmpptcpConnection() {
        XMPPTCPConnectionConfiguration.Builder config=XMPPTCPConnectionConfiguration.builder();
        config.setServiceName(openfireServer);
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        config.setSendPresence(true);
        config.setCompressionEnabled(false);

        XMPPTCPConnection con = new XMPPTCPConnection(config.build());
        SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
        SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
        SASLAuthentication.blacklistSASLMechanism("CRAM-MD5");
        return con;
    }

}

代碼解釋

  1. getXmpptcpConnection方法為連接XMPP
  2. sendSmackMessage為發(fā)送消息的方法候址,mobile為接收人,body為發(fā)送的內(nèi)容伍纫,deliveryReceiptRequest為是否是離線消息
  3. 代碼中采用的是匿名發(fā)送宗雇,也可以指定一個(gè)賬號(hào)作為發(fā)送方
  4. 這里我根據(jù)需要還用了模糊匹配賬號(hào),給匹配的賬號(hào)都發(fā)送了消息
  5. Message.Type.normal與Message.Type.headline是是否離線消息

測(cè)試

啟動(dòng)項(xiàng)目后,瀏覽器輸入:http://localhost:8080/?mobile=18758120932&body=測(cè)試測(cè)試

登錄spray客戶端莹规,就會(huì)接收到消息


這里寫圖片描述

結(jié)束語(yǔ)

以上代碼使用就是我在項(xiàng)目中對(duì)推送服務(wù)的使用赔蒲,如果在APP內(nèi)用這樣的推送業(yè)務(wù),可以選擇XMPP服務(wù)作為你的選擇良漱。

更多的smack的使用可以查看官方文檔舞虱,聊天,分組母市,添加好友等功能矾兜,完全可以滿足你的各種需求。

有問(wèn)題歡迎給我留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末患久,一起剝皮案震驚了整個(gè)濱河市椅寺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒋失,老刑警劉巖打瘪,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件移剪,死亡現(xiàn)場(chǎng)離奇詭異拔妥,居然都是意外死亡舍咖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)链韭,“玉大人偏竟,你說(shuō)我怎么就攤上這事〕ㄇ停” “怎么了踊谋?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)儡陨。 經(jīng)常有香客問(wèn)我褪子,道長(zhǎng)量淌,這世上最難降的妖魔是什么骗村? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮呀枢,結(jié)果婚禮上胚股,老公的妹妹穿的比我還像新娘。我一直安慰自己裙秋,他們只是感情好琅拌,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摘刑,像睡著了一般进宝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枷恕,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天党晋,我揣著相機(jī)與錄音,去河邊找鬼徐块。 笑死未玻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胡控。 我是一名探鬼主播扳剿,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昼激!你這毒婦竟也來(lái)了庇绽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橙困,失蹤者是張志新(化名)和其女友劉穎瞧掺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纷宇,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夸盟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了像捶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片上陕。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桩砰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出释簿,到底是詐尸還是另有隱情亚隅,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布庶溶,位于F島的核電站煮纵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏偏螺。R本人自食惡果不足惜行疏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望套像。 院中可真熱鬧酿联,春花似錦、人聲如沸夺巩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柳譬。三九已至喳张,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間美澳,已是汗流浹背销部。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留人柿,地道東北人柴墩。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凫岖,于是被迫代替她去往敵國(guó)和親江咳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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

  • 關(guān)于XMPP最權(quán)威的講解:http://www.jabbercn.org/RFC3920(這個(gè)才是最權(quán)威的哥放,下面文...
    隨風(fēng)飄蕩的小逗逼閱讀 1,494評(píng)論 1 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理歼指,服務(wù)發(fā)現(xiàn),斷路器甥雕,智...
    卡卡羅2017閱讀 134,720評(píng)論 18 139
  • 一踩身、Smack庫(kù)概述 ????Smack是一個(gè)開源、易用的XMPP/Jabber客戶端庫(kù)社露,它使用Java語(yǔ)言開發(fā)挟阻,...
    AndryYu閱讀 6,169評(píng)論 2 13
  • 即時(shí)通訊系列閱讀 即時(shí)通訊基礎(chǔ) 即時(shí)通訊:XMPP基礎(chǔ) 即時(shí)通訊:XMPP項(xiàng)目實(shí)踐-微聊 Smack類庫(kù)最好的學(xué)習(xí)...
    JackChen1024閱讀 3,724評(píng)論 0 11
  • Android消息推送機(jī)制研究1.基于HTTP協(xié)議的推送機(jī)制基于HTTP協(xié)議的推送機(jī)制是一種請(qǐng)求-響應(yīng)模式,由于H...
    GB_speak閱讀 692評(píng)論 0 2