<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2009年5月19日

    1.       書(shū)目

    精通RMI——Java與EJB企業(yè)級(jí)應(yīng)用開(kāi)發(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ò)編程中大體有兩種通信模式,無(wú)連接和面向連接的協(xié)議。

                 UDP

    UDP (universal datagram protocol)是一種用于無(wú)連接通信的標(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é)用來(lái)包含報(bào)頭信息,剩余字節(jié)則用來(lái)包含具體的傳輸數(shù)據(jù)。UDP協(xié)議并不提供數(shù)據(jù)傳送的保證機(jī)制。如果在從發(fā)送方到接收方的傳遞過(guò)程中出現(xiàn)數(shù)據(jù)報(bào)的丟失,協(xié)議本身并不能做出任何檢測(cè)或提示。因此,通常人們把UDP協(xié)議稱為不可靠的傳輸協(xié)議。一般用來(lái)傳輸少量數(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)閉連接,之后的讀寫(xiě)操作都會(huì)失敗。TCP協(xié)議提供了可靠的面向?qū)ο蟮臄?shù)據(jù)流傳輸服務(wù)的規(guī)則和約定。簡(jiǎn)單的說(shuō)在TCP模式中,對(duì)方發(fā)一個(gè)數(shù)據(jù)包給你,你要發(fā)一個(gè)確認(rèn)數(shù)據(jù)包給對(duì)方。Java提供的類庫(kù)都將TCP/IP協(xié)議的使用借助套接字(Socket)進(jìn)行了抽象。套接字包含了建立與遠(yuǎn)程主機(jī)的連接,與主機(jī)進(jìn)行通信以及關(guān)閉連接所需要的所有操作,而這些操作實(shí)際上還是由TCP/IP來(lái)執(zhí)行的。

    編組

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

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


        代理

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


        
        代理可以代表其他的庫(kù)或者某種類似的可以代替它執(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é)抽象,通過(guò)使用名字去獲得對(duì)應(yīng)對(duì)象的思想就是命名。命名的一個(gè)主要作用是通過(guò)使用對(duì)象的名字,簡(jiǎn)化獲得對(duì)象的任務(wù)。

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

    命名使用示例圖

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


    2008年12月6日

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

    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ì)象不能是通過(guò)new操作創(chuàng)建出來(lái)。主要原因是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)綁定,也就是說(shuō)編譯之后值已經(jīng)定下來(lái)了。而如果有一邊是通過(guò)new操作創(chuàng)建出
    來(lái)的那么會(huì)采用動(dòng)態(tài)綁定,只有在運(yùn)行的時(shí)候才知道其具體的值。
    3.String的intern方法會(huì)到常量池里面找是否有相同內(nèi)容的String,如果有則返回其引用。如果沒(méi)有則把這個(gè)String對(duì)象添加到常量池之中并放回其引用。額外說(shuō)
    下,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è)人比較傾向于這種寫(xiě)法。
            ss = ss.replaceAll("\\?""=");//正確,對(duì)“?”做轉(zhuǎn)義。

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

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


    2008年4月21日

    1.優(yōu)先使用primitive type
    2.不要使用Boolean作為返回值。
    3.在初始化所有變量之后再創(chuàng)建類的實(shí)例。
    4. 用URI代替URL,使用URI的create方法代替new。
    5. 注意使用inputsream的skip方法,此方法會(huì)返回實(shí)際跳過(guò)的長(zhǎng)度,最好自己監(jiān)聽(tīng)返回值。
    6. ?:運(yùn)算符會(huì)返回最大范圍的類型,如:true?new Intege(2): new Float(1.0);將會(huì)返回2.0.
    7. 盡量使用double,而不是float。

    posted @ 2008-04-21 19:24 遲來(lái)的兵 閱讀(223) | 評(píng)論 (0)編輯 收藏


    2008年4月10日

    1. interface來(lái)定義系統(tǒng)對(duì)外提供的服務(wù),有抽象類來(lái)做擴(kuò)展。盡量用interface作為參數(shù)類型。

    2. ThreadLocal類,定義了一個(gè)變量的本地副本,與原有變量隔離,作用類似static變量,只是不共享。可用set添加變量,get去獲取變量。變量類型不限制。

    3. Eclipse plug in開(kāi)發(fā)中可以實(shí)現(xiàn)IRuntimeClasspathProvider接口。可以提供用launch configuration去獲得unresolvedresolved classpath。開(kāi)發(fā)人員可以在resolveClasspath方法中加入自定義的classpath。實(shí)現(xiàn)類需要注冊(cè)在extension point中。

          /**

           *Computesandreturnsanunresolvedclasspathforthegivenlaunchconfiguration.

           *Variableandcontainerentriesarenotresolved.

           *

           *@paramconfigurationlaunchconfiguration

           *@returnunresolvedpath

           *@exceptionCoreExceptionifunabletocomputeapath

           */

          public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration configuration) throws CoreException;

         

          /**

           *Returnstheresolvedpathcorrespondingtothegivenpath,inthecontextofthe

           *givenlaunchconfiguration.Variableandcontainerentriesareresolved.Thereturned

           *(resolved)pathneednothavethesamenumberofentriesasthegiven(unresolved)

           *path.

           *

           *@paramentriesentriestoresolve

           *@paramconfigurationlaunchconfigurationcontexttoresolvein

           *@returnresolvedpath

           *@exceptionCoreExceptionifunabletoresolveapath

           */

          public IRuntimeClasspathEntry[] resolveClasspath(IRuntimeClasspathEntry[] entries, ILaunchConfiguration configuration) throws CoreException;

    A provider extension is defined in plugin.xml. Following is an example definition of a runtime classpath provider extension.

     <extension point="org.eclipse.jdt.launching.classpathProviders">
       <classpathProvider 
          id="com.example.ExampleClasspathProvider"
          class="com.example.ExampleClasspathProviderImpl"
       </classpathProvider>
     </extension>

    4. plug in 開(kāi)發(fā)中可以用JavaRuntime 去得到運(yùn)行環(huán)境的信息。        
    IRuntimeClasspathProvider provider = JavaRuntime
    .getClasspathProvider(configuration);

    其中configurationILaunchConfiguration類型的。

    4. Eclipse plug in開(kāi)發(fā)中獲取文件。兩種解決辦法:1.plug in實(shí)例中讀取文件的URL,然后用FileLocator把這個(gè)URL轉(zhuǎn)化成文件路徑;2.直接利用FileLocatorfind方法。

    方法1

                //filepath 是需要定位的文件

                String filepath = "/bin/resources/test.jar";

                //instance 是當(dāng)前plug in的實(shí)例

                URL url = instance.getBundle().getEntry(filepath);

                String path = null;

                try {

                      path = FileLocator.resolve(url).getPath();

                } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                }

                returnnew Path(path);

          }

    方法2

                String filepath = "/bin/resources/test.jar";

                URL url = FileLocator.find(instance.getBundle(),new Path(filepath),null);

                try {

                      path = FileLocator.resolve(url).getPath();

                } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                }

    5. 可以利用JarOutputStream來(lái)寫(xiě)jar包。必須為JarOutputStream 實(shí)例創(chuàng)建至少一個(gè)Entry,可以調(diào)用putNextEntry方法。

                Manifest mf = new Manifest();

                JarOutputStream jar = new JarOutputStream(new FileOutputStream("MainTest.jar")mf);

                Properties properties = new Properties();

                jar.putNextEntry(new ZipEntry("MainTest.property"));

                properties.store(jar, "this is a test");

                jar.close();

    6. 得到IJavaModle

          IJavaModel model = JavaCore.create(ResourcesPlugin.getWorkspace()

                                  .getRoot());

          IJavaProject[] projects = model.getJavaProjects();

          IPackageFragmentRoot[] roots = projects[i]                                          .getPackageFragmentRoots();

     然后可以依次得到對(duì)應(yīng)elements

    posted @ 2008-04-10 17:12 遲來(lái)的兵 閱讀(557) | 評(píng)論 (0)編輯 收藏


    2008年2月21日

      當(dāng)使用mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app來(lái)創(chuàng)建一個(gè)新項(xiàng)目時(shí),有時(shí)候會(huì)出現(xiàn)以下錯(cuò)誤:

    [INFO] Scanning for projects...
    [INFO] Searching repository for plugin with prefix: 'archetype'.
    [INFO]
    ----------------------------------------------------------------------------
    [INFO] Building Maven Default Project
    [INFO]    task-segment: [archetype:create] (aggregator-style)
    [INFO]
    ----------------------------------------------------------------------------
    。。。。。。。
    [INFO] Velocimacro : initialization complete.
    [INFO] Velocity successfully started.
    [INFO] [archetype:create]
    [INFO] Defaulting package to group ID: com.mycompany.app
    [INFO]
    ------------------------------------------------------------------------
    [ERROR] BUILD ERROR
    [INFO]
    ------------------------------------------------------------------------
    [INFO] Failed to resolve artifact.

    GroupId: org.apache.maven.archetypes
    ArtifactId: maven-archetype-quickstart
    Version: RELEASE

    Reason: Unable to determine the release version

    Try downloading the file manually from the project website.

    Then, install it using the command:
        mvn install:install-file -DgroupId=org.apache.maven.archetypes
    -DartifactId=maven-arch
    etype-quickstart \
            -Dversion=RELEASE -Dpackaging=jar -Dfile=/path/to/file

      org.apache.maven.archetypes:maven-archetype-quickstart:jar:RELEASE

     [INFO]
    ------------------------------------------------------------------------
    [INFO] For more information, run Maven with the -e switch
    [INFO]
    ------------------------------------------------------------------------
    [INFO] Total time: 1 second
    [INFO] Finished at: Tue Apr 17 07:08:50 MDT 2007
    [INFO] Final Memory: 4M/8M
    [INFO]
    ------------------------------------------------------------------------

            請(qǐng)注意紅色部分為錯(cuò)誤產(chǎn)生的根本原因,  由于maven還處于開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)方極有可能已經(jīng)更新某個(gè)plug-in的版本,但本地plug-in metadata沒(méi)有版本的信息或者沒(méi)有最新版本的信息,致使maven無(wú)法下載正確的版本。同時(shí)請(qǐng)注意藍(lán)色部分,這是提示的解決辦法。具體步驟如下:
        1.打開(kāi)網(wǎng)址:
    http://mirrors.ibiblio.org/pub/mirrors/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/
        2.選擇最新版本并且下載最新的“maven-archetype-quickstart-1.0-alpha-4.jar ”文件
        3.安裝這個(gè)archetype到maven本地倉(cāng)庫(kù)。使用命令如下:mvn install:install-file -DgroupId=org.apache.maven.archtypes -Dar
    tifactId=maven-archetype-quickstart -Dversion=1.0-alpha-4 -Dpackaging=jar -Dfile=c:\7000\maven\maven-archetype-quickstart-1.0-alpha-4.jar。注意-Dfile是剛下載的文件的路徑。
        現(xiàn)在在cmd中執(zhí)行mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app就可以創(chuàng)建新項(xiàng)目了。

    posted @ 2008-02-21 17:39 遲來(lái)的兵 閱讀(500) | 評(píng)論 (2)編輯 收藏

    使用mvn site命令能很方便的幫助開(kāi)發(fā)人員生產(chǎn)站點(diǎn),但有時(shí)使用這個(gè)命令會(huì)出現(xiàn)以下錯(cuò)誤:
    C:\7000\maven>mvn site
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven Default Project
    [INFO]    task-segment: [site]
    [INFO] ------------------------------------------------------------------------
    [INFO] ------------------------------------------------------------------------
    [ERROR] BUILD ERROR
    [INFO] ------------------------------------------------------------------------
    [INFO] The plugin 'org.apache.maven.plugins:maven-site-plugin' does not exist or
     no valid version could be found
    [INFO] ------------------------------------------------------------------------
    [INFO] For more information, run Maven with the -e switch
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: < 1 second
    [INFO] Finished at: Thu Feb 21 16:30:21 CST 2008
    [INFO] Final Memory: 1M/2M
    [INFO] ------------------------------------------------------------------------
    產(chǎn)生原因:由于maven還處于開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)方極有可能已經(jīng)更新某個(gè)plug-in的版本,但本地plug-in metadata沒(méi)有版本的信息或者沒(méi)有最新版本的信息,致使maven無(wú)法下載正確的版本。
    解決辦法如下:
    1.在 2.刪除原有的maven-metadata-central.xml并且重命名剛下載的maven-metadate.xml為maven-metadata-central.xml。
    3.再次使用mvn site,你會(huì)發(fā)現(xiàn)maven會(huì)到遠(yuǎn)程倉(cāng)庫(kù)下載最新的site plug-in和相關(guān)jars包。

    posted @ 2008-02-21 17:36 遲來(lái)的兵 閱讀(2152) | 評(píng)論 (4)編輯 收藏


    僅列出標(biāo)題  

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

    Copyright © 遲來(lái)的兵

    主站蜘蛛池模板: 热re99久久6国产精品免费| 亚洲一区二区三区免费视频| 四虎影视在线永久免费观看| 亚洲国产成人久久99精品| **实干一级毛片aa免费| 久久亚洲精品国产精品| 亚洲中文字幕久久无码| 久久久亚洲精华液精华液精华液| 久久久久国色AV免费观看性色 | 亚洲国产夜色在线观看| 中文字幕亚洲免费无线观看日本 | 99国产精品视频免费观看| 亚洲AV日韩AV高潮无码专区| 麻豆成人久久精品二区三区免费| 日产亚洲一区二区三区| 国产a视频精品免费观看| 亚洲色大成网站www| 又爽又高潮的BB视频免费看| 特级毛片爽www免费版| 亚洲AV无码精品色午夜在线观看| 亚洲邪恶天堂影院在线观看| 99久久99热精品免费观看国产| 亚洲色大成网站www永久| 免费无码又爽又刺激高潮的视频| 福利片免费一区二区三区| 亚洲精品无码mv在线观看网站| 777成影片免费观看| 亚洲youwu永久无码精品| 亚洲男人天堂2020| 久久午夜夜伦鲁鲁片无码免费| 亚洲国产成人91精品| 亚洲国产a级视频| 中文字幕免费观看| 亚洲aⅴ无码专区在线观看| 亚洲一区二区三区无码中文字幕| 131美女爱做免费毛片| 狠狠入ady亚洲精品| 久久久久久亚洲精品| 国产美女无遮挡免费网站| 久9热免费精品视频在线观看| 久久久久亚洲av毛片大|