2013-10-29 66 views
2

即使我將它從RMIIO library中包裝到SimpleRemoteInputStream中,我也無法將FileInputStream發送到RMI服務器。這是我所得到的,當我嘗試運行客戶端應用程序:無法通過RMI傳遞文件

Client started 
SENDING FILE: file.pdf 
paź 29, 2013 1:13:24 PM com.healthmarketscience.rmiio.exporter.RemoteStreamExporter getInstance 
INFO: Using stream exporter com.healthmarketscience.rmiio.exporter.DefaultRemoteStreamExporter 

這是客戶端應用程序:

import java.io.IOException; 
import java.rmi.Naming; 
import java.rmi.RMISecurityManager; 
import java.rmi.Remote; 
import com.healthmarketscience.rmiio.SimpleRemoteInputStream; 

import pl.opa.backuper_common.FileServer; 

public class TestClient { 
    public static void main(String[] args) { 

     System.setSecurityManager(new RMISecurityManager()); 
     String fileName = "file.pdf"; 
     System.out.println("Client started"); 

     try { 
      Remote remote = Naming.lookup("FileServer"); 
      FileServer server = null; 
      if(remote instanceof FileServer) 
       server = (FileServer) remote; 

      System.out.println("SENDING FILE: " + fileName); 
      SimpleRemoteInputStream istream = new SimpleRemoteInputStream(new FileInputStream(fileName)); 
      server.sendFile(istream.export()); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

服務器方法實現:

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

import com.healthmarketscience.rmiio.RemoteInputStream; 
import com.healthmarketscience.rmiio.RemoteInputStreamClient; 

import pl.opa.backuper_common.FileServer; 

public class FileServerImpl extends UnicastRemoteObject implements FileServer { 

    private static final long serialVersionUID = 1L; 

    protected FileServerImpl() throws RemoteException { 
     super(); 
    } 

    @Override 
    public void sendFile(RemoteInputStream data) throws IOException, RemoteException { 
     InputStream input = null; 
     try { 
      input = RemoteInputStreamClient.wrap(data); 
      writeToFile(input); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (input != null) { 
       input.close(); 
      } 
     } 
    } 

    private void writeToFile(InputStream stream) throws IOException { 
     FileOutputStream output = null; 

     try { 
      File file = File.createTempFile("data", ".dat"); 
      output = new FileOutputStream(file); 
      int chunk = 4096; 
      byte [] result = new byte[chunk]; 

      int readBytes = 0; 
      do { 
       readBytes = stream.read(result); 
       if (readBytes >= 0) 
        output.write(result, 0, readBytes); 
      } while(readBytes != -1); 

      output.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally{ 
      if(output != null) 
       output.close(); 
     } 
    } 
} 
+0

有趣的方法。如果你無法使它工作,解決方法是將文件加載到一個字節數組中,然後調用一個服務器方法作爲參數。 –

+0

我很害怕它不會工作。這個RMI應用程序的主要目的是發送大文件。我編輯了我的條目,向您展示如何實現服務器方法。 – ColdAsDomino

回答

1

我的猜測是對這個代碼服務器端是錯的:

if (readBytes == -1) 
    output.write(result, 0, readBytes); 

那應該是:

if (readBytes > 0) 
    output.write(result, 0, readBytes); 
+0

你說得對,我修好了。不幸的是,我仍然得到同樣的錯誤。 – ColdAsDomino

+2

你會得到什麼錯誤?你的問題沒有錯誤。 –

+0

嗯我的壞,我認爲這是一個錯誤的紅色信息。一切工作正常,謝謝! – ColdAsDomino