簡體   English   中英

Java遠程方法調用

[英]Java Remote method invocation

如果我從不同位置的客戶端調用此服務器方法,則會出現以下錯誤。如果我從服務器所在的相同位置運行客戶端,則會得到輸出。

請提供一些解決方案,以從不同位置使用rmi客戶端調用我的rmi服務器。

Error
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: com.transform.xsl.XslFoTransformer_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:101)
    at com.transform.xsl.RmiClient.main(RmiClient.java:15)
Caused by: java.lang.ClassNotFoundException: com.transform.xsl.XslFoTransformer_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:394)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:184)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:222)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    ... 3 more

代碼======

import java.io.File;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface XslFoTransformerInterface extends Remote {
    public byte[] doTransform(File stylesheet, File datafile) throws Throwable,RemoteException;

}

public class XslFoTransformer extends UnicastRemoteObject  implements XslFoTransformerInterface {

    protected XslFoTransformer() throws RemoteException {
        super();

    }

    public byte[] doTransform(File stylesheet, File datafile) throws Exception {

        String fileName = datafile.getName();
        int pos = fileName.lastIndexOf(".");
        if (pos > 0) {
            fileName = fileName.substring(0, pos);

        }
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        File file = new File(fileName + ".xsl-fo");
        try {
            // File stylesheet = new
            // File("C:\\Users\\Q811213\\Documents\\XSLT\\files\\ECGSearchResultsPDF_changed1.xsl");
            // File datafile = new
            // File("C:\\Users\\Q811213\\Documents\\XSLT\\files\\NEWDATA.xml");
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(datafile);
            TransformerFactory tFactory = TransformerFactory.newInstance();
            StreamSource stylesource = new StreamSource(stylesheet);
            Transformer transformer = tFactory.newTransformer(stylesource);
            DOMSource source = new DOMSource(document);
            ByteArrayOutputStream bos=new ByteArrayOutputStream();
            StreamResult result=new StreamResult(bos);
            transformer.transform(source, result);
             byte [] array=bos.toByteArray();


        return array;
        } catch (Exception e) {
            throw e;
        }}}


--Rmi server class


public class RmiServer {
    public static void main(String args[]) throws Exception{  
        try{  


        XslFoTransformerInterface stub=new XslFoTransformer();  
        Naming.rebind("rmi://localhost:1099/Xsl-Fo_Transform",stub);  
        }catch(Exception e){
            throw e;

        }  
        }  

}


--Rmi client created in different location



public class RmiClient {
    public static void main(String args[]) throws Throwable {
        try {
            XslFoTransformerInterface stub = (XslFoTransformerInterface) Naming
                    .lookup("rmi://localhost:1099/Xsl-Fo_Transform");
            System.out.println("stub is ready" + stub);
            File f1 = new File(
                    "C:\\Users\\s811213\\osbwstest\\XSL-FO_Transformer\\files\\ECGSearchResultsPDF_changed1.xsl");
            File f2 = new File(`enter code here`
                    "C:\\Users\\s811213\\osbwstest\\XSL-FO_Transformer\\files\\NEWDATA.xml");
            try {
                byte[] f = stub.doTransform(f1, f2);
                }cartch(){}

}}

如果我從不同位置的客戶端調用此服務器方法,則會出現以下錯誤。如果我從服務器所在的相同位置運行客戶端,則會得到輸出。 請提供一些解決方案,以從不同位置使用rmi客戶端調用我的rmi服務器。

您需要將異常中命名的存根類部署到客戶端。

在RMI客戶端中

XslFoTransformerInterface存根=(XslFoTransformerInterface)命名.lookup(“ rmi:// localhost:1099 / Xsl-Fo_Transform”);

您需要將localhost更改為服務器ip

我不確定您是否在其他位置(沒有服務器計算機)運行程序,並且使用localhost硬編碼的ip代碼的更新版本。

如果這不是問題,則必須確保將XslFoTransformerInterface類放在客戶端代碼中,與服務器代碼中的包相同

同樣在將來,如果您有一些Serializable POJO類作為參數或遠程方法的返回類型,則對它們應用相同的規則。 始終將它們與服務器代碼放在相同的包裝中。

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM