初識網絡編程
最近有大神在oschina開源了t-io,聽說至關牛逼!因爲本人是個菜,一直從事web開發,很想往網絡編程方向轉型。正好借大神的開源工具,本身好好充實一下本身的生活!web
- 從hello world代碼開始
- ByteBuffer的認識和使用,剛開始接觸就開了client和server端的handler,其中比較重要的是一個encode和decode的方法,其中使用了ByteBuffer做爲數據的載體。
- 剛開始使用byte buffer不是很熟悉,本身寫了幾行代碼來編碼和解碼一個最簡單的字符串就報錯,仔細看了一下也就理解了大概工做原理。
public static void main(String[] args) throws Exception {
String s = "1234abc草榴";
int length = s.getBytes().length;
ByteBuffer buffer = ByteBuffer.allocate(4+length);
buffer.order(ByteOrder.BIG_ENDIAN);
buffer.putInt(length);
buffer.put(s.getBytes());
buffer.flip();
System.out.println(buffer.position());
System.out.println(buffer.getInt());
System.out.println(buffer.position());
byte[] b = new byte[length];
buffer.get(b);
System.out.println(new String(b)); }
其中幾個比較重要的參數須要瞭解清楚:編程
- 1.ByteOrder.BIG_ENDIAN。 表示buffer在寫數據的時候,字節數開始寫的開始順序,這個參數決定是從低位開始寫數據,仍是從高位開始寫數據,BIG_ENDIAN 表明着把數據的高位寫到bytebuffer高位(開始位),如上面字符串「1234abc草榴」,那麼在byte buffer中就是把「1」寫在byte buffer的最開頭(先無視putInt的佔位),以此類推。排序相反的是LITTLE_ENDIAN,順序影響不大,只要您在解碼的時候也按照相應的順序來解碼便可。
- 2.ByteBuffer.flip()方法。在剛開始我沒有寫這個方法的時候去getInt直接報了溢出錯誤,緣由是由於在咱們寫入數據後,byte buffer有個遊標會一直指向寫數據的最後一位,來告訴你下次寫數據的時候繼續往這個位置來寫。flip()方法至關於把遊標指向最開始,你即可以開始讀取數據。
- 3.ByteBuffer.allocate 。只是分配一塊緩衝區域的大小,通常會使用4個字節做爲頭來標示您將要保存實際數據的字節數組長度。
- 4.byte buffer在getInt的時候,遊標會日後移動方便您繼續讀取後面的數據,因此在getInt以後會發現兩個打印出來的position不同,而get的時候正好從遊標位置繼續日後讀取byte數組的length長度的數據。