如何通过套接字发送文件? Java

How can I send files through sockets? Java

我正在尝试通过套接字发送文件,目前是从客户端到服务器。要写入的文件已创建,但当我打开它时,它是空的。另外,如果我在发送文件后向服务器发送一个字符串,我发送的内容会写入本应收到的文本文件中。

我只使用文本文件进行测试。

为什么会这样?我该如何更正它?

jbutton.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent event) {
                        JFileChooser fc = new JFileChooser();
                        fc.setCurrentDirectory(new File(System.getProperty("user.home")));
                        FileNameExtensionFilter filter = new FileNameExtensionFilter("*.Images", "jpg","gif","png","txt");
                        fc.addChoosableFileFilter(filter);
                        int result = fc.showSaveDialog(null);
                         if(result == JFileChooser.APPROVE_OPTION){
                             File selectedFile = fc.getSelectedFile();
                             String path = selectedFile.getAbsolutePath();
                            try {
                                userText.setText("Sending File: " + selectedFile);
                                file = new FileInputStream(path);
                                byte b[] = new byte[30000];
                                file.read(b,0,b.length);
                                os = connection.getOutputStream();
                                os.write(b,0,b.length);
                                
                            } catch (FileNotFoundException e) {
                                e.printStackTrace();
                            }
                            catch (IOException e) {
                                e.printStackTrace();
                            }
                            
                         }
                         else if(result == JFileChooser.CANCEL_OPTION){
                             System.out.println("No File Select");
                         }  
                    }
                    

//get stream to send and receive data 
    private void setupStreams() throws IOException{
        output = new ObjectOutputStream(socket.getOutputStream());
        output.flush();
        input = new ObjectInputStream(socket.getInputStream());
        showMessage("\n Streams Are now Set up \n");
    }
    
    //during the chat conversation
    private void whileChatting() throws IOException{
        String message = "You are now connected ";
        showMessage(message);
        ableToType(true);
        do {
            try {
                message = (String) input.readObject();
                showMessage("\n" + message);
                
                byte b[] = new byte[30000];
                InputStream is = socket.getInputStream();
                FileOutputStream fr = new FileOutputStream("C:\Users\Documents\TestingFileClientToServer.txt");
                is.read(b,0,b.length);
                fr.write(b,0,b.length);
            
                
            }catch(ClassNotFoundException classNotFoundException) {
                showMessage("\n Error on input \n");
            }
            
        }while(!message.equals("CLIENT - END"));
    }

所以这是错误的(在两个地方):

            fr.write(b,0,b.length);

您应该在读取调用中获取实际读取的字节数,并在写入调用中使用该大小。

这也是一个问题:

            message = (String) input.readObject();

不要使用它,除非你真的在通过流发送对象......你不应该

关于回答为什么文件没有内容的问题:您需要在发送并刷新所有数据后关闭发送端的套接字。然后在接收方,您需要捕获 Socket 关闭的 SocketException,然后关闭您正在写入的文件。不关闭文件是您看不到任何内容的原因。

另一件事是您无缘无故地创建对象流。不要使用对象流,也不要使用数据流。只需使用原始 Input/Output 流。你不需要缓冲区,因为你正在做高效的读写。