国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

網絡數據流的java處理

2019-11-18 10:46:00
字體:
來源:轉載
供稿:網友

  郭洪鋒 (ghf_emai@sohu.com)該文章對編寫客戶服務器應用的java程序員有所幫助,可以解決程序在對方出現故障的時候繼續穩定運行.
  前言:java程序要處理很多的網絡數據,網絡數據發送和接收以及數據流的處理是java程序要非凡關注的方面,隨著java的發展,這些方法也越來越得到重視和加強。本文從幾個方面解釋了java正確處理網絡數據流的要素,這些也是java程序員必須了解的基本的知識。
  
  1:龐大的java流處理
  首先,之所以說java流的龐大,是因為java中的流處理比其他語言的流處理在內容上多的多。
  
  java流在處理上分為字符流和字節流。字符流處理的單元為2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元為1個字節,操作字節和字節數組。
  
  Java內用Unicode編碼存儲字符,字符流處理類負責將外部的其他編碼的字符流和java內Unicode字符流之間的轉換。而類InputStreamReader和OutputStreamWriter處理字符流和字節流的轉換。字符流(一次可以處理一個緩沖區)一次操作比字節流(一次一個字節)效率高。
  
  對應不同的流,需要不同的流構建器或流過濾實現。java目前依然在逐漸增加其流處理方法,雖然java類庫的創作人員可以列舉出很多理由來說明這要做的優點,但我還是覺得java開始變得向其他語言一樣復雜起來。
  
  2:網絡數據流的收發
  java對網絡數據的發送和接收處理,也借用了一般流處理的方法。我們知道,在幾乎其他所有語言中,網絡數據的收發在利用類似send(或write)和recv(或read)的方法時并沒有明顯的流處理。但是java和這些語言的收發方法有較大區別,要借助流才可以完成:
  .......
  
   sock = new Socket(addr, port);
  
   OutputStream os = sock.getOutputStream();
  
   InputStream is = sock.getInputStream();
  
   os.write(byte[] b);
  
   is.read(byte[] b);
  
  
  
  這些方法總給人一種不太舒適的感覺。不過從Jdk1.4開始彌補了這一點。JDK1.4中新增加了新的I/O流處理,在緩沖區治理、可伸縮網絡和文件IO、字符集支持、正規表達式匹配方面做了新的處理。其中緩沖區治理和通道(Channel)概念則是對網絡數據流的收發處理支持的強化。緩沖區治理中ByteBuffer類更好的支持了網絡數據流處理。在網絡連接中,通道代表了sockets的連接。基于這些新的IO處理,以上代碼可以改寫為:
  ......
  ByteBuffer bytebuf = ByteBuffer.allocate(2048); // 創建一個指定大小的緩沖區
  
  InetSocketAddress isa = new InetSocketAddress(hostname,port);
  
  sc = SocketChannel.open(); // 建立一個socket通道
  
  sc.connect( isa); // 建立一個socket連接
  
  …
  
  sc.write(bytebuf); // 發送數據
  
  …
  
  sc.read(bytebuf); // 接收數據
  
  這樣的程序似乎要流暢的多。
  
  
  
  3:java對網絡數據流的處理
  java程序對網絡數據流的處理要關注四個基本方面:數據流的編碼,字節順序,數據格式對應和取數。這是四個不同的問題,但是都影響到網絡數據的正確接收。
  
  3.1 網絡數據流的解碼和編碼
  網絡數據流的編碼和解碼主要針對流中出現的字符串。網絡數據流中的字符串均為原始的字節流形式。
  
  要正確接收網絡數據流中的字符串,首先要知道該字符串的編碼方案。然后才可以調用解碼的方法獲得java能夠熟悉的Unicode編碼字符串。可以用如下代碼處理網絡數據流中字符串的編碼和解碼:
  // 獲得編碼對象,即網絡對等方的熟悉的字符串編碼。
  
  Charset charset = Charset.forName("???"); // ???為對等方的編碼名,java必須支持。
  
  // 生成編碼器和解碼器對象。
  
  CharsetDecoder decoder = charset.newDecoder();
  
  CharsetEncoder encoder = charset.newEncoder();
  
  .......
  
  // 對從網絡數據流中獲得的字節流解碼取得java字符串
  
  CharBuffer charbuf = decoder.decode(bytebuff);
  
  .......
  
  // 將java字符串編碼成指定編碼的字節流,以便網絡發送
  
  Bytebuff bytebuff = encoder.encode(CharBuffer.wrap("Test String");
  
  .......
  
  
  
  
  3.2 網絡數據流的字節順序
  目前的字節順序有兩類:BIG_ENGIAN和LITTLE_ENDIAN。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凌源市| 凌海市| 黄骅市| 宜兰县| 盱眙县| 昭通市| 望谟县| 浮梁县| 汽车| 吴旗县| 友谊县| 淳安县| 萨迦县| 平顺县| 岳普湖县| 池州市| 平安县| 崇仁县| 喜德县| 达拉特旗| 锦州市| 龙岩市| 岑巩县| 古田县| 金溪县| 治县。| 会宁县| 霍邱县| 沙雅县| 陇西县| 大渡口区| 洪洞县| 搜索| 岗巴县| 清丰县| 牙克石市| 兰溪市| 桦甸市| 廉江市| 宣恩县| 来宾市|