1. 程式人生 > >Android 基於Netty的訊息推送方案之Hello World(一)

Android 基於Netty的訊息推送方案之Hello World(一)

訊息推送方案(輪詢、長連線)

輪詢

輪詢:比較簡單的,最容易理解和實現的就是客戶端去伺服器上拉資訊,資訊的及時性要求越高則拉資訊的頻率越高。客戶端拉資訊的觸發可以是一些事件,也可以是一個定時器,不斷地去查詢伺服器。所以這個方案的弊端也是顯而易見的,在輪詢的頻率較高時,伺服器端的壓力很大,通訊的流量也很大,並且大部分時間都是做的無用功。

長連線

長連線:客戶端和服務端維持一個長連線,服務端在有資訊推送的時候,藉助這個連線把資訊傳送到客戶端。這個方案的優點是資訊推送的及時性很高,基本是實時的,並且除了維持連線的心跳,不會產生額外的流量,但服務端需要維持連線,當客戶端數量龐大的時候,伺服器的資源消耗也會很大。本文後面提到的幾個框架,都藉助Java的NIO特性,緩解了服務端的壓力和資源消耗,但畢竟是有連線,在效能上還是無法跟傳統的HTTP無連線服務端比較。

其他

其他:在手機端,其實還可以有簡訊、郵件等方式,來進行資訊推送。這些方式由於牽涉到運營商和手機作業系統的內建服務框架,限制較多,何況微信都要被收費,所以就不去考慮了。

開源框架(Androidpn  Openfire  MINA  Netty)

Android手機應用,資訊推送的資料大多都是關於androidpn的,這是一個基於XMPP協議的Java開源資訊推送方案,包括完整的服務端和客戶端。服務端有Tomcat和Jetty兩個版本,下載下來後配置一下資料庫連線引數和IP埠就可以跑起來了。客戶端則可以參考它的示例,把Android程式碼拿過來用即可。所以這是一個針對android應用的高度定製版,如果要對服務端進行修改調整,動的地方比較多。
Openfire則適用的範圍更廣,是基於XMPP協議的開源實時協作伺服器,可以通過它簡單地搭建一個IM平臺。Androidpn是在Openfire上做了簡化,只針對Android的訊息推送。從這裡也可看出,就訊息推送來說,用XMPP協議有點殺雞用牛刀了。
MINA和Netty是Socket框架,是同一個作者的,架構差別不大。MINA歸Apache管,Openfire和Androidpn都是用的MINA;Netty則歸JBOSS管,從我檢索到的資料來看,更多偏向於Netty,大致是認為Netty的效能稍優,文件與例子更完整。

訊息推送服務(GCM  C2DM  百度雲推送)

其實也有一些現存的雲推送服務可供選擇,並不一定要自己來搭建一個平臺。谷歌的GCM,Google Cloud Messaging,是C2DM的升級版,Android終端用的話,本來是最合適不過了,但在國內大家都懂的,玩的是《牆來了》遊戲,有時你可以鑽過去,有時會被撞落水,所以不靠譜啊。百度和其他的一些公司,也提供雲推送服務,好像沒有免費的。谷歌應該比較鬱悶吧,Android上的搜尋、地圖、郵件、推送等等,在國內都是為他人作嫁衣裳。

迴歸本質-協議(TCP/IP  HTTP   XMPP   MQTT)

沒想到一個訊息推送可以有這麼多“內涵”啊。本質上,不就是維持一個連線,服務端需要推送訊息的時候就通過這些連線往客戶端傳資訊嘛。仔細想來,要想靈活和可控,最好的方式還是自己基於TCP/IP協議來實現訊息推送。再往上一點,就是在HTTP協議上來實現,這樣的話既可以穿越防火牆,也可以通過AJAX實現網頁上的訊息推送。Servlet 3.0的非同步請求支援,其實也是可以用來做訊息推送的。XMPP和MQTT協議要複雜些,最好選一個開源框架來搭建。

Netty簡介

Netty是一個非同步的,事件驅動的網路程式設計框架和工具,是一個基於NIO的客戶,伺服器端程式設計框架,使用Netty可以確保你快速和簡單的開發出一個網路應用,例如實現了某種協議的客戶,服務端應用。Netty相當簡化和流線化了網路應用的程式設計開發過程,例如,TCPUDPsocket服務開發。

Netty下載

Netty入門(Hello World)

在Eclipse中新建java工程,將netty.jar包放入lib目錄下,然後build path -->add to build path,目錄結構如下


客戶端程式碼如下

public class HelloClient {
	public static void main(String args[]) {
		// Client服務啟動器
		ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
		// 設定一個處理服務端訊息和各種訊息事件的類(Handler)
		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
			@Override
			public ChannelPipeline getPipeline() throws Exception {
				return Channels.pipeline(new HelloClientHandler());
			}
		});
		// 連線到本地的8000埠的服務端
		bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
	}

	private static class HelloClientHandler extends SimpleChannelHandler {
		@Override
		public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
			System.out.println("Hello world, I'm client.");
		}
	}
}
服務端程式碼如下
public class HelloServer {
	public static void main(String[] args) {
		// Server服務啟動器
		ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
		// 設定一個處理客戶端訊息和各種訊息事件的類(Handler)
		bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
			@Override
			public ChannelPipeline getPipeline() throws Exception {
				return Channels.pipeline(new HelloServerHandler());
			}
		});
		// 開放8000埠供客戶端訪問。
		bootstrap.bind(new InetSocketAddress(8000));
	}

	private static class HelloServerHandler extends SimpleChannelHandler {
		@Override
		public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
			System.out.println("Hello world, I'm server.");
		}
	}
}
首先執行服務端,然後執行客戶端,效果如下


下面我會進一步講解Netty的使用。

相關推薦

Android 基於Netty訊息方案Hello World()

訊息推送方案(輪詢、長連線) 輪詢 輪詢:比較簡單的,最容易理解和實現的就是客戶端去伺服器上拉資訊,資訊的及時性要求越高則拉資訊的頻率越高。客戶端拉資訊的觸發可以是一些事件,也可以是一個定時器,不斷地去查詢伺服器。所以這個方案的弊端也是顯而易見的,在輪詢的頻率較高時,伺服器

Android 基於Netty訊息方案物件的傳遞(四)

在上一篇文章中《Android 基於Netty的訊息推送方案之字串的接收和傳送(三)》我們介紹了Netty的字串傳遞,我們知道了Netty的訊息傳遞都是基於流,通過ChannelBuffer傳遞的,那麼自然,Object也需要轉換成ChannelBuffer來傳遞。好在Netty本身已經給我們寫好了

Android 基於Netty訊息方案字串的接收和傳送(三)

在上一篇文章中《Android 基於Netty的訊息推送方案之概念和工作原理(二)》 ,我們介紹過一些關於Netty的概念和工作原理的內容,今天我們先來介紹一個叫做ChannelBuffer的東東。 ChannelBuffer  Netty中的訊息傳遞,都必須以位元

Android 基於Netty訊息方案概念和工作原理(二)

上一篇文章中我講述了關於訊息推送的方案以及一個基於Netty實現的一個簡單的Hello World,為了更好的理解Hello World中的程式碼,今天我來講解一下關於Netty中一些概念和工作原理的內容,如果你覺得本篇文章有些枯燥,請先去閱讀《Android 基於Netty的訊息推送方案之Hell

Android 基於Netty的消息方案概念和工作原理(二)

img b2c 決定 watermark net nios 通道 感覺 art 上一篇文章中我講述了關於消息推送的方案以及一個基於Netty實現的一個簡單的Hello World。為了更好的理解Hello World中的代碼,今天我來解說一下關於Netty中一些概念和工

Android基於Netty訊息方案()

訊息推送方案(輪詢、長連線) 輪詢 輪詢:比較簡單的,最容易理解和實現的就是客戶端去伺服器上拉資訊,資訊的及時性要求越高則拉資訊的頻率越高。客戶端拉資訊的觸發可以是一些事件,也可以是一個定時器,不斷地去查詢伺服器。所以這個方案的弊端也是顯而易見的,在輪詢的頻率較高時,

android客戶端訊息功能實現方案

1.使用第三方推送平臺 如友盟、極光、百度等現成的訊息推送。好處:訊息及時、穩定,整合簡單。不需要自己搭建支援伺服器,但是可能涉及到收費、保密、服務質量、擴充套件等問題。 2、MQTT協議實現android推送 MQTT是一個輕

android 實現mqtt訊息,以及不停斷線重連的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &

Android UDP - 簡單訊息功能

近期接觸了幾個小的Android開發專案,根據需求要利用到網路傳輸中的UDP協議方式傳輸,遇到不少坑,在此分享一下在Android應用中UDP的一些簡單技術功能實現,希望能幫到用得到的同僚。 需(wo)求(yao)分(gan)析(ma): 從PC上輸入一串亂七八糟,然後能在我手機(某為pow

基於UMeng訊息測試-demo教程(iOS版)

基於UMeng訊息推送測試-demo教程(iOS版) 眼看著就要過年了(2017本命年終於快過去了臨來嶄新的2018大發年),每個人的心裡就像飛了一樣,這個時候能夠在辦公間待下來的,每個人都是精英,突然想起了那首張含韻的歌《放假了》。 今天是2017年臘月25距離2018年僅有5天,依舊在外

訊息方案

目的 對於需要即使通知使用者的業務,例如告警等,需要訊息推送功能,保證通知的及時性。 應用場景需求 訊息推送涉及到訊息的傳送和接收,即方案既要能在後端中使用,也要能在前端和移動端使用,所以需要能適配java 和 javaScript 語言。 選擇方案     常規

Android接入極光訊息

極光訊息推送: 極光推送(JPush)是一個端到端的推送服務,使得伺服器端訊息能夠及時地推送到終端使用者手機上,讓開發者積極地保持與使用者的連線 主要功能 保持與伺服器的長連線,以便訊息能夠即時推送到達客戶端 接收通知與自定義訊息,並向開發者App 傳遞

Android整合“小米訊息”詳細教程

訊息推送這個玩意,大部分APP都有的,你像QQ、淘寶、微博、支付寶、網易新聞等,他們的訊息推送簡直傷心病狂。 常見的第三方訊息推送方案有這些: 極光推送 友盟推送 個推 小米推送 騰訊信鴿 百度雲推送 阿里雲推送 今天不講別的,就講講小米推送的整合教程

WorkermanWEB訊息框架使用筆記【

伺服器使用的時候需要注意雲盾和360埠攔截 下載解壓到任意目錄 cd到目錄下執行 start.php linux :php start.php start -d win:直接執行start_

android當中的訊息

作為訊息推送,一般是捆綁service進行間歇性的請求伺服器獲得資料,以新訊息提醒的方式進行的。 這裡只放出訊息推送的程式碼。 以下為程式碼: //更新通知欄 /*獲取狀態通知欄管理*/

android studio 創建第一個apphello world

inf nbsp demo you per span instance 分享圖片 null android studio 創建第一個app之hello world 想要用studio創建一個簡單的app,結果遇到各種問題,application就是允許不起來,後來在

菜鳥學php擴充套件 hello world()

前言 這是一篇拖了很久就想寫的備忘錄,編寫php擴充套件一百度都是文章,但是很多文章是很老的了。有的例子都跑不通。有點尷尬。 此文用於記錄自己的筆記,當作備忘錄。 正文 1. 下載php安裝包 下載地址:php下載快鏈 本文選取的是php

基於Netty實現的Android 訊息(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

netty訊息和心跳檢測

主要參考 https://blog.csdn.net/coder_py/article/details/73441043 有小改動(因使用的是netty4的包 netty-all-4.1.25.Final.jar) 通訊資訊的基類,需要實現序列化,定義了資訊的型別和客戶端ID,方便進行管