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相當簡化和流線化了網路應用的程式設計開發過程,例如,TCP和UDP的socket服務開發。
Netty下載
Netty入門(Hello World)
在Eclipse中新建java工程,將netty.jar包放入lib目錄下,然後build path -->add to build path,目錄結構如下
客戶端程式碼如下
[java] view plaincopy
- 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.");
- }
- }
- }
服務端程式碼如下
[java] view plaincopy
- 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開發
相關文章
- Android 基於Netty的訊息推送方案之概念和工作原理(二)AndroidNetty
- Android 基於Netty的訊息推送方案之字串的接收和傳送(三)AndroidNetty字串
- Android之訊息推送原理Android
- RabbitMQ訊息佇列(二):”Hello, World“MQ佇列
- PHP基於Redis訊息佇列實現的訊息推送的方法PHPRedis佇列
- 基於 Hyperf 實現 RabbitMQ + WebSocket 訊息推送MQWeb
- 【Flutter 基礎】Hello WorldFlutter
- Flutter Web 之 Hello WorldFlutterWeb
- 實時訊息推送方案-SSE
- uni-app訊息推送方案APP
- Spring Boot Hello World 基於 IDEA 案例詳解Spring BootIdea
- Knative 實戰:基於 Kafka 實現訊息推送Kafka
- Python基礎01 Hello World!Python
- Android 訊息推送:第三方訊息推送平臺 詳細解析Android
- React 學習之 Hello WorldReact
- Spring-Cloud之hello worldSpringCloud
- spring boot(一)hello worldSpring Boot
- 從Netty版hello world看Netty原始碼,我們能看到什麼?Netty原始碼
- 如何使用Netty技術設計一個百萬級的訊息推送系統Netty
- 基於workerman實現的web訊息推送站內信功能Web
- netty系列之:netty對http2訊息的封裝NettyHTTP封裝
- Hello, World
- Hello,World
- Hello World
- Hello World!
- Hello World !
- Gstreamer基礎教程01 - Hello World
- WebGL 的 Hello WorldWeb
- react的”Hello World !“React
- spring boot(一)hello world 搭建Spring Boot
- 第一個程式Hello world
- PHP轉Go系列 | ThinkPHP與Gin框架之打造基於WebSocket技術的訊息推送中心PHPGo框架Web
- 基於SpringBoot+Netty實現一個自己的推送服務系統Spring BootNetty
- Go - Hello WorldGo
- Deep "Hello world!"
- Hello Python worldPython
- Hello World探究
- Docker Hello WorldDocker