編輯:關於Android編程
輪詢:比較簡單的,最容易理解和實現的就是客戶端去服務器上拉信息,信息的及時性要求越高則拉信息的頻率越高。客戶端拉信息的觸發可以是一些事件,也可以是一個定時器,不斷地去查詢服務器。所以這個方案的弊端也是顯而易見的,在輪詢的頻率較高時,服務器端的壓力很大,通訊的流量也很大,並且大部分時間都是做的無用功。
長連接:客戶端和服務端維持一個長連接,服務端在有信息推送的時候,借助這個連接把信息發送到客戶端。這個方案的優點是信息推送的及時性很高,基本是實時的,並且除了維持連接的心跳,不會產生額外的流量,但服務端需要維持連接,當客戶端數量龐大的時候,服務器的資源消耗也會很大。本文後面提到的幾個框架,都借助Java的NIO特性,緩解了服務端的壓力和資源消耗,但畢竟是有連接,在性能上還是無法跟傳統的HTTP無連接服務端比較。
沒想到一個消息推送可以有這麼多“內涵”啊。本質上,不就是維持一個連接,服務端需要推送消息的時候就通過這些連接往客戶端傳信息嘛。仔細想來,要想靈活和可控,最好的方式還是自己基於TCP/IP協議來實現消息推送。再往上一點,就是在HTTP協議上來實現,這樣的話既可以穿越防火牆,也可以通過AJAX實現網頁上的消息推送。Servlet 3.0的異步請求支持,其實也是可以用來做消息推送的。XMPP和MQTT協議要復雜些,最好選一個開源框架來搭建。
Netty是一個異步的,事件驅動的網絡編程框架和工具,是一個基於NIO的客戶,服務器端編程框架,使用Netty可以確保你快速和簡單的開發出一個網絡應用,例如實現了某種協議的客戶,服務端應用。Netty相當簡化和流線化了網絡應用的編程開發過程,例如,TCP和UDP的socket服務開發。
官網下載或者CSDN下載
在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的使用。
首先必須知道JNI是什麼東東?JNI(Java Native Interface)是java本地語言接口,也就是提供一種方法可以用JAVA調用底層語言(C/C++)。一般
Andrioid 編譯系統是你用於build,test,runapp的工具箱。編譯系統的運行,可以通過Android Studio的菜單或者是獨立的命令行。通過編譯系統的
簡介DancingNumberView是一個用於跳動顯示文本中數字的控件,繼承自TextView.這種控件一般用於顯示金額等對用戶較為敏感的數字,讓UI交互更加生動.它具
隨著Android平台的發展,Android應用的大小也變得越來越大。當你的應用和依賴庫達到某一個大小時,你會遇到構建錯誤,提示你的應用達到了Android應用構建結構的