使用JAVA套接字发送多个文件

时间:2013-08-01 15:24:03

标签: java sockets file-transfer

我想发送多个带套接字连接的文件。对于一个文件它完美地工作,但如果我尝试发送多个(一次一个)我得到一个Socket异常:

java.net.SocketException: socket closed

一般来说,我的连接是这样的:

  1. 服务器等待连接
  2. 客户端连接到服务器并发送对特定文件的请求(包含文件名的字符串)
  3. 服务器读取本地文件并将其发送到客户端
  4. 客户端发送另一个文件请求,并在第3点继续。
  5. “waiting-for-request”程序的run-Method看起来像这样:

        @Override
        public void run() {
            String message;
            try {
                while ((message = reader.readLine()) != null) {
    
                    if (message.equals(REQUESTKEY)) {
                        System.out.println("read files from directory and send back");
                        sendStringToClient(createCodedDirContent(getFilesInDir(new File(DIR))),socket);
                    } else if (message.startsWith(FILE_PREFIX)) {
    
                        String filename = message.substring(FILE_PREFIX.length());
                        try {
                            sendFile(new File(DIR+filename));
                        } catch(IOException e) {
                            System.err.println("Error: Could not send File");
                            e.printStackTrace();
                        }
                    } else {
                        System.out.println("Key unknown!");
                    }
                }
            } catch(Exception ex) {
    
                ex.printStackTrace();
            }
    

    和我的sendFile()方法如下所示:

        public void sendFile(File file) throws IOException {
            FileInputStream input = new FileInputStream(file);
            OutputStream socketOut = socket.getOutputStream();
    
            System.out.println(file.getAbsolutePath());
            int read = 0;
            while ((read = input.read()) != -1) {
                socketOut.write(read);
            }
            socketOut.flush();
    
            System.out.println("File successfully sent!");
    
            input.close();
            socketOut.close();
        }
    

    我认为问题在于socketOut.close()。不幸的是,该方法也关闭了套接字连接(进一步连接的问题)。但是,如果我忽略了这个结束,文件传输不正确:文件在客户端到达不完整。

    如何避免或解决此问题?或者甚至有更好的方法来传输多个请求的文件?

    谢谢

2 个答案:

答案 0 :(得分:1)

我稍微重写了您的发送文件方法,以便您可以发送多个文件,您需要将DataOutputStream传递给它并在发送完所有要发送的文件后关闭流。

阅读时,您应使用DataInputStream并调用long len = dis.getLong(),然后从流中读取len个字节,然后重复下一个文件。您可能会发现在开始时发送文件数很有用。

public void sendFile(File file, DataOutputStream dos) throws IOException {
    if(dos!=null&&file.exists()&&file.isFile())
    {
        FileInputStream input = new FileInputStream(file);
        dos.writeLong(file.getLength());
        System.out.println(file.getAbsolutePath());
        int read = 0;
        while ((read = input.read()) != -1)
            dos.writeByte(read);
        dos.flush();
        input.close();
        System.out.println("File successfully sent!");
    }
}

答案 1 :(得分:0)

您可以在客户端和服务器之间定义简单协议。在文件内容之前发送文件长度。使用DataOutputStream / DataInputStream发送/读取长度。不要在每个文件后关闭套接字。