当前位置: 移动技术网 > IT编程>开发语言>Java > java使用rmi传输大文件示例分享

java使用rmi传输大文件示例分享

2019年07月22日  | 移动技术网IT编程  | 我要评论

为什么要用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();

        }

    }
   

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网