完成传输后Java套接字文件损坏

时间:2015-12-04 08:56:10

标签: java file sockets corrupt

我遇到以下代码问题。服务器收到损坏的文件,我不知道为什么。这是我的代码..

客户端:

import javax.swing.*;  
import java.awt.*;  
import java.awt.event.*;  
import java.net.*;  
import java.io.*;  

public class Client extends JFrame implements ActionListener {  

    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("Filename:");  

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

        JButton btnTransfer = new JButton("Transfer");  
        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 */  

        JFileChooser fileDlg = new JFileChooser();  
        fileDlg.showOpenDialog(this);  
        String filename = fileDlg.getSelectedFile().getAbsolutePath();  
        txtFile.setText(filename);  

        try{  

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

            Socket sk = new Socket("localhost", 5555);  
            OutputStream output = sk.getOutputStream();  

            /* Send filename to server */  

            OutputStreamWriter outputStream = new OutputStreamWriter(sk.getOutputStream());  
            outputStream.write(fileDlg.getSelectedFile().getName() + "\n");  
            outputStream.flush();  

            /* Get reponse from server */  

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

            String serverStatus = inReader.readLine(); // Read the first line  

            /* If server is ready, send the file */  

            if ( serverStatus.equals("READY") ){  

                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);  
                }  

                output.close();  
                file.close();  
                sk.close();  

                JOptionPane.showMessageDialog(this, "Transfer complete");  
            }  
        }  
        catch (Exception ex){  
            /* Catch any errors */  
            JOptionPane.showMessageDialog(this, ex.getMessage());  
        }  
    }  
}  

服务器:

/*  
 * Server waits for a connection to be established by client  
 *  
 */  

import java.io.*;  
import java.net.*;  

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");  
        InputStream input = sk.getInputStream();  
        BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));  
        BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));  

        /* Read the filename */  
        String filename = inReader.readLine();  

        if ( !filename.equals("") ){  

            /* Reply back to client with READY status */  

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

        /* Create a new file in the tmp directory using the filename */  
        FileOutputStream wr = new FileOutputStream(new File("C://tmp/" + filename));  

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

        int bytesReceived = 0;  

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

我尝试使用flush,但这也不起作用,我不知道如何继续。

1 个答案:

答案 0 :(得分:1)

您不能在同一个套接字上使用多个流,读取器和编写器。你丢失了DataInputStream中的数据,因为它错误地缓冲了。更改协议,以便始终使用相同的流:例如DataOutputStreamread/writeUTF(),使用"=="方法发送文件名。