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

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

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

瀏覽:24日期: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久久,三上悠亚国产精品一区二区三区
福利欧美精品在线| 日韩福利视频网| 久久国产精品久久w女人spa| 日韩国产一区二区| 精品99在线| 国产精品亚洲综合色区韩国| 亚洲欧美日韩一区在线观看| 久久成人一区| 精品久久精品| 成人午夜在线| 99久久久久| 亚洲综合专区| 亚洲国产欧美日本视频| 色88888久久久久久影院| 久久在线免费| 综合一区二区三区| 麻豆一区二区三区| 99成人超碰| 免费成人性网站| 国产香蕉精品| 国产精品九九| 97欧美在线视频| 韩日一区二区| 影视先锋久久| 日韩欧乱色一区二区三区在线| 国产精品视频一区二区三区| 女生影院久久| 亚洲欧洲午夜| 国产精品99一区二区三| aⅴ色国产欧美| 久久精品国产99国产精品| 亚洲激情欧美| 在线精品亚洲欧美日韩国产| 香蕉久久国产| 久久久久久久久丰满| 日韩欧美中文在线观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 7777精品| 亚洲高清成人| 亚洲v天堂v手机在线| 亚洲bt欧美bt精品777| 精品国产亚洲一区二区三区在线| 婷婷综合五月| 91精品国产福利在线观看麻豆| 国产欧美日韩影院| 在线精品一区二区| 日韩高清不卡一区二区| 亚洲激情偷拍| 尤物tv在线精品| 首页欧美精品中文字幕| 久久久夜夜夜| 精品国产一区二区三区av片| 日韩午夜视频在线| 爽好多水快深点欧美视频| 日韩中文影院| 午夜久久av| 色婷婷久久久| 精品亚洲精品| 成人国产精品久久| 国产精品久久久久久久久久妞妞| 日韩精品中文字幕一区二区| 久久天堂av| 国产一区二区三区不卡av| 久久中文精品| 免费在线亚洲欧美| 另类综合日韩欧美亚洲| 国产女人18毛片水真多18精品| 日本在线视频一区二区| 青草av.久久免费一区| 亚洲一区二区av| 日韩亚洲国产欧美| 日日摸夜夜添夜夜添国产精品| 亚洲字幕久久| 国产精品日本一区二区不卡视频| 国产精品**亚洲精品| 国产精品麻豆久久| 精品一区二区三区在线观看视频| 国产精品nxnn| 国产一区二区三区久久| 久久精品动漫| 视频一区在线播放| 国产日韩欧美三区| 久久国产生活片100| 国产精品videossex久久发布| 黑森林国产精品av| 国产精品久久久久久久久免费高清| 福利精品一区| 久久九九国产| 亚洲一区二区av| 国产乱码精品一区二区三区亚洲人 | 日本成人手机在线| 久久精品国产成人一区二区三区 | 亚洲精品九九| 国产三级精品三级在线观看国产| 成人亚洲一区二区| 欧美日韩国产免费观看 | 国产一区二区三区天码| 国产主播一区| 国产欧美啪啪| 日韩成人三级| 日韩欧美中文字幕电影| 国产一区二区三区久久 | 日韩高清在线不卡| 精品国产欧美日韩| 九一成人免费视频| 国产精品任我爽爆在线播放| 欧产日产国产精品视频| 国产亚洲精品美女久久| 中文字幕中文字幕精品| 99精品电影| 亚洲综合电影| 精品五月天堂| 免费人成在线不卡| 亚洲成人三区| 久久久久国产精品一区二区| 国产精久久一区二区| 日本欧美一区二区在线观看| 六月天综合网| 中国女人久久久| 99在线精品免费视频九九视| 亚洲二区精品| 国内精品99| 亚洲永久字幕| 99香蕉国产精品偷在线观看 | 蜜桃视频在线观看一区| 在线一区视频观看| 日韩中文欧美| 亚洲涩涩在线| 午夜精品婷婷| 欧美天堂亚洲电影院在线观看| 久久国产中文字幕| 最新国产拍偷乱拍精品| 免费日韩av片| 欧美一区不卡| 国产精品99精品一区二区三区∴ | 欧美成人基地| 香蕉久久国产| 国产伦精品一区二区三区视频| 欧美激情91| 日韩中文视频| 亚洲精品自拍| 国产精品v日韩精品v欧美精品网站| 久久久久伊人| 激情综合在线| 亚洲人成网77777色在线播放| 欧美视频久久| 日韩在线看片| 天堂av一区| 国产欧美一区二区三区米奇| 福利在线一区| 乱人伦精品视频在线观看| 国产欧美日韩精品高清二区综合区| 91嫩草亚洲精品| 日韩中文字幕av电影| 老司机免费视频一区二区三区| 久久久久久美女精品| 久久爱www成人| 色爱av综合网| 日韩超碰人人爽人人做人人添| 成人在线视频中文字幕| 久久xxxx| 日韩免费小视频| 日韩精品一区二区三区免费视频| 亚洲精品伦理| 久久久噜噜噜| 麻豆久久久久久| 爽好多水快深点欧美视频| 日韩欧美看国产| 久久爱www.| 在线看片日韩| 国产精品7m凸凹视频分类| 久久婷婷国产| 日韩精品五月天| 亚洲少妇自拍| 久久九九99| 国产色播av在线| 国产精品午夜av| 日韩精品欧美精品| 91精品亚洲| 欧美aa在线视频| 欧美亚洲综合视频| 亚洲美女91| 亚洲婷婷丁香| 午夜日韩福利| 久久精品国产大片免费观看| 成人在线视频区| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 一区二区三区四区日韩| 在线一区免费| 欧美日韩在线二区| 国产一区二区三区亚洲| 国产精品资源| 麻豆精品视频在线| 国产一区二区三区日韩精品| 精品视频高潮| 一区二区视频欧美| 蜜桃久久精品一区二区| 亚洲毛片网站| 国产精品视频3p| 97国产精品|