日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java ByteBuffer網絡編程用法實例解析

瀏覽:20日期:2022-08-22 11:11:24

做tcp網絡編程,要解析一批批的數據,可是數據是通過Socket連接的InputStream一次次讀取的,讀取到的不是需要轉換的對象,而是要直接根據字節流和協議來生成自己的數據對象。

按照之前的編程思維,總是請求然后響應,當然Socket也是請求和響應,不過與單純的請求響應是不同的。

這里Socket連接往往是要保持住的,也就是長連接,然后設置一個緩沖區,網絡流不斷的追加到緩沖區。然后后臺去解析緩沖區的字節流。

Java ByteBuffer網絡編程用法實例解析

如圖所示,網絡的流一直在傳遞,我們收到也許是完成的數據流,也可能是沒有傳遞完的。這里就需要監視管道,不斷讀取管道中的流數據,然后向緩沖區追加。程序從頭開始解析,如果目前緩沖區包含了數據,則解析,沒有則放棄繼續讀取管道流。

就算管道中包含了數據,也不一定包含了完成的數據。例如,100個字節是一個數據體,可是目前緩沖區內包含了120個字節,這就是說緩沖區包含了一條數據,但是還有沒有傳遞完的字節流。那么就要把前100個字節拿出來解析,然后從緩沖區清除這100個字節。那緩沖區就剩下20個字節了,這些數據可能在下次流中補充完成。

如何建立緩沖?

/** * 全局MVB數據緩沖區 占用 1M 內存 */ private static ByteBuffer bbuf = ByteBuffer.allocate(10240); /** * 線程安全的取得緩沖變量 */ public static synchronized ByteBuffer getByteBuffer() { return bbuf; }

寫一個Socket客戶端,該客戶端得到Socket連接,然后讀取流,一直向緩沖中追加字節流,每次追加后調用一個方法來解析該流

public void run() { Socket socket = GlobalClientKeep.mvbSocket; if (null != socket) { try { // 獲得mvb連接引用 OutputStream ops = socket.getOutputStream(); InputStream ips = socket.getInputStream(); while (true) { if (null != ops && null != ips) { // 接收返回信息 byte[] bt = StreamTool.inputStreamToByte(ips); ByteBuffer bbuf = GlobalCommonObjectKeep.getByteBuffer(); // 設置到緩沖區中 bbuf.put(bt); // //////////////////////////////////////////////////////////////////////// // 拆包解析方法 splitByte(ops); ops.flush(); } } } catch (Exception e) { e.printStackTrace(); } } else { // 如果連接存在問題,則必須重新建立 GlobalClientKeep.initMvbSocket(); } }

關于如何讀取流,我有一篇博客專門講解了所以這里是直接調用方法

byte[] bt = StreamTool.inputStreamToByte(ips);

那么解析方法是如何做的?

解析方法首先獲得該緩沖中的所有可用字節,然后判斷是否符合一條數據條件,符合就解析。如果符合兩條數據條件,則遞歸調用自己。其中每次解析一條數據以后,要從緩沖區中清除已經讀取的字節信息。

/** * @說明 拆包解析方法 */ public static void splitByte(OutputStream ops) { try { ByteBuffer bbuf = GlobalCommonObjectKeep.getByteBuffer(); int p = bbuf.position(); int l = bbuf.limit(); // 回繞緩沖區 一是將 curPointer 移到 0, 二是將 endPointer 移到有效數據結尾 bbuf.flip(); byte[] byten = new byte[bbuf.limit()]; // 可用的字節數量 bbuf.get(byten, bbuf.position(), bbuf.limit()); // 得到目前為止緩沖區所有的數據 // 進行基本檢查,保證已經包含了一組數據 if (checkByte(byten)) { byte[] len = new byte[4]; // 數組源,數組源拷貝的開始位子,目標,目標填寫的開始位子,拷貝的長度 System.arraycopy(byten, 0, len, 0, 4); int length = StreamTool.bytesToInt(len); // 每個字節流的最開始肯定是定義本條數據的長度 byte[] deco = new byte[length]; // deco 就是這條數據體 System.arraycopy(byten, 0, deco, 0, length); // 判斷消息類型,這個應該是從 deco 中解析了,但是下面具體的解析內容不再?? int type = 0; // 判斷類型分類操作 if (type == 1) {} else if (type == 2) {} else if (type == 3) {} else { System.out.println('未知的消息類型,解析結束!'); // 清空緩存 bbuf.clear(); } // 如果字節流是多余一組數據則遞歸 if (byten.length > length) { byte[] temp = new byte[bbuf.limit() - length]; // 數組源,數組源拷貝的開始位子,目標,目標填寫的開始位子,拷貝的長度 System.arraycopy(byten, length, temp, 0, bbuf.limit() - length); // 情況緩存 bbuf.clear(); // 重新定義緩存 bbuf.put(temp); // 遞歸回調 splitByte(ops); }else if(byten.length == length){ // 如果只有一條數據,則直接重置緩沖就可以了 // 清空緩存 bbuf.clear(); } } else { // 如果沒有符合格式包含數據,則還原緩沖變量屬性 bbuf.position(p); bbuf.limit(l); } } catch (Exception e) { e.printStackTrace(); } }

代碼只是一個參考,主要講解如何分解緩沖區,和取得緩沖區的一條數據,然后清除該數據原來站的空間。

至于緩沖區的屬性,如何得到緩沖區的數據,為什么要清空,bbuf.flip();是什么意思。下面來說一下關于ByteBuffer 的一下事情。

ByteBuffer 中有幾個屬性,其中有兩個很重要。limit和 position。position開始在0,填充數據后等于數據的長度,而limit是整個緩沖可用的長度。bbuf.flip();之后,position直接變為0,而limit直接等于position。JDK源碼如下:

/** * Flips this buffer. The limit is set to the current position and then * the position is set to zero. If the mark is defined then it is * discarded. * * <p> After a sequence of channel-read or <i>put</i> operations, invoke * this method to prepare for a sequence of channel-write or relative * <i>get</i> operations. For example: * * <blockquote><pre> * buf.put(magic); // Prepend header * in.read(buf); // Read data into rest of buffer * buf.flip(); // Flip buffer * out.write(buf); // Write header + data to channel</pre></blockquote> * * <p> This method is often used in conjunction with the {@link * java.nio.ByteBuffer#compact compact} method when transferring data from * one place to another. </p> * * @return This buffer */ public final Buffer flip() {limit = position;position = 0;mark = -1;return this; }

這樣,在position和limit之間的數據就是我們要的可用數據。

但是position和limit是ByteBuffer在put和get時需要的屬性,所以在使用后要么還原,要么像上面代碼一樣,清除一些字節信息然后重置。

ByteBuffer 的get和put不是我們平常的取值和設值一樣,他會操縱一些屬性變化。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩一区二区三免费高清在线观看 | 国产欧美88| 蜜臀精品一区二区三区在线观看 | 欧美激情福利| 精品欧美视频| 在线观看精品| 亚洲女同中文字幕| 亚洲精品小说| 亚洲丝袜啪啪| 91精品国产一区二区在线观看| 黄色亚洲免费| 久久av一区| 美国三级日本三级久久99 | 亚洲精品乱码| 日韩av在线免费观看不卡| 日日夜夜免费精品视频| 7777精品| 久久精品理论片| 在线天堂资源www在线污| 欧美高清不卡| 日韩一区二区三区高清在线观看| 欧美一级二级视频| 久久精品亚洲| 99精品电影| 美国三级日本三级久久99| 久久国产乱子精品免费女| 国产伊人久久| 欧美日韩精品一本二本三本 | 久久影视一区| 蜜臀久久99精品久久久画质超高清| 午夜亚洲福利| 麻豆一区在线| 欧美+日本+国产+在线a∨观看| 一区二区不卡| 另类欧美日韩国产在线| 中文字幕在线官网| 国产亚洲精品久久久久婷婷瑜伽| 蜜臀精品久久久久久蜜臀 | 国产精品视区| 欧美激情综合| 91精品电影| 国产日韩欧美三区| 久久中文字幕av| 国产日韩欧美一区二区三区| 天堂av在线| 日韩1区2区3区| 日韩成人精品一区| 综合欧美精品| 色偷偷偷在线视频播放| 石原莉奈在线亚洲三区| 久久精品免费看| 蜜桃久久av| 在线精品亚洲欧美日韩国产| 热久久久久久久| 97精品国产福利一区二区三区| 日韩在线a电影| 91综合网人人| 亚洲精品日韩久久| 91精品国产乱码久久久久久久 | 日本少妇一区二区| www成人在线视频| 一级欧美视频| 伊人久久国产| 日韩中文字幕| 久久久人人人| 国产精品亚洲欧美日韩一区在线| 99精品电影| 国产精品免费精品自在线观看| 极品日韩av| 热久久国产精品| www.com.cn成人| 国产精品天天看天天狠| 国产一级一区二区| 欧美日韩中出| 在线一区视频观看| 国产欧美日韩一级| 夜夜精品视频| 成人精品天堂一区二区三区| 一区二区三区国产盗摄| 欧美aa在线观看| 麻豆久久久久久久| 日韩精品久久理论片| 亚洲成人精选| 蜜桃成人精品| 精品久久91| 日韩专区视频网站| 九一成人免费视频| 中文一区一区三区高中清不卡免费| 蜜桃久久av| 亚洲精品护士| 国产综合婷婷| 国产99久久| 国产剧情在线观看一区| 日韩**一区毛片| 免费欧美在线视频| 国产一区成人| 亲子伦视频一区二区三区| 久久精品国产99国产| 91精品麻豆| 日韩精品导航| 日韩高清欧美激情| 色婷婷成人网| 亚洲色图综合| 蜜桃视频一区二区| 亚洲欧美日本日韩| 亚洲一级在线| 亚洲专区欧美专区| 99精品99| 丝袜诱惑制服诱惑色一区在线观看| 蜜桃视频欧美| 欧美精品一二| 亚洲激情欧美| 亚洲欧美日本日韩| 国产视频一区欧美| 美女网站一区| 欧美1级日本1级| 在线视频精品| 日韩在线卡一卡二| 日韩午夜电影| 91精品一区国产高清在线gif| 国产精品theporn| 欧美啪啪一区| 亚洲在线久久| 国产高清一区| 怡红院精品视频在线观看极品| 国产一区二区色噜噜| 精品视频在线观看网站| 久草精品视频| 精品久久久久久久| 综合激情在线| 日韩不卡在线观看日韩不卡视频| 日韩精品国产精品| 91精品丝袜国产高跟在线| 久久精品72免费观看| 午夜亚洲福利| 国产精品欧美三级在线观看| 美女性感视频久久| 久久亚洲精精品中文字幕| 久久毛片亚洲| 99久久亚洲精品| 亚洲免费影院| 欧美亚洲福利| 岛国av在线网站| 亚洲激情中文| 中文字幕一区二区三区四区久久| 青草国产精品久久久久久| 欧美成a人片免费观看久久五月天| 成人午夜网址| 91精品在线观看国产| 樱桃成人精品视频在线播放| 一区二区三区国产盗摄| 欧美一级二区| 精品色999| 欧美精选一区二区三区| 国产精品腿扒开做爽爽爽挤奶网站| 日本一区福利在线| 精品视频在线观看网站| 久久九九精品| 午夜在线一区| 国产亚洲一区二区三区啪| 欧美日韩1区2区3区| 91亚洲自偷观看高清| 亚洲激情中文在线| 国产情侣一区| 都市激情国产精品| 久久国产亚洲| 一区二区三区视频免费观看| 久久国产精品亚洲77777| 欧美视频久久| 九九99久久精品在免费线bt| 国产一区清纯| 青青青国产精品| 久久一区二区三区喷水| 丝袜亚洲精品中文字幕一区| 国产精品国产三级在线观看| 免费久久精品| 欧美激情视频一区二区三区在线播放| 久久亚洲国产| 国产欧美午夜| 日韩欧美少妇| 亚洲精品福利| 99精品综合| 国产精品密蕾丝视频下载| 在线日韩一区| 国产极品久久久久久久久波多结野| 久久婷婷丁香| 国产精品最新| 午夜宅男久久久| 国产黄大片在线观看| 亚洲精品第一| 婷婷成人在线| 免费日韩一区二区三区| 视频一区视频二区中文字幕| 日韩成人精品一区二区| 国产精品av一区二区| 老司机精品在线| 亚洲精品亚洲人成在线观看| 亚洲成人不卡| 久久精品日韩欧美| 日本强好片久久久久久aaa|