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

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

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

    隨筆-46  評論-64  文章-2  trackbacks-0

    一、一些概念

    ????WebService技術(shù)現(xiàn)在幾乎無處不在,以前玩.NET的時候最開始接觸這個概念,C#語言對WebService近似原生性的支持使我們用C#可以非常迅速的開發(fā)出一個WebService,沒有任何復(fù)雜煩擾的步驟。
    ????后來沒有機會再在.Net Framework上面開發(fā),轉(zhuǎn)投了Java的懷抱,想要開發(fā)出一個WebService感覺比較,搞一堆命令生成一堆什么代碼,好不容易才能搭出來,嘗試一次之后終于還是放棄了,覺得麻煩。
    ????Java6.0出來之后對WebService也說原生支持了,所以再做畢業(yè)設(shè)計的時候想到體驗一下Java6.0的WebService,果然容易上手很多,易用。畢業(yè)設(shè)計把這個計算在內(nèi),智能設(shè)備+WebService可以作為系統(tǒng)應(yīng)用的一部分。

    ???開始代碼之前先大概說說我對這幾個概念的理解

    ????WebService 是分布式應(yīng)用程序組件,這么說可能太抽象,這其實以經(jīng)不是一個新的概念了,但是突然間要解釋這個名次還比較不容易。它其實是構(gòu)建在已有技術(shù)基礎(chǔ)上的一個概念,WebService的核心是xml、soap、wsdl等,客戶可以通過web請求的方式使用WebService?;蛘哒f得更通俗點就是服務(wù)提供商把他提供的服務(wù)發(fā)布到Internet上,然后客戶可以通過Internet使用這個服務(wù)。

    ????RMI這個東西上手也不那么容易,不過這個概念可以簡單點來理解,就是不同JVM之間通訊的一個手段,這里調(diào)用的是Java代碼。不同的JVM可以在不同的機器上或者是同一臺機器上。這個純Java的分布式應(yīng)用的一個典型的Solution. RMI技術(shù)和CORBA互為補充。
    ???
    ???對于CORBA我沒有詳細學(xué)習(xí)過,不過概念很容易懂,CORBA 允許應(yīng)用程序和其他的應(yīng)用程序通訊,而不論他們在什么地方或者由誰來設(shè)計。CORBA和語言實現(xiàn)是無關(guān)的,C++和Java實現(xiàn)的系統(tǒng)通過CORBA通信。EMA里面就有這個CORBA。

    二、協(xié)作的需求模型

    ????下面切入正題,說說WebService和RMI的協(xié)作。我們先來看這個需求的模型是怎么樣的。看下圖
    ??????????????????????????????? WebService + RMI 協(xié)作.png
    ?
    ???系統(tǒng)要求有Smart device對遠程的JVM2里的程序控制,所以我們引入了WebService,通過WebService間接調(diào)用JVM2里的東西,WebSerivce本身運行在JVM1,JVM1和JVM2可以在不同機器上,這里demo程序是在一臺機器上運行的。
    ???WebService在這里既是SmartDevice的Server端,又是RMI的Client端。RMI的Server端在JVM2的App里作為一部分服務(wù)存在。

    三、代碼分解,下面我們開始demo這個協(xié)作的代碼

    3.1 首先我們抽象一個RMI的Interface

    package ?cn.heapstack.rmi.interfaces;

    import ?java.rmi.Remote;
    import ?java.rmi.RemoteException;
    import ?java.util.Date;

    public ? interface ?IBridge? extends ?Remote
    {
    ????
    public ?Date?getDate()? throws ?RemoteException;
    ????
    ????
    public ?String?getOtherInfo()? throws ?RemoteException;
    }

    簡單的接口,一個是獲得時間的,一個是獲取隨便什么消息的接口

    3.2實現(xiàn)RMI的Server端

    package ?cn.heapstack.rmi.server;

    import ?java.rmi.RemoteException;
    import ?java.rmi.server.UnicastRemoteObject;
    import ?java.util.Date;

    import ?cn.heapstack.rmi.interfaces.IBridge;

    public ? class ?BriderImpl? extends ?UnicastRemoteObject? implements ?IBridge
    {

    ????
    protected ?BriderImpl()? throws ?RemoteException
    ????
    {
    ????????
    super ();
    ????}


    ????
    private ? static ? final ? long ?serialVersionUID? = ? - 2194578051853930272L ;

    ????
    public ?Date?getDate()? throws ?RemoteException
    ????
    {
    ????????
    return ? new ?Date( 2008 , 5 , 10 );
    ????}


    ????
    public ?String?getOtherInfo()? throws ?RemoteException
    ????
    {
    ????????
    return ? " This?is?the?message?from?the?jvm,?path?info:? " ? + ?BriderImpl. class .getResource( " / " ).getPath();
    ????}


    }

    ?

    package ?cn.heapstack.rmi.server;


    import ?java.rmi.Naming;
    import ?java.rmi.registry.LocateRegistry;

    import ?cn.heapstack.rmi.interfaces.IBridge;

    public ? class ?RmiServer?
    {

    ????
    public ? static ? void ?main(String[]?args)
    ????
    {
    ?????????
    try ???
    ??????????
    {????
    ?????????????LocateRegistry.createRegistry(
    1099 );????
    ?????????????IBridge?bridge?
    = ? new ?BriderImpl();
    ?????????????Naming.rebind(
    " bridge " ,?bridge);????
    ?????????????
    ?????????????System.out.println(
    " RMI?Server?is?ready. " );
    ??????????}
    ????
    ??????????
    catch ?(Exception?e)????
    ??????????
    {????
    ?????????????System.out.println(
    " RMI?Server?failed:? " ? + ?e);????
    ??????????}
    ????

    ????}

    }



    3.3我們可以先寫個RMI的Client測試一下
    package ?cn.heapstack.rmi.client;

    import ?java.rmi.Naming;

    import ?cn.heapstack.rmi.interfaces.IBridge;

    public ? class ?RmiClient
    {

    ????
    /**
    ?????*?
    @param ?args
    ?????
    */

    ????
    public ? static ? void ?main(String[]?args)
    ????
    {
    ????????IBridge?bridge;
    ????????
    try
    ????????
    {
    ????????????bridge?
    = ?(IBridge)?Naming.lookup( " bridge " );
    ????????
    ????????
    ????????????System.out.println(?bridge.getDate()?);
    ????????}

    ????????
    catch (Exception?e)
    ????????
    {
    ????????????e.printStackTrace();
    ????????}


    ????}


    }


    ??????由于在本機上,省略了ip什么的,如果對這段代碼不是很懂,建議看后面的參考資料
    ??????測試方法,先運行Server,再運行Client,不出以外,你能看到2008年5月10號。

    3.4我們開始實現(xiàn)我們的WebService Server端
    ??????Java6.0實現(xiàn)WebService也很簡單,我直接貼代碼了。Server端如下,如果不太懂,還是建議看后面的參考資料
    package?cn.heapstack.ws.server;

    import?java.net.MalformedURLException;
    import?java.rmi.Naming;
    import?java.rmi.NotBoundException;
    import?java.rmi.RemoteException;
    import?java.util.Date;

    import?javax.jws.WebMethod;
    import?javax.jws.WebService;
    import?javax.jws.soap.SOAPBinding;

    import?cn.heapstack.rmi.interfaces.IBridge;

    @WebService(targetNamespace?
    =?"http://www.heapstack.cn/ws/MyTimeServer")
    @SOAPBinding(style?
    =?SOAPBinding.Style.RPC)
    public?class?MyTimeServer
    {

    ????
    ????@WebMethod
    ????
    public?String?getServerTime()
    ????
    {
    ????????
    //通常的做法
    ????????
    //return?new?Date(System.currentTimeMillis()).toString();
    ????????
    ????????
    //這里我想要調(diào)用RMI,取得另一個JVM中程序調(diào)用的結(jié)果,當(dāng)然這個JVM可以在兩外一臺機器上運行
    ????????
    //這里WebService的Server?其實是RMI的?Client
    ????????Date?date?=?null;
    ????????
    try
    ????????
    {
    ????????????IBridge?bridge?
    =?(IBridge)?Naming.lookup("bridge");
    ????????????date?
    =?bridge.getDate();
    ????????????
    return?date.toString();
    ????????}

    ????????
    catch(Exception?e)
    ????????
    {
    ????????????e.printStackTrace();
    ????????}

    ????????
    return?null;

    ????????
    ????}


    }

    發(fā)布WebService
    package?cn.heapstack.ws.server;

    import?javax.xml.ws.Endpoint;

    import?cn.heapstack.ws.server.MyTimeServer;
    public?class?Main
    {

    ????
    public?static?void?main(String[]?args)
    ????
    {
    ????????Endpoint.publish(
    "http://localhost:8435/MyTimeServer",?new?MyTimeServer());
    ????}


    }


    3.6實現(xiàn)WebService的客戶端
    ??????首先cd到src目錄,然后敲wsimport -keep http://localhost:8435/MyTimeServer?wsdl這個會自動生成一堆代碼,基本上可以理解為stub一類的東西
    ??????然后我們就可以直接調(diào)用啦
    package?cn.heapstack.ws.client;

    import?cn.heapstack.ws.mytimeserver.*
    ;

    public?class
    ?WSClient
    {

    ????
    /**
    ?????*?
    @param?args
    ?????
    */

    ????
    public?static?void?main(String[]?args)
    ????
    {
    ????????
    //自動生成的代碼????WebService的Stub

    ????????MyTimeServerService?ws?=?new?MyTimeServerService();
    ????????
    //自動生成的代碼????WebService的實例類

    ????????MyTimeServer?service?=?ws.getMyTimeServerPort();
    ????????
    //調(diào)用WebService,WebSerivce會調(diào)用RMI的方法獲得返回結(jié)果

    ????????String?date?=?service.getServerTime();
    ????????System.out.println(
    "WS?Client?get:"+
    ?date?);

    ????}

    }


    到此為止,這個WebService和RMI的協(xié)作完成了,代碼盡量精簡了

    參考資料:
    ??????JAVA RMI 實例-damies -JavaEye技術(shù)社區(qū),? RMI的入門資料,很容易看懂
    ??????交口稱贊?blog中 關(guān)于java 6.0?WebService的部分,也是很好的新手學(xué)習(xí)資料
    ??????
    posted on 2007-03-31 21:27 jht 閱讀(3687) 評論(3)  編輯  收藏 所屬分類: J2SE

    評論:
    # re: 使用WebService 和RMI遠程協(xié)作 2012-03-08 10:57 | try_lin
    測試rmi注冊時 報錯
    java.rmi.StubNotFoundException: Stub class not found: server.TaskRemoteImp_Stub; nested exception is:
    java.lang.ClassNotFoundException: server.TaskRemoteImp_Stub
    at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:98)
    at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:55)
    at sun.rmi.server.UnicastServerRef.setSkeleton(UnicastServerRef.java:179)
    at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:142)
    at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:129)
    at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:275)
    at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:178)
    at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:75)
    at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:61)
    at server.TaskRemoteImp.<init>(TaskRemoteImp.java:13)
    at rmiMain.main(rmiMain.java:16)
    Caused by: java.lang.ClassNotFoundException: server.TaskRemoteImp_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    at sun.rmi.server.RemoteProxy.loadClassFromClass(RemoteProxy.java:191)
    at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:93)
    ... 10 more
    Exception in thread "main"

    報錯 。。。。。。。。
    和你的寫法一致 jdk1.4


    怎么解決呢??  回復(fù)  更多評論
      
    # re: 使用WebService 和RMI遠程協(xié)作 2012-03-08 10:58 | try_lin
    請把解決方案發(fā)我郵箱號碼 try_lin@sina.cn
      回復(fù)  更多評論
      
    # re: 使用WebService 和RMI遠程協(xié)作 2013-12-10 15:37 | 11
    實現(xiàn)類沒有找到  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲国产成人久久精品动漫| 日本特黄a级高清免费大片| 久久av免费天堂小草播放| 猫咪免费观看人成网站在线| 亚洲国产精品无码久久九九大片| 亚洲人成77777在线播放网站不卡| 久久精品国产亚洲av影院| 亚洲黄色三级网站| 中文字幕亚洲色图| 亚洲精彩视频在线观看| 亚洲精品日韩专区silk| 亚洲精品国产福利片| 亚洲免费在线视频观看| 亚洲中文字幕无码一去台湾 | 91精品免费不卡在线观看| 成全视频高清免费观看电视剧| 四虎国产精品免费永久在线| 国产在线观看免费视频软件| 男人j进入女人j内部免费网站| 色欲A∨无码蜜臀AV免费播| 四虎最新永久免费视频| 免费中文熟妇在线影片 | 国产日韩精品无码区免费专区国产| 四虎精品成人免费视频| 三年片免费观看大全国语| 久久免费高清视频| 嫖丰满老熟妇AAAA片免费看| 在线观看免费为成年视频| 免费看小12萝裸体视频国产| 国产亚洲情侣一区二区无| 亚洲av无码乱码国产精品fc2 | 四虎影视免费永久在线观看| 亚洲日韩国产成网在线观看| 亚洲AV无码一区二区三区DV| 亚洲视频一区在线| 亚洲国产精华液2020| 国产激情久久久久影院老熟女免费 | 日韩电影免费在线观看视频| 精品亚洲一区二区三区在线播放| 亚洲av无码无在线观看红杏| 亚洲日本久久一区二区va|