java使用rmi传输大文件示例分享
为什么要用rmi
在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了rmi和java-sockets两种之间,其中rmi的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,反观java-sockets,虽然比较灵活,但需要自己规定服务器端和客户端之间的通信协议。比较麻烦,几经权衡,最终还是选择rmi来进行服务器-客户端通信
文件上传问题
在使用java-rmi的过程中,必然会遇到一个文件上传的问题,由于在rmi中无法传输文件流(比如rmi中的方法参数不能是fileinputstream之类的),那么我们只好选择一种折中的办法,就是先用fileinputstream将文件读到一个 byte数组中,然后把这个byte数组作为参数传进rmi的方法中,然后在服务器端将byte数组还原为outputstream,这样就能通过rmi 来传输文件了
这样做也有缺点,就是无法检验传输过来的数据的准确性。
下面我就一个实例来讲解一下
fileclient
package rmiupload;
import java.io.bufferedinputstream;
import java.io.file;
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.ioexception;
import java.net.malformedurlexception;
import java.rmi.naming;
import java.rmi.notboundexception;
import java.rmi.remoteexception;
public class fileclient {
public fileclient() {
// todo auto-generated constructor stub
}
public static void main(string[] args) {
try {
filedataservice filedataservice = (filedataservice) naming.lookup("rmi://localhost:9001/filedataservice");
filedataservice.upload("/users/neverdie/documents/test.mp4", new fileclient().filetobyte("/users/neverdie/music/test.mp4"));
} catch (malformedurlexception | remoteexception | notboundexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
//这个方法比较重要,通过这个方法把一个名为filename的文件转化为一个byte数组
private byte[] filetobyte(string filename){
byte[] b = null;
try {
file file = new file(filename);
b = new byte[(int) file.length()];
bufferedinputstream is = new bufferedinputstream(new fileinputstream(file));
is.read(b);
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
return b;
}
}
filedataservice
package rmiupload;
import java.net.url;
import java.rmi.remote;
import java.rmi.remoteexception;
public interface filedataservice extends remote{
//这里的filename应该是该文件存放在服务器端的地址
public void upload(string filename, byte[] file) throws remoteexception;
}
filedataservice_imp
package rmiupload;
import java.io.bufferedoutputstream;
import java.io.file;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.net.url;
import java.rmi.remoteexception;
import java.rmi.server.rmiclientsocketfactory;
import java.rmi.server.rmiserversocketfactory;
import java.rmi.server.unicastremoteobject;
public class filedataservice_imp extends unicastremoteobject implements filedataservice{
public filedataservice_imp() throws remoteexception {
}
@override
public void upload(string filename, byte[] filecontent) throws remoteexception{
file file = new file(filename);
try {
if (!file.exists())
file.createnewfile();
bufferedoutputstream os = new bufferedoutputstream(new fileoutputstream(file));
os.write(filecontent);
} catch (filenotfoundexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
; }
}
fileserver
package rmiupload;
import java.net.malformedurlexception;
import java.rmi.naming;
import java.rmi.remoteexception;
import java.rmi.registry.locateregistry;
public class fileserver {
filedataservice filedataservice;
public fileserver() {
try {
filedataservice = new filedataservice_imp();
locateregistry.createregistry(9001);
naming.rebind("rmi://localhost:9001/filedataservice", filedataservice);
} catch (remoteexception e) {
// todo auto-generated catch block
e.printstacktrace();
} catch (malformedurlexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
/**
* @param args
*/
public static void main(string[] args) {
new fileserver();
}
}
推荐阅读
-
Java使用Socket通信传输文件的方法示例
-
Java使用Socket通信传输文件的方法示例
-
php使用memcached简单示例分享 memcached java memcached官网 redis memcached 比较
-
java中GZIP压缩解压类的使用示例代码分享
-
java使用泛型实现栈结构示例分享
-
php使用memcached简单示例分享 memcached java memcached官网 redis memcached 比较
-
Java实现在访问者模式中使用反射的示例代码分享
-
java使用泛型实现栈结构示例分享
-
如何使用Java中的计数器解决一个人数增长问题的示例代码分享
-
java使用POI操作excel文件示例代码分享(图文)