Java基础知识强化之网络编程笔记24:Android网络通信之 AndroidAsync(基于nio的异步通信库)

1. AndroidAsync  

  AndroidAsync 是一个基于nio的异步socket ,http(客户端服务器端),websocket,socket.io库,AndroidAsync 是一个底层的网络协议库,如果你想要一个容易使用,高级的,http请求库,请使用Ion(它是基于AndroidAsync 的),正常来说开发者更倾向于使用  Ion。

如果你需要一个未被封装的Android的raw Socket, HTTP client/server, WebSocket, and Socket.IO, AndroidAsync 正适合你。

2. AndroidAsync 的特性

  • 基于NIO,一个线程,回调驱动,高效
  •  所有的操作返回一个Future,而且可以取消
  • All operations return a Future that can be cancelled
  • Socket client + socket server
  • HTTP client + server
  • WebSocket client + server
  • Socket.IO 客户端

3. AndroidAsync 的下载

<dependency>

    <groupId>com.koushikdutta.async</groupId>

    <artifactId>androidasync</artifactId>

    <version>(insert latest version)</version>

</dependency>

4. AndroidAsync 的使用

(1)下载一个字符串

 1 // url is the URL to download.
 2 AsyncHttpClient.getDefaultInstance().getString(url, new AsyncHttpClient.StringCallback() {
 3     // Callback is invoked with any exceptions/errors, and the result, if available.
 4     @Override
 5     public void onCompleted(Exception e, AsyncHttpResponse response, String result) {
 6         if (e != null) {
 7             e.printStackTrace();
 8             return;
 9         }
10         System.out.println("I got a string: " + result);
11     }
12 });

(2)下载一个Json

 1 // url is the URL to download.
 2 AsyncHttpClient.getDefaultInstance().getJSONObject(url, new AsyncHttpClient.JSONObjectCallback() {
 3     // Callback is invoked with any exceptions/errors, and the result, if available.
 4     @Override
 5     public void onCompleted(Exception e, AsyncHttpResponse response, JSONObject result) {
 6         if (e != null) {
 7             e.printStackTrace();
 8             return;
 9         }
10         System.out.println("I got a JSONObject: " + result);
11     }
12 });

(3)下载一个文件

 1 AsyncHttpClient.getDefaultInstance().getFile(url, filename, new AsyncHttpClient.FileCallback() {
 2     @Override
 3     public void onCompleted(Exception e, AsyncHttpResponse response, File result) {
 4         if (e != null) {
 5             e.printStackTrace();
 6             return;
 7         }
 8         System.out.println("my file is available at: " + result.getAbsolutePath());
 9     }
10 });

(4)支持缓存

1 // arguments are the http client, the directory to store cache files, and the size of the cache in bytes
2 ResponseCacheMiddleware.addCache(AsyncHttpClient.getDefaultInstance(),
3                                   getFileStreamPath("asynccache"),
4                                   1024 * 1024 * 10);

(5)创建一个Socket

 1 AsyncHttpClient.getDefaultInstance().websocket(get, "my-protocol", new WebSocketConnectCallback() {
 2     @Override
 3     public void onCompleted(Exception ex, WebSocket webSocket) {
 4         if (ex != null) {
 5             ex.printStackTrace();
 6             return;
 7         }
 8         webSocket.send("a string");
 9         webSocket.send(new byte[10]);
10         webSocket.setStringCallback(new StringCallback() {
11             public void onStringAvailable(String s) {
12                 System.out.println("I got a string: " + s);
13             }
14         });
15         webSocket.setDataCallback(new DataCallback() {
16             public void onDataAvailable(ByteBufferList byteBufferList) {
17                 System.out.println("I got some bytes!");
18                 // note that this data has been read
19                 byteBufferList.recycle();
20             }
21         });
22     }
23 });

(6)支持socket io

 1 SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://192.168.1.2:3000", new ConnectCallback() {
 2     @Override
 3     public void onConnectCompleted(Exception ex, SocketIOClient client) {
 4         if (ex != null) {
 5             ex.printStackTrace();
 6             return;
 7         }
 8         client.setStringCallback(new StringCallback() {
 9             @Override
10             public void onString(String string) {
11                 System.out.println(string);
12             }
13         });
14         client.on("someEvent", new EventCallback() {
15             @Override
16             public void onEvent(JSONArray argument, Acknowledge acknowledge) {
17                 System.out.println("args: " + arguments.toString());
18             }
19         });
20         client.setJSONCallback(new JSONCallback() {
21             @Override
22             public void onJSON(JSONObject json) {
23                 System.out.println("json: " + json.toString());
24             }
25         });
26     }
27 });

(7)提交表单

 1 AsyncHttpPost post = new AsyncHttpPost("http://myservercom/postform.html");
 2 MultipartFormDataBody body = new MultipartFormDataBody();
 3 body.addFilePart("my-file", new File("/path/to/file.txt");
 4 body.addStringPart("foo", "bar");
 5 post.setBody(body);
 6 AsyncHttpClient.getDefaultInstance().execute(post, new StringCallback() {
 7     @Override
 8     public void onCompleted(Exception e, AsyncHttpResponse source, String result) {
 9         if (e != null) {
10             ex.printStackTrace();
11             return;
12         }
13         System.out.println("Server says: " + result);
14     }
15 });



(8)创建一个http server

 1 AsyncHttpServer server = new AsyncHttpServer();
 2 List<WebSocket> _sockets = new ArrayList<WebSocket>();
 3 server.get("/", new HttpServerRequestCallback() {
 4     @Override
 5     public void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) {
 6         response.send("Hello!!!");
 7     }
 8 });
 9 // listen on port 5000
10 server.listen(5000);
11 // browsing http://localhost:5000 will return Hello!!!

接着,创建一个websocket  server

 1 server.websocket("/live", new WebSocketRequestCallback() {
 2     @Override
 3     public void onConnected(final WebSocket webSocket, AsyncHttpServerRequest request) {
 4         _sockets.add(webSocket);
 5         //Use this to clean up any references to your websocket
 6         websocket.setClosedCallback(new CompletedCallback() {
 7             @Override
 8             public void onCompleted(Exception ex) {
 9                 try {
10                     if (ex != null)
11                         Log.e("WebSocket", "Error");
12                 } finally {
13                     _sockets.remove(webSocket);
14                 }
15             }
16         });
17         webSocket.setStringCallback(new StringCallback() {
18             @Override
19             public void onStringAvailable(String s) {
20                 if ("Hello Server".equals(s))
21                     webSocket.send("Welcome Client!");
22             }
23         });
24     }
25 });
26 //..Sometime later, broadcast!
27 for (WebSocket socket : _sockets)
28     socket.send("Fireball!");

(9)支持Future

1 Future<String> string = client.getString("http://foo.com/hello.txt");
2 // this will block, and may also throw if there was an error!
3 String value = string.get();

5. AndroidAsync的下载

开源地址:https://github.com/koush/AndroidAsync