简体   繁体   English

Java-无法写入第二个文件

[英]Java - cannot write to a second file

I've been having some trouble trying to send a file from a server to a client. 我一直在尝试将文件从服务器发送到客户端时遇到麻烦。 I can't seem to send the same file from the server to the client into two SEPERATE files. 我似乎无法将同一文件从服务器发送到客户端,变成两个SEPERATE文件。 Instead, it just appends to the end of the first file! 相反,它只是追加到第一个文件的末尾! Any help would be appreciated. 任何帮助,将不胜感激。

EDIT : I've modified the code. 编辑:我已经修改了代码。 I've modularized the file sending and recieving tasks into 2 functions 'sendfile' and 'recievefile'. 我已经将文件发送和接收任务模块化为两个函数“ sendfile”和“ recevefile”。 The error I'm getting now is that the socket is closed at the sendfile and recievefile functions after the second call. 我现在得到的错误是在第二次调用后,套接字在sendfile和recevefile函数处关闭。 But all I'm closing is the file and the output and input streams! 但是我要关闭的只是文件以及输出和输入流! Perhaps closing those streams will close the socket too...? 也许关闭这些流也会关闭套接字...? Anyways, I've tried NOT closing the input and output streams and what happens is - 1)nothing gets transferred to the destination file. 无论如何,我尝试不关闭输入和输出流,而发生的事情是-1)没有任何内容传输到目标文件。 So I just get a blankly created file at the server end. 所以我只是在服务器端得到一个空白创建的文件。 2)The second file doesn't even get created. 2)第二个文件甚至都没有创建。 Great. 大。

Any help would, as usual, be appreciated. 与往常一样,任何帮助将不胜感激。

Server: 服务器:

package com.http.server;
import java.io.*;
import java.net.*;

public class Server
{
    public static void main(String args[])throws Exception
    {
        System.out.println("Server running...");

        /* Listen on port 5555 */

        ServerSocket server = new ServerSocket(5555);

        /* Accept the sk */

        Socket sk = server.accept();

        System.out.println("Server accepted client");


        BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));

        /* Read the filename */
        String serverlocation = "C:/Users/Arjun/Desktop/CNW model/HTTP Website/";
        String filename = serverlocation + inReader.readLine();
        if ( !filename.equals("") ){

            /* Reply back to client with READY status */

            outReader.write("READY\n");
            outReader.flush();          
        }

        sendfile(sk, filename);
        sendfile(sk, filename);

        outReader.close();
        inReader.close();


        sk.close();
        server.close();

    }

    public static void sendfile(Socket sk, String filename)
    {
        try{

            OutputStream output = sk.getOutputStream();

        FileInputStream file = new FileInputStream(filename);

        byte[] buffer = new byte[sk.getSendBufferSize()];

        int bytesRead = 0; 

        while((bytesRead = file.read(buffer))>0)
        {
            output.write(buffer,0,bytesRead);
        }

        file.close();  
        output.close();
    }
        catch (Exception ex){
            System.out.println(ex);
        }
        }





    }

Client: 客户:

package com.http.client;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class Client extends JFrame implements ActionListener {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JTextField txtFile;

    public static void main(String args[]){

        /* Create and display the client form */

        Client clientForm = new Client();
        clientForm.Display();
    }

    public void Display(){

        JFrame frame = new JFrame();
        frame.setTitle("Client");

        FlowLayout layout = new FlowLayout();
        layout.setAlignment(FlowLayout.LEFT);

        JLabel lblFile = new JLabel("URL:");

        txtFile = new JTextField();
        txtFile.setPreferredSize(new Dimension(150,30));

        JButton btnTransfer = new JButton("Get");
        btnTransfer.addActionListener(this);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(layout);
        mainPanel.add(lblFile);
        mainPanel.add(txtFile);
        mainPanel.add(btnTransfer);

        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {

        /* File Open Dialog box allows the user to select a file */

        String filename=txtFile.getText();

        try{

            /* Try to connect to the server on localhost, port 5555 */

            Socket sk = new Socket("localhost", 5555);


            /* Send filename to server */

            OutputStreamWriter outreader = new OutputStreamWriter(sk.getOutputStream());
            outreader.write(filename + "\n");
            outreader.flush();

            /* Get response from server */

            BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));

            String serverStatus = inReader.readLine(); // Read the first line
            /* If server is ready, receive the file */

            while ( !serverStatus.equals("READY") ){}

                /* Create a new file in the tmp directory using the filename */

               recievefile(sk,filename);
               recievefile(sk,"xx"+filename);


                JOptionPane.showMessageDialog(this, "Transfer complete");


                inReader.close();
                outreader.close();
            sk.close();

        }
        catch (Exception ex){
            /* Catch any errors */
            JOptionPane.showMessageDialog(this, ex.getMessage());
            System.out.println(ex);
        }
    }

    public void recievefile(Socket sk, String filename)
    {
        try{

            InputStream input = sk.getInputStream();

        FileOutputStream wr = new FileOutputStream(new File("C:/tmp/" + new File(filename).getName()));

        byte[] buffer = new byte[sk.getReceiveBufferSize()];
        int bytesReceived = 0;

        while((bytesReceived = input.read(buffer))>0)
        {
            /* Write to the file */
           wr.write(buffer,0,bytesReceived);
        } 
        wr.close();
        input.close();

    }
        catch (Exception ex){
            /* Catch any errors */
            JOptionPane.showMessageDialog(this, ex.getMessage());
            System.out.println(ex);
        }

}




}

When you send the files, you are just appending one to the end of the other so thats how the client see them. 发送文件时,您只是将一个文件追加到另一个文件的末尾,这样客户端就可以看到它们。

You need to let the client know when to stop reading one file and start reading the second. 您需要让客户端知道何时停止读取一个文件并开始读取第二个文件。

The simplest approach is to send the length of the file before the file and only read exactly than amount of data. 最简单的方法是在文件之前发送文件长度,并且仅读取比数据量准确的长度。

BTW: You cannot combine binary and text streams the way you have. 顺便说一句:您不能以自己的方式组合二进制流和文本流。 This is more likely to lead to confusion. 这更有可能导致混乱。 In your case you need to send binary so make everything binary with DataInputStream and DataOutputStream. 在您的情况下,您需要发送二进制文件,因此请使用DataInputStream和DataOutputStream将所有文件都设置为二进制文件。


What I had in mind is something like. 我的想法是这样的。

public static void sendFile(DataOutput out, String filename) throws IOException {
    FileInputStream fis = new FileInputStream(filename);
    byte[] bytes = new byte[8192];
    try {
        long size = fis.getChannel().size();
        out.writeLong(size);
        for (int len; (len = fis.read(bytes, 0, (int) Math.min(bytes.length, size))) > 0; ) {
            out.write(bytes, 0, len);
            size -= len;
        }
        assert size == 0;
    } finally {
        fis.close();
    }
}

public void receiveFile(DataInput in, String filename) throws IOException {
    long size = in.readLong();
    FileOutputStream fos = new FileOutputStream(filename);
    byte[] bytes = new byte[8192];
    try {
        for (int len; (len = (int) Math.min(size, bytes.length)) > 0; ) {
            in.readFully(bytes, 0, len);
            fos.write(bytes, 0, len);
            size -= len;
        }
    } finally {
        fos.close();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM