将文件从客户端复制到服务器 [英] Copying a File from Client to Server

查看:90
本文介绍了将文件从客户端复制到服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试使用Java将文件从客户端复制到服务器,

I'm trying to copy a file from Client to Server, in Java, like so:

客户端:

Client:

public class Client {

    public static void main(String[] args) throws Exception {
        String fileName = "D:\\6282.mp3";

        try {

        } catch (Exception e) {
            Scanner scanner = new Scanner(System.in);
            String file_name = fileName;

            File file = new File(file_name);
            Socket socket = new Socket("localhost", 3332);
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

            oos.writeObject(file.getName());

            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[Server.BUFFER_SIZE];
            Integer bytesRead = 0;

            while ((bytesRead = fis.read(buffer)) > 0) {
                oos.writeObject(bytesRead);
                oos.writeObject(Arrays.copyOf(buffer, buffer.length));
            }

            oos.close();
            ois.close();
            System.exit(0);
        }

    }

}

服务器:

Server:

public class Server extends Thread {

    public static final int PORT = 3332;
    public static final int BUFFER_SIZE = 626;

    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);

            while (true) {
                Socket s = serverSocket.accept();
                saveFile(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void saveFile(Socket socket) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        FileOutputStream fos = null;
        byte[] buffer = new byte[BUFFER_SIZE];

        // 1. Read file name.  
        Object o = ois.readObject();

        if (o instanceof String) {
            fos = new FileOutputStream(o.toString());
        } else {
            throwException("Something is wrong");
        }

        // 2. Read file to the end.  
        Integer bytesRead = 0;

        do {
            o = ois.readObject();

            if (!(o instanceof Integer)) {
                throwException("Something is wrong");
            }

            bytesRead = (Integer) o;

            o = ois.readObject();

            if (!(o instanceof byte[])) {
                throwException("Something is wrong");
            }

            buffer = (byte[]) o;

            // 3. Write data to output file.  
            fos.write(buffer, 0, bytesRead);

        } while (bytesRead == BUFFER_SIZE);

        System.out.println("File transfer success");

        fos.close();

        ois.close();
        oos.close();
    }

    public static void throwException(String message) throws Exception {
        throw new Exception(message);
    }

    public static void main(String[] args) {
        new Server().start();
    }
}

当我跑步时,我得到:

run:
BUILD SUCCESSFUL (total time: 0 seconds)

但什么也没有发生。这是我第一次在Client-Server上,我不确定自己要怎么做。

but nothing really happens. This is my first at Client-Server and I'm not sure what I'm getting wrong.

请帮助。谢谢。

推荐答案

代码中的一些问题是:

对于客户端,您已将整个代码编写在catch块中,除非发生异常,否则该代码将不起作用。

For the client ,you have written the entire code in the catch block, which will not work unless an exception occurs.

您正在尝试在此处传递文件名

You are trying to pass the name of the file here instead of the file.

oos.writeObject(file.getName());

oos.writeObject(file.getName());

您需要运行服务器,然后是客户端。
是示例工作代码:

You need to run the server, then the client. here is a sample working code:

客户:

public class Client {

    public static void main(String[] args) throws Exception {
        String fileName = "C:\\2048.jpg";

        try {
            File file = new File(fileName);
            Socket socket = new Socket("localhost", 3332);
            byte[] mybytearray = new byte[(int) file.length()];
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = socket.getOutputStream();
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            os.close();
        } catch (Exception e) {
        }

    }
}

服务器:

public class Server extends Thread {

    public static final int PORT = 3332;
    public static final int BUFFER_SIZE = 626;

    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            while (true) {
                Socket s = serverSocket.accept();
                saveFile(s);
            }
        } catch (Exception e) {
        }
    }

    private void saveFile(Socket socket) throws Exception {
        InputStream ois = socket.getInputStream();
        FileOutputStream fos = new FileOutputStream("C:\\2049.jpg");;

        byte[] mybytearray = new byte[1024];
        System.out.println("Reading file from server...");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int bytesRead;
        while ((bytesRead = ois.read(mybytearray)) != -1) {
            bos.write(mybytearray);
        }

        bos.close();
        System.out.println("Writing file complete...");

    }

    public static void main(String[] args) {
        new Server().start();
    }
}

这篇关于将文件从客户端复制到服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆