Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java套接字使用IOUtils.copy传输文件_Java_Sockets_Distributed Computing - Fatal编程技术网

如何通过Java套接字使用IOUtils.copy传输文件

如何通过Java套接字使用IOUtils.copy传输文件,java,sockets,distributed-computing,Java,Sockets,Distributed Computing,我目前正在使用Java套接字。我已经创建了一个服务器端代码和客户端代码来通过套接字传输文件。我已经在同一个系统中成功地将文件从客户端传输到服务器,但是如果我在不同的平台上尝试使用不同的系统,那么它就不起作用了。下面给出了服务器端和客户端代码 服务器端代码 public class FileTransferTestServer extends Thread{ private final Socket socket; public FileTransferTestServer(S

我目前正在使用Java套接字。我已经创建了一个服务器端代码和客户端代码来通过套接字传输文件。我已经在同一个系统中成功地将文件从客户端传输到服务器,但是如果我在不同的平台上尝试使用不同的系统,那么它就不起作用了。下面给出了服务器端和客户端代码

服务器端代码

public class FileTransferTestServer extends Thread{

    private final Socket socket;

    public FileTransferTestServer(Socket socket) {
        // TODO Auto-generated constructor stub
        this.socket = socket;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            ServerSocket serverSocket = new ServerSocket(5000);
            Socket socket = serverSocket.accept();
            System.out.println("Connection Established with "+socket.getInetAddress().getHostAddress());
            new FileTransferTestServer(socket).start();
            serverSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run(){
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String buffer = null;
            String fileName = null;

            if((buffer = br.readLine()) != null){
                fileName = buffer;
            }

            FileOutputStream fos = new FileOutputStream(fileName);
            int res = IOUtils.copy(is, fos);
            System.out.println("res : "+res);
            is.close();
            fos.flush();fos.close();
            br.close();


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
客户端代码

public class FileTransferClient {

    public FileTransferClient() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            Socket socket = new Socket("172.16.4.23",5000);
            File file = new File("/Users/Guest/Desktop/DQM.txt");
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter out = new PrintWriter(outputStream);
            out.println("file-transfer");
            out.flush();
            out.println(""+file.getName());
            out.flush();
            FileInputStream fis = new FileInputStream(file);
            int res = IOUtils.copy(fis, outputStream);
            out.flush();
            outputStream.flush();
            outputStream.close();
            fis.close();
            System.out.println("res : "+res);
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
如何使本程序在系统之间传输文件

我试过Windows(服务器)和Mac OS X(客户端)以及Windows(服务器)和LinuxMint(客户端)

注: 1.我想发送文件名,后跟文件内容。
2.文件内容可以是任何形式(文本或二进制文件)

除非您真的知道自己在做什么,否则不能在同一个流中混合测试和二进制文件。在这种情况下,BufferedReader假定从现在起您将只使用此读取器,并且它可以读取尽可能多的可用数据。这意味着它可以读取您打算用于该文件的数据

我建议您使用DataInput/OutputStream,并且仅此而已。您可以对文本使用writeUtf/readUTF

Socket socket = new Socket("172.16.4.23",5000);
String pathname = "/Users/Guest/Desktop/DQM.txt";
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
outputStream.writeUTF(pathname);
FileInputStream fis = new FileInputStream(pathname);
int res = IOUtils.copy(fis, dos);
fis.close();
dos.close();
socket.close();
阅读

DataInputStream dis = new DataInputStream(socket.getInputStream());
String fileName = dis.readUTF();
FileOutputStream fos = new FileOutputStream(fileName);
int res = IOUtils.copy(dis, fos);
fos.close();
socket.close();
是的,它起作用了:)。谢谢