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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JDK1.4非阻塞套接字API概述

2019-11-18 15:47:04
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  J2SE 1.4版引入了非阻隔套接字(Nonblocking sockets),它答應(yīng)在網(wǎng)絡(luò)通信應(yīng)用程序和沒(méi)有阻隔的進(jìn)程中使用套接字。本文將具體介紹什么是非阻隔套接字(Nonblocking sockets)及其工作原理和用途。

  從java 1.4起,程序員便能用一組新的API來(lái)進(jìn)行I/O操作。這是JSR 51項(xiàng)目的結(jié)果,自2000年1月的Java 1.4 beta版,程序員便可以使用JSR 51了。在Java 1.4中增加了一些非常重要的新技術(shù)來(lái)處理諸如在文件和套接字上進(jìn)行高性能的讀/寫操作,正規(guī)表達(dá)式,譯碼/編碼字符集,內(nèi)存映射和文件鎖定。在這篇文章中,我們將討論一個(gè)非凡的新API――New I/O API: Nonblocking sockets。

  非阻隔套接字答應(yīng)在通道上做輸入/輸出操作而不用阻塞該通道的進(jìn)程。本文中我將討論異步高性能讀/寫操作和翻轉(zhuǎn)上下設(shè)計(jì)和開(kāi)發(fā)基于接口的應(yīng)用程序的技巧。

  Java開(kāi)發(fā)者也許會(huì)問(wèn),為什么介紹一種新的技術(shù)來(lái)處理套接字?Java 1.3.x的套接字又有哪些問(wèn)題?假設(shè)實(shí)現(xiàn)服務(wù)器端接受不同的客戶端的連接。同樣,假設(shè)客戶端能支持處理同步的多請(qǐng)求。使用Java 1.3.x,開(kāi)發(fā)這樣的服務(wù)器端有兩種不同的選擇:

  ●實(shí)現(xiàn)多線程服務(wù)為每個(gè)連接用戶處理線程。

  ●使用外部第三方模塊。

  這兩種方法都可以實(shí)現(xiàn),但是假如適用第一種方法――整個(gè)線程治理方案,包括相關(guān)并發(fā)性和沖突問(wèn)題――都需要靠程序員來(lái)處理。第二個(gè)方案也許花費(fèi)更大,且使應(yīng)用程序依靠“non-JDK”的外部模塊。依靠非阻隔套接字,你能實(shí)現(xiàn)非阻隔的服務(wù)無(wú)需直接治理線程或者采用外部模塊。進(jìn)入討論組討論。

  Buffer

  在我們考慮非阻隔套接字以前,不得不花費(fèi)一些時(shí)間在一個(gè)新的Java 1.4的類:java.nio.Buffer上。一個(gè)Buffer實(shí)例只是原始數(shù)據(jù)的一個(gè)有限的容器。
稱其有限是因?yàn)樗荒馨邢迶?shù)量的字節(jié);換句語(yǔ)說(shuō),它不是一個(gè)像Vector或是ArrayList一樣的容器,后兩者從理論上說(shuō)是沒(méi)有限度的。另外,一個(gè)Buffer實(shí)例僅能包含屬于Java的基本數(shù)據(jù)類型。例如:int,char,double,Boolean,等等。

  Buffer類是一個(gè)抽象類,它有7個(gè)子類分別對(duì)應(yīng)于七種基本的數(shù)據(jù)類型:

  ●ByteBuffer

  ●CharBuffer

  ●DoubleBuffer

  ●FloatBuffer

  ●IntBuffer

  ●LongBuffer

  ●ShortBuffer

  在非阻隔套接字編程中,通常所有新 I/O系統(tǒng)能工作的環(huán)境中,極其重要的是解決Buffer對(duì)象如何工作。這是因?yàn)樾绿捉幼滞ǖ朗褂肂uffer對(duì)象通過(guò)網(wǎng)絡(luò)來(lái)傳送數(shù)據(jù)。

  你可以使用以下靜態(tài)方法(即類方法)來(lái)創(chuàng)建一個(gè)新的Buffer實(shí)例:allocate,allocateDirect,wrap。在下面的例子中,三個(gè)Buffer對(duì)象將用三種不同的方法來(lái)實(shí)例化。

ByteBuffer buffer1 = ByteBuffer.allocate(1024);
ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024);
ByteBuffer buffer3 = ByteBuffer.wrap(new String("hello").getBytes());
  這段代碼的前兩行創(chuàng)建了兩個(gè)ByteBuffer對(duì)象,它們都包含1024個(gè)字節(jié)。allocate和allocateDirect方法都做了相同的工作,不同的是第二個(gè)方法直接使用操作系統(tǒng)來(lái)分配Buffer。從而它將提供更快的訪問(wèn)速度。不幸的是,并非所有的虛擬機(jī)都支持這種直接分配的方法。第三行使用wrap方法。它創(chuàng)建了一個(gè)ByteBuffer對(duì)象,包含的字節(jié)由字符串“hello”組成。

  Buffer對(duì)象的作用或多或少的與流的作用相似。“當(dāng)前位置(current position)”是一個(gè)極其重要的概念,它計(jì)算出你將要處理的Buffer對(duì)象的適當(dāng)?shù)奈恢谩T谌魏螘r(shí)候,一個(gè)Buffer對(duì)象都有一個(gè)當(dāng)前位置指向某一項(xiàng)。之后,每一次讀或?qū)懖僮鞫紩?huì)自動(dòng)的將當(dāng)前位置指向Buffer中的下一項(xiàng)。

  你可以用put方法寫入一些數(shù)據(jù)到Buffer中:



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 井冈山市| 淮阳县| 扶沟县| 绥滨县| 连平县| 阿图什市| 雅安市| 砚山县| 龙胜| 库尔勒市| 余庆县| 武功县| 区。| 和平县| 应用必备| 新昌县| 明水县| 秦皇岛市| 白水县| 沽源县| 大埔区| 泰兴市| 施甸县| 五台县| 丹东市| 时尚| 满城县| 顺平县| 北京市| 梧州市| 株洲市| 新沂市| 新宁县| 邯郸市| 张掖市| 新昌县| 卢湾区| 洞头县| 恩平市| 博白县| 恩平市|