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();
}
}
}
흥미로운 접근 방식. 이 문제를 해결할 수 없다면 파일을 바이트 배열로로드 한 다음이를 인수로 사용하여 서버 메소드를 호출하십시오. –
나는 그것이 효과가 없을 것이라고 affraid입니다. 이 RMI 응용 프로그램의 주된 목적은 대용량 파일을 보내는 것입니다. 서버 메소드가 구현 된 방법을 보여주기 위해 항목을 편집했습니다. – ColdAsDomino