欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-21 08:07:04
为什么要用rmi​在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了rmi和java-sockets两种之间...

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

        }

    }