摘要:現在很多網站都通過服務來實現消息推送及數據即時同步功能,即時通訊組件逐漸成為產品的標配。目前國內有很多成熟穩定的第三方即時通訊服務廠家,比如融云。
現在很多網站、APP都通過IM服務來實現消息推送及數據即時同步功能,即時通訊組件逐漸成為產品的標配。目前國內有很多成熟穩定的第三方即時通訊服務廠家,比如:融云。使用這些專業的服務可以提高開發效率而且服務穩定有保障。
如果自己DIY或者需要在封閉的局域網內使用IM服務,該怎么辦呢?下文就簡單介紹一下EasyPM曾經實踐過的自行搭建IM服務過程。
數據同步方式實現數據同步,有"推"、"拉" 兩種思路,具體有以下幾種方式:
使用HTTP輪循方式
說明:定時向HTTP服務端接口(Web Service API)獲取最新消息,可結合ajax技術實現頁面無刷新效果,這是主動拉取消息的機制。
優點:實現簡單、可控性強、部署成本低
缺點:實時性差,增加服務端負載
使用XMPP協議
說明:XMPP是基于可擴展標記語言(XML)的協議,它用于即時消息(IM)以及在線現場探測。它促進在服務器之間的準即時操作,其前身是Jabber,是一個開源形式組織產生的網絡即時通信協議。XMPP目前被IETF國際標準組織完成了標準化工作。
優點:協議成熟、強大、可擴展性強、目前主要應用于眾多IM系統
缺點:協議比較復雜、冗余(基于XML)、費流量
使用MQTT協議
說明:MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,該協議支持所有平臺,是輕量級的、基于代理的“發布/訂閱”模式的消息傳輸協議
優點:MQTT協議簡潔、可擴展性強、流量開銷很小、網絡傳輸時間短
缺點:還不夠成熟、實現較復雜
EasyPM作為一個團隊協作應用,消息/數據推送功能是不可或缺的。因為MQTT比較輕量且網絡開銷小等特點,我們選擇了支持MQTT協議的Apollo。
Apollo是什么?Apollo是apache旗下的基金項目,它是以Apache ActiveMQ5.x為基礎,采用全新的線程和消息調度架構重新實現的消息中間件,針對多核處理器進行了優化處理,它的速度更快、更可靠、更易于維護。apollo與ActiveQQ一樣支持多協議:STOMP、AMQP、MQTT、Openwire、 SSL、WebSockets,本文只介紹MQTT協議的使用。
進入Apollo下載頁面 ,選擇下載合適的版本
如果操作是系統是Windows Vista或更高版本,則需要安裝Microsoft Visual C++ 2010 Redistributable:
64位JVM
32位JVM
創建實例
進入E:apache-apollo-1.7之下的bin目錄,打開cmd窗口,執行命令:apollo create D:apollo_broker,命令執行成功后,在D盤下會有apollo_broker目錄,這便是apollo的服務實例,apollo之旅便從這里開始。
在D:apollo_broker下有個bin目錄,其中有兩個文件:
apollo-broker.cmd是通過cmd命令啟動apollo服務的
apollo-broker-service.exe,是用于創建window服務的
命令行啟動服務
在D:apollo_brokerin目錄下打開cmd窗口,執行apollo-broker run命令來啟動apollo服務,
啟動成功可以在瀏覽器中查看運行情況,訪問地址為 http://127.0.0.1:61680 , 默認用戶名/密碼:admin/password
創建windows服務
找到cmd.exe文件,點擊鼠標右鍵,以管理員身份運行,輸入創建windows服務命令,如下圖:
web端接收消息介紹MQTT協議有眾多客戶端實現,相關客戶端請參考apollo官方文檔
本文采用eclipse的paho客戶端實現
將 javascript客戶端項目下載下來,并在其項目根目錄下執行mvn命令,進行編譯,生成target目錄,其下生成mqttws31.js、mqttws31-min.js兩個js文件,將其拷貝到自己項目相關目錄下,并在頁面中引用,即可實現javascript客戶端的消息訂閱和發布,demo代碼如下:
var client = new Paho.MQTT.Client(location.hostname, 61623,"/", "clientId"); /* 61623是ws連接的默認端口,可以在apollo中間件中進行配置 (關于apollo的配置請參考: http://activemq.apache.org/apollo/documentation/user-manual.html ) */ // set callback handlers client.onConnectionLost = onConnectionLost; client.onMessageArrived = onMessageArrived; // connect the client client.connect({userName:"admin",password:"password",onSuccess:onConnect}); // called when the client connects function onConnect() { // 連接成功后的處理 // Once a connection has been made, make a subscription and send a message. console.log("onConnect"); client.subscribe("/topic/event"); // 訂閱消息的主題 var message = new Paho.MQTT.Message("Hello,this is a test"); message.destinationName = "/topic/event"; client.send(message); // 發送消息 } // called when the client loses its connection function onConnectionLost(responseObject) { // 連接丟失后的處理 if (responseObject.errorCode !== 0) { console.log("onConnectionLost:"+responseObject.errorMessage); } } // called when a message arrives function onMessageArrived(message) { // 消息接收成功后的處理 console.log("onMessageArrived:"+message.payloadString); }服務端消息發送介紹
paho java客戶端目前只支持J2SE和安卓,提供源碼下載和maven庫。
我們采用maven庫,其地址如下:
Official Releases
Nightly Snapshots
maven dependency配置:
org.eclipse.paho org.eclipse.paho.client.mqttv3 1.0.1
java實現代碼:
String topic = "MQTT Examples"; String content = "Message from MqttPublishSample"; int qos = 2; String broker = "tcp://127.0.0.1:61613"; String clientId = "JavaSample"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient sampleClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); System.out.println("Connecting to broker: "+broker); sampleClient.connect(connOpts); System.out.println("Connected"); System.out.println("Publishing message: "+content); MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(qos); sampleClient.publish(topic, message); System.out.println("Message published"); sampleClient.disconnect(); System.out.println("Disconnected"); System.exit(0); } catch(MqttException me) { System.out.println("reason "+me.getReasonCode()); System.out.println("msg "+me.getMessage()); System.out.println("loc "+me.getLocalizedMessage()); System.out.println("cause "+me.getCause()); System.out.println("excep "+me); me.printStackTrace(); }小結
至此,MQTT協議已部署完畢,java端可以發布消息,而javascript端則可以訂閱并接收到java端發布的信息。在搭建的過程中,可以參考以下資源:
MQTT
ActiveMQ5
Apollo官方文檔
eclipse paho
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65745.html
摘要:當前分為版本,以及版本,這兩個版本相互直接是不兼容的,但是當前世面的主流或者程序還是偏多,所以我這邊主要是版本為基礎,確切地說,是版本。下面來說說如何安裝開發環境以及開發工具一環境的安裝上安裝如果你正在使用,系統是,系統自帶了。 當前python分為2.x版本,以及3.x版本,這兩個版本相互直接是不兼容的,但是當前世面的主流web或者程序還是2.x偏多,所以我這邊主要是2.x版本為基礎...
摘要:開啟壓縮這里我使用的是打開安裝目錄,找到目錄,用記事本打開文件。 apache開啟 gzip 壓縮 這里我使用的是Apache2.4.17 打開apache安裝目錄,找到conf目錄,用記事本打開httpd.conf 文件。 ctrl+f 查找 去掉 #LoadModule headers_module modules/mod_headers.so 前面的注釋 # 去掉 #Load...
摘要:優化編寫一鍵安裝的腳本由于的系統默認都是,如果服務器需要用環境的話每臺都得手動操作升級,工作量比較大,編寫腳本提升效率。 安裝依賴的庫 yum -y install python-devel openssl openssl-devel gcc sqlite sqlite-devel mysql-devel libxml2-devel libxslt-devel Python =====...
閱讀 3288·2021-09-08 09:45
閱讀 1251·2019-08-30 15:53
閱讀 1522·2019-08-30 14:12
閱讀 981·2019-08-29 17:01
閱讀 2568·2019-08-29 15:35
閱讀 394·2019-08-29 13:09
閱讀 1965·2019-08-29 12:32
閱讀 3083·2019-08-26 18:37