2008年12月6日

          1.       書目

          精通RMI——Java與EJB企業(yè)級(jí)應(yīng)用開發(fā)

          Java™ RemoteMethodInvocation Specification

          Java tutorial- RMI

          2.       基礎(chǔ)知識(shí)

          2.1 網(wǎng)絡(luò)通信協(xié)議

          網(wǎng)絡(luò)通信層是分布式計(jì)算環(huán)境中使用客戶/服務(wù)器結(jié)構(gòu)的一個(gè)核心技術(shù),而網(wǎng)絡(luò)編程中大體有兩種通信模式,無連接和面向連接的協(xié)議。

                       UDP

          UDP (universal datagram protocol)是一種用于無連接通信的標(biāo)準(zhǔn)化協(xié)議,其建立在IP協(xié)議之上,而IP協(xié)議是internet使用的基本數(shù)據(jù)傳輸協(xié)議。UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)報(bào)文的形式。一個(gè)典型的數(shù)據(jù)報(bào)文就是一個(gè)二進(jìn)制數(shù)據(jù)的傳輸單位。每一個(gè)數(shù)據(jù)報(bào)的前8個(gè)字節(jié)用來包含報(bào)頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機(jī)制。如果在從發(fā)送方到接收方的傳遞過程中出現(xiàn)數(shù)據(jù)報(bào)的丟失,協(xié)議本身并不能做出任何檢測(cè)或提示。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。一般用來傳輸少量數(shù)據(jù),它資源消耗小,處理速度快。

           TCP

          TCP(transport control protocol)傳輸控制協(xié)議,標(biāo)準(zhǔn)化的面向連接的通信協(xié)議。在使用TCP協(xié)議中發(fā)送者和接收者必須在通信之前建立連接,連接建立之后被看成是一個(gè)數(shù)據(jù)流,發(fā)送者將數(shù)據(jù)發(fā)到該數(shù)據(jù)流上,接收者從該數(shù)據(jù)流上讀取數(shù)據(jù)。如果接收者也同時(shí)是發(fā)送者則連接是雙向的。通信完成后任何一方都可以關(guān)閉連接,之后的讀寫操作都會(huì)失敗。TCP協(xié)議提供了可靠的面向?qū)ο蟮臄?shù)據(jù)流傳輸服務(wù)的規(guī)則和約定。簡(jiǎn)單的說在TCP模式中,對(duì)方發(fā)一個(gè)數(shù)據(jù)包給你,你要發(fā)一個(gè)確認(rèn)數(shù)據(jù)包給對(duì)方。Java提供的類庫都將TCP/IP協(xié)議的使用借助套接字(Socket)進(jìn)行了抽象。套接字包含了建立與遠(yuǎn)程主機(jī)的連接,與主機(jī)進(jìn)行通信以及關(guān)閉連接所需要的所有操作,而這些操作實(shí)際上還是由TCP/IP來執(zhí)行的。

          編組

          在應(yīng)用復(fù)雜尤其是面向?qū)ο蟮臅r(shí)候,一方面會(huì)遇到處理數(shù)據(jù)或者對(duì)象的結(jié)構(gòu)的問題。另一方面還會(huì)遇到面向流的用來發(fā)送字節(jié)或字符塊的網(wǎng)絡(luò)連接問題。此時(shí)需要將對(duì)象轉(zhuǎn)換成連接可以處理的格式,從而使自定義的對(duì)象可以通過連接管道。

          編組(marshalling)是一個(gè)將負(fù)責(zé)對(duì)象轉(zhuǎn)換成字節(jié)流的過程,然后在使用反過程----反編組將字節(jié)流轉(zhuǎn)換成對(duì)象。Java中編組的實(shí)現(xiàn)方式是序列化(serialization)。


              代理

          代理是一個(gè)實(shí)現(xiàn)給定接口的對(duì)象,但是不直接執(zhí)行一些代碼計(jì)算結(jié)果,而是代表其他一些對(duì)象執(zhí)行實(shí)際計(jì)算的對(duì)象。


              
              代理可以代表其他的庫或者某種類似的可以代替它執(zhí)行網(wǎng)絡(luò)通信的東西。這就是RMI工作的原理,代理在RMI也即存根(Stub)。

          引用位于服務(wù)器中的對(duì)象的代理是如何構(gòu)造的?客戶端不能有一個(gè)真的Java引用,因?yàn)镴ava引用只在對(duì)象位于同一個(gè)JVM時(shí)才能正常工作。構(gòu)造的基本思想是為服務(wù)器對(duì)象分配一個(gè)唯一的標(biāo)識(shí)序號(hào),該序號(hào)由代理保存,此外還有對(duì)象所在的主機(jī)名。



              客戶如何請(qǐng)求代理

          在獲取代理時(shí)我們需要一個(gè)間接層把所有細(xì)節(jié)抽象,通過使用名字去獲得對(duì)應(yīng)對(duì)象的思想就是命名。命名的一個(gè)主要作用是通過使用對(duì)象的名字,簡(jiǎn)化獲得對(duì)象的任務(wù)。

          對(duì)于RMI來說,最通用的命名實(shí)現(xiàn)時(shí)RMI注冊(cè),它具有bind和lookup操作,對(duì)于命名服務(wù)來說,客戶端其實(shí)存在一個(gè)它的代理。

          命名使用示例圖

          posted @ 2009-05-19 21:37 遲來的兵 閱讀(468) | 評(píng)論 (0)編輯 收藏

          一.String對(duì)象的比較,+操作和intern方法
          這里從一個(gè)問題入手來看看。

          package testPackage;
             public class Test {
                  
          public static void main(String[] args) {
                      String hello 
          = "Hello", lo = "lo";
                      System.out.print((hello 
          == "Hello"+ " ");
                      System.out.print((Other.hello 
          == hello) + " ");
                      System.out.print((other.Other.hello 
          == hello) + " ");
                      System.out.print((hello 
          == ("Hel" + "lo")) + " ");
                      System.out.print((hello 
          == ("Hel" + lo)) + " ");
                      System.out.println(hello 
          == ("Hel" + lo).intern());
                  }

              }
              class Other {
                  
          static String hello = "Hello";
              }


          package other;
              public class Other {
                  
          static String hello = "Hello";
              }

          正確答案:true true true true false true
          主要要點(diǎn)有:
          1.所有內(nèi)容相同的String指向同一個(gè)內(nèi)存塊。但String對(duì)象不能是通過new操作創(chuàng)建出來。主要原因是JVM對(duì)String做了優(yōu)化,String加載之后會(huì)持有一個(gè)常量池,
          只要在常量池中找到內(nèi)容相同的String就會(huì)把其引用返回。而new操作是直接在內(nèi)存中分配新空間。



          2.Java中有兩種綁定,靜態(tài)和動(dòng)態(tài)。如果+操作的兩邊是常量表達(dá)式那么會(huì)在采用靜態(tài)綁定,也就是說編譯之后值已經(jīng)定下來了。而如果有一邊是通過new操作創(chuàng)建出
          來的那么會(huì)采用動(dòng)態(tài)綁定,只有在運(yùn)行的時(shí)候才知道其具體的值。
          3.String的intern方法會(huì)到常量池里面找是否有相同內(nèi)容的String,如果有則返回其引用。如果沒有則把這個(gè)String對(duì)象添加到常量池之中并放回其引用。額外說
          下,intern在英文中有保留區(qū)的意思,這樣好理解其作用。intern方法還是native的。
          二.String中的正則表達(dá)式使用

          String中有些方法是需要正則表達(dá)式作為參數(shù)的。這個(gè)時(shí)候就要主要不要傳錯(cuò)參數(shù)。最典型的例子就是replaceAll(String regex, String replacement)。第一個(gè)
          參數(shù)是需要正則表達(dá)式的,而第二參數(shù)是普通的字符串。
                  String ss = "???";
                  ss 
          = ss.replaceAll("?""=");//運(yùn)行到這里會(huì)拋出PatternSyntaxException,因?yàn)?#8220;?”在正則表達(dá)式里面是特殊符號(hào),需要轉(zhuǎn)義。
                  ss = ss.replaceAll("[?]""=");//正確,我個(gè)人比較傾向于這種寫法。
                  ss = ss.replaceAll("\\?""=");//正確,對(duì)“?”做轉(zhuǎn)義。

          因此在使用split,replaceAll,replaceFirst等方法時(shí)要特別注意是不是需要轉(zhuǎn)義.

          posted @ 2008-12-06 19:39 遲來的兵 閱讀(239) | 評(píng)論 (0)編輯 收藏


          posts - 6, comments - 8, trackbacks - 0, articles - 1

          Copyright © 遲來的兵

          主站蜘蛛池模板: 罗甸县| 永州市| 汾西县| 鄂州市| 林州市| 山阴县| 诸城市| 勐海县| 昌吉市| 包头市| 石楼县| 平遥县| 玉龙| 昌都县| 黄龙县| 芦山县| 菏泽市| 廊坊市| 柞水县| 耒阳市| 马边| 东源县| 泊头市| 蓝田县| 临颍县| 陇西县| 永春县| 五台县| 延津县| 清镇市| 陵水| 郎溪县| 桐柏县| 黄龙县| 台南县| 云林县| 大化| 台湾省| 凉山| 同仁县| 田林县|