亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Okio使用分析

2019-11-09 18:42:44
字體:
來源:轉載
供稿:網友

  最近在研究retrofit的具體實現,retrofit用到了okhttp,okhttp又用到了Okio,so我就想從最底層的Okio開始往上研究。而且一直沒有認真看過java的io這個塊,也正好趁此機會學習下io相關的知識。

  本篇是關于Okio,接下來應該還會寫關于okhttp、retrofit各一篇。網上關于這三個框架的文章很多,為什么還要自己在寫呢,因為別人的文章看的再多,終究沒有自己親自動手寫一篇,從頭梳理一遍來的痛快,總是看別人的文章,看后總沒有一種通透的感覺,對整個框架似懂非懂的,而且過兩天就忘的差不多了,所以很多東西自己寫一下很有必要。

  本文基于okio-1.9.0分析的,不同版本可能會有差異。如有錯誤,歡迎留言指正。

  先看一張圖片(這個不是嚴格的UML圖,算是草稿圖吧) 這里寫圖片描述   okio的源碼其實不多,看了下總共20多個類,大部分類都不是很長。這些類中最核心的類就幾個,這幾個類就構成了okio的骨架。下面是幾個核心的類: Okio:提供生成Sink和Source的方法 Sink : 接口類,功能上對應OutputStream Source :接口類,功能上對應InputStream BufferedSink:接口類繼承自Sink,內部有一個Buffer的Sink BufferedSource:接口類繼承自Source,內部有一個Buffer的Source Buffer:BufferedSink和BufferedSource的最終實現實現類, 實現緩存功能,內部有一個Segment鏈表 Segment:里面有個byte數組,通過pos,limit控制讀寫的位置(從byte[]哪里開始讀,哪里開始寫入),next, PRev實現導航到前面或后面的Segment(實現Segment鏈表結構)

下面是簡單的使用方法

socket = new Socket("127.0.0.1", 8080);InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();BufferedSource source = Okio.buffer(Okio.source(inputStream));BufferedSink sink = Okio.buffer(Okio.sink(outputStream));

平時我們使用socket,有時是直接調用InputStream,OutputStream的方法讀寫數據,使用Okio后,可以通過InputStream,OutputStream構造出Source,Sink,然后調用Source和Sink提供的方法讀寫數據。Source和Sink提供了大量的方法讀寫數據,可以支持字節流和字符流,同時使用Buffer提高了讀寫效率。 寫到這里發現沒有寫出okio到底好在哪里,以及怎樣實現的。這個自己暫時還沒有看的很懂,以后看懂了再來寫這部分。

下面是一個通過socket實現的通訊例子,分為client和server Server.java

import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.nio.charset.Charset;import okio.BufferedSink;import okio.BufferedSource;import okio.Okio;/** * Created by lee on 2017/1/24. */public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8080); while (true) { Socket socket = serverSocket.accept(); handleClientSocket(socket); } } catch (IOException e) { e.printStackTrace(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (Exception e) { e.printStackTrace(); } } } } private static void handleClientSocket(Socket socket) { Thread thread = new Thread(new Runnable() { @Override public void run() { try { while (true) { BufferedSource source = Okio.buffer(Okio.source(socket)); BufferedSink sink = Okio.buffer(Okio.sink(socket)); int length = source.readInt(); String message = source.readString(length, Charset.forName("utf-8")); System.out.println("length is: " + length + " , message is : " + message); if("error exit".equals(message)){ break; } String responseMsg = getResponseAccordMsg(message); if (responseMsg != null) { int respLength = responseMsg.getBytes().length; sink.writeInt(respLength); sink.writeString(responseMsg, Charset.forName("utf-8")); sink.flush(); } if("error exit".equals(responseMsg)){ break; } } } catch (IOException e) { e.printStackTrace(); }finally { if(socket!=null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }); thread.start(); } private static String getResponseAccordMsg(String msg) { String result = ""; if (msg != null && msg.length() > 0) { if (msg.equals("hello")) { result = "hello"; } else if (msg.equals("nice to meet you")) { result = "nice to meet you too"; } else if (msg.equals("see you")) { result = "see you next time"; } } if (result.length() == 0) { result = "error exit"; } return result; }}

client的代碼 OkioClient.java

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.nio.charset.Charset;import okio.BufferedSink;import okio.BufferedSource;import okio.Okio;/** * Created by lee on 2017/1/24. */public class OkioClient { public static void main(String[] args) { Socket socket = null; try { socket = new Socket("127.0.0.1", 8080); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); BufferedSource source = Okio.buffer(Okio.source(inputStream)); BufferedSink sink = Okio.buffer(Okio.sink(outputStream)); writeMsg(sink, "hello"); while (true) { int length = source.readInt(); String message = source.readString(length, Charset.forName("utf-8")); System.out.println("length is: "+length+" , message is : "+message); if ("error exit".equals(message)) { break; } String respMsg = getResponseAccordMsg(message); writeMsg(sink, respMsg); if ("error exit".equals(respMsg)) { break; } } } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } private static void writeMsg(BufferedSink sink, String msg) { try { int msgLength = msg.getBytes().length; sink.writeInt(msgLength); sink.writeString(msg, Charset.forName("utf-8")); sink.flush(); } catch (IOException e) { e.printStackTrace(); } } private static String getResponseAccordMsg(String msg) { String result = ""; if (msg != null && msg.length() > 0) { if (msg.equals("hello")) { result = "nice to meet you"; } else if (msg.equals("nice to meet you too")) { result = "see you"; } } if (result.length() == 0) { result = "error exit"; } return result; }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩人在线观看| 亚洲成人黄色在线| 亚洲人免费视频| 全球成人中文在线| 一本色道久久88精品综合| 5566日本婷婷色中文字幕97| 欧美噜噜久久久xxx| 国产精品视频99| 国外成人在线播放| 国产精品人成电影| 日韩电影中文字幕在线| 日韩欧美a级成人黄色| 日本精品久久久久影院| 伊人伊成久久人综合网站| 91久久精品国产91久久性色| 欲色天天网综合久久| 国产精品久久在线观看| 国产亚洲激情视频在线| 久久久久久91| 日韩女优在线播放| 日韩av成人在线观看| 亚洲a级在线观看| 中文字幕在线看视频国产欧美| 98精品国产自产在线观看| 日韩欧美亚洲国产一区| 韩国19禁主播vip福利视频| 亚洲第一免费网站| 成人黄色短视频在线观看| 黑人巨大精品欧美一区二区三区| 精品久久久久久中文字幕大豆网| 视频在线一区二区| 欧美电影免费观看网站| 高清日韩电视剧大全免费播放在线观看| 国产精品91久久久久久| 亚洲精品成人久久| 97国产真实伦对白精彩视频8| 亚洲国语精品自产拍在线观看| 黄色精品在线看| 在线观看91久久久久久| 国产亚洲一区二区精品| 黑人巨大精品欧美一区二区三区| 伊人久久精品视频| 国产精品1区2区在线观看| 亚洲自拍另类欧美丝袜| 国产精品一区二区在线| 成人免费自拍视频| 伊人久久久久久久久久久久久| 97精品在线观看| 国内精品久久久| 国产精品第一第二| 欧美成人免费网| 精品久久久久久亚洲精品| 欧美多人爱爱视频网站| 青草青草久热精品视频在线网站| 韩国视频理论视频久久| 亚洲电影免费观看| www.美女亚洲精品| 欧美中文在线视频| 国产亚洲视频中文字幕视频| 色与欲影视天天看综合网| 亚洲精品一区久久久久久| 国产精品视频地址| 91av在线免费观看视频| 日韩免费在线免费观看| 欧美成人免费播放| www日韩中文字幕在线看| 欧美成人午夜激情视频| 国产成人免费av电影| 亚洲电影免费观看高清完整版在线观看| 久久这里只有精品视频首页| 欧美精品做受xxx性少妇| 国产又爽又黄的激情精品视频| 91在线|亚洲| 国产在线一区二区三区| 国产婷婷色综合av蜜臀av| 国产精品入口日韩视频大尺度| 97免费在线视频| 亚洲999一在线观看www| 色播久久人人爽人人爽人人片视av| 日韩av网址在线| 欧美日在线观看| 在线观看中文字幕亚洲| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲精品国产精品久久清纯直播| 久久精品青青大伊人av| 久久久久久久97| 久热精品视频在线观看| 亚洲国产精品va在看黑人| 欧美激情一二三| www国产91| 国产精品精品国产| 亚洲国产高潮在线观看| 亚洲淫片在线视频| 日韩av一区二区在线观看| 欧美三级xxx| 国产噜噜噜噜久久久久久久久| 中文字幕在线看视频国产欧美| 亚洲一区中文字幕在线观看| 亚洲国产精品视频在线观看| 亚洲最大成人在线| 国产日韩在线精品av| 在线中文字幕日韩| 亚洲偷熟乱区亚洲香蕉av| 色系列之999| 欧美肥婆姓交大片| 亚洲人成毛片在线播放| 欧美性猛交99久久久久99按摩| 国产精品99久久久久久白浆小说| 国产不卡av在线免费观看| 久久97久久97精品免视看| 亚洲一区二区三区久久| 国产成人涩涩涩视频在线观看| 日韩中文在线中文网三级| 欧美国产高跟鞋裸体秀xxxhd| 一区二区三区国产在线观看| 亚洲成人久久电影| 亚洲欧美日韩一区二区三区在线| 亚洲人成电影在线观看天堂色| 中文字幕久热精品在线视频| 亚洲图片制服诱惑| 日韩国产精品视频| 国产精品视频地址| 久久中文字幕在线| 欧美国产在线电影| 国产精品一区二区在线| 精品福利樱桃av导航| 久久在线精品视频| 国内外成人免费激情在线视频网站| 91av视频在线播放| 久久久中精品2020中文| 美女扒开尿口让男人操亚洲视频网站| 国产精品久久久久久久久久小说| 亚洲美女又黄又爽在线观看| 国产精品入口日韩视频大尺度| 欧美在线视频导航| 中文字幕欧美国内| 欧美在线视频导航| 欧美激情亚洲激情| 亚洲欧洲免费视频| 亚洲第一区中文99精品| 久久久极品av| xvideos成人免费中文版| 久久精品国产亚洲精品2020| 综合网日日天干夜夜久久| 久久久久久久国产精品视频| 欧美黄色性视频| 韩国国内大量揄拍精品视频| 国产精品91一区| 成人欧美一区二区三区黑人孕妇| 欧美极品少妇与黑人| 亚洲欧美制服中文字幕| 欧美日韩一区免费| 欧美日本啪啪无遮挡网站| 96国产粉嫩美女| 伊人成人开心激情综合网| 中文字幕亚洲欧美日韩2019| 中文字幕少妇一区二区三区| 色综合91久久精品中文字幕| 欧美日韩色婷婷| 国产精品jizz在线观看麻豆| 日本不卡免费高清视频| 91丨九色丨国产在线| 日本91av在线播放| 午夜精品久久久久久久久久久久|