2013-10-29 1 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

나는 그것이 효과가 없을 것이라고 affraid입니다. 이 RMI 응용 프로그램의 주된 목적은 대용량 파일을 보내는 것입니다. 서버 메소드가 구현 된 방법을 보여주기 위해 항목을 편집했습니다. – ColdAsDomino

답변

1

내 생각 엔가에이 코드 서버 쪽이 잘못되었습니다 :

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

그게 아마되어야합니다 :

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

네 말이 맞아, 고쳐 놨어. 불행히도 나는 여전히 같은 오류가 발생하고 있습니다. – ColdAsDomino

+2

어떤 오류가 발생합니까? 질문에 오류가 없습니다. –

+0

음, 내 붉은 색의 메시지를 오류로 생각했다. 모든 것이 잘 작동합니다. 감사합니다! – ColdAsDomino