我昨天尝试用我的系统作为远程服务器和使用Ubuntu 14.04的客户端系统与我的客户端进行通信。
代码是关于通过将File引用传递给客户端并使用引用下载它的客户端从Sever到客户端的文件传输。我们通过局域网相互连接,我们能够成功地ping对方的IP(我的--- 10.0.0.2和他的--- 10.0.0.1)。
但是,当我在CentOS Linux上使用rmiregistry &
运行此代码,然后在我的系统上运行Server Side类时,他运行java Client类,我们的连接已经完成,但是,我们无法将文件从我的系统传递到他的系统......
抛出的异常是: -
java.io.FileNotFoundException at Java_Client_1 --- File in = u1.Uploads();
// I have printed the comment on the line having error in the class Java_client_1 class' `main()` method.
驻留在客户端和服务器上的公共接口: -
import java.io.*;
import java.rmi.*;
public interface Upload_1 extends Remote {
File Uploads() throws RemoteException;
}
客户类代码: -
import java.io.*;
import java.rmi.*;
import java.rmi.registry.*;
public class Java_Client_1 {
public static void main(String[] args) {
try{
Registry registry=LocateRegistry.getRegistry("10.0.0.2",2000);
Upload_1 u1=(Upload_1)registry.lookup("Uploading");
//File in=new File("/home/ssuman/Public/KALI_LINUX/MyFavourite","something.mp4");
File out=new File("/home/asad/Music","tymaPaulMultithreaded.mp4");
System.out.println("Transferring File---Please be Patient...\n");
File in = u1.Uploads(); // exception thrown here,please check...
FileInputStream fis = new FileInputStream(in);
FileOutputStream fos = new FileOutputStream(out);
byte[] buf = new byte[4096];
int i = 0;
while ((i = fis.read(buf)) != -1) {
fos.write(buf, 0, i);
}
if (fis != null) fis.close();
if (fos != null) fos.close();
System.out.println("File Successfully Transferred...");
System.out.println("Congratulations,RMI is working successfully!!!");
}
catch(Exception e){
e.printStackTrace();
}
}
}
服务器端实施者类: -
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
public class Java_Uploader_1 extends UnicastRemoteObject implements Upload_1 {
public Java_Uploader_1() throws RemoteException{ }
@Override
public File Uploads() throws RemoteException{
File in = new File("/home/ssuman/Public/KALI_LINUX/MyFavourite","something.mp4");
return in;
}
}
服务器类代码: -
import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Java_Server_1 {
public static void main(String[] args) {
try{
Registry registry= LocateRegistry.createRegistry(2000);
System.out.println("Ahh,Server Finally Started---GO,GO,GO...\n");
Java_Uploader_1 ju1=new Java_Uploader_1();
registry.rebind("Uploading",ju1);
System.out.println("Service Bound...");
}
catch(Exception e){
System.out.println("An error occured trying to bind the object to the registry.\n"+e);
}
}
}
我的问题: -
请帮助解决此问题或任何让远程客户端下载我系统上存在的文件的替代方法。并且,是的,我希望所有这些都是使用Java RMI完成的,而不是来自CORBA或任何其他技术。提前感谢所有评论员并回答海报。
答案 0 :(得分:3)
您必须传输文件的内容。 为此,您必须更改远程接口签名:
public interface Upload_1 extends Remote {
void upload(byte[] content) throws RemoteException;
}
客户端发送一个包含文件内容的字节数组,服务器接收并写入磁盘。
问题是当你使用大文件时,javavm会抛出OOME,所以你必须通过RMI模拟流式传输。
另一种选择是使用现有的库,看看http://openhms.sourceforge.net/rmiio/
答案 1 :(得分:1)
File
本质上是本地文件系统上文件 name 的包装。
没有理由认为它对远程同伴意味着什么。
您需要发送内容,而不仅仅是名称。