java send file using sockets

前端 未结 3 635
长情又很酷
长情又很酷 2020-12-28 11:08

I am trying to send a file from one computer to another using Java. I have written the code below, it works fine if both sender and receiver are started in the same computer

相关标签:
3条回答
  • 2020-12-28 11:34

    On the client side you write up to count bytes and send them:

    while ((count = in.read(buffer)) > 0) {
      out.write(buffer, 0, count);
    

    on the server side you read up to count bytes - but then you write the whole buffer to file!

    while((count=in.read(buffer)) > 0){
      fos.write(buffer);
    

    Just change it to:

    fos.write(buffer, 0, count);
    

    and you'll be on the safe side. BTW your program has another small bug: read() can return 0 which doesn't mean InputStream ended. Use >= instead:

    count = in.read(buffer)) >= 0
    

    Have you considered IOUtils.copy(InputStream, OutputStream) from Apache Commons? It would reduce your whole while loops to:

    OutputStream out = socket.getOutputStream();
    InputStream in = new FileInputStream(myFile);
    IOUtils.copy(in, out);
    socket.close();
    

    Less code to write, less code to test. And buffering is done internally.

    0 讨论(0)
  • 2020-12-28 11:43

    Remember that in.read(buffer) not necessarily fills up the whole buffer with new data. Therefore you should make sure you don't write the whole buffer. Change

    while((count=in.read(buffer)) >0){
        fos.write(buffer);
    }
    

    to

    while((count=in.read(buffer)) >0){
        fos.write(buffer, 0, count);
    }
    
    0 讨论(0)
  • 2020-12-28 11:50

    sender

    Socket sock = new Socket("127.0.0.1", 5991);
            System.out.println("Connecting.........");
            File myFile = new File("/root/qrcode/");
            File[] files = myFile.listFiles();
           OutputStream os = sock.getOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(os);
                                DataOutputStream dos = new DataOutputStream(bos);
    
                                dos.writeInt(files.length);
                                long totalBytesRead = 0;
                                int percentCompleted = 0;
                                for(File file : files)
                                {
                                         long length = file.length();
                                         dos.writeLong(length);
    
                                         String name = file.getName();
                                         dos.writeUTF(name);
    
                                         FileInputStream fis = new FileInputStream(file);
                                         BufferedInputStream bis = new BufferedInputStream(fis);
    
                                         int theByte = 0;
                                         while((theByte = bis.read()) != -1)
                                         {
                                            totalBytesRead += theByte;
    
    
                                            bos.write(theByte);
                                         }
                                        //  System.out.println("file read");
                                         bis.close();
                                     }
    
                                    dos.close();
    
    
            //Closing socket  
            sock.close();
    

    receiver

    ServerSocket serverSocket = new ServerSocket(5991);  
    
        while(true) {  
            Socket clientSocket = null; 
            System.out.println("Starting...");
            clientSocket = serverSocket.accept();  
    
            InputStream in = clientSocket.getInputStream(); //used
    
            BufferedInputStream bis = new BufferedInputStream(in);
    
            String dirPath  ;
            dirPath = "/root/NewFolder";
    
            try{
                DataInputStream dis = new DataInputStream(bis);
    
                int filesCount = dis.readInt();
                File[] files = new File[filesCount];
                long f_l = 0;
                int count =0 ;
                long totalBytesRead = 0;
                int percentCompleted = 0;
    
                for(int i = 0; i < filesCount; i++)
                {
                    long fileLength = dis.readLong();
                    String fileName = dis.readUTF();
    
                    f_l = f_l +fileLength;
                    files[i] = new File(dirPath + "/" + fileName);
    
                    FileOutputStream fos = new FileOutputStream(files[i]);
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
    
                    int tot = 0;
                    for(int j = 0; j < fileLength; j++) {
    
                        bos.write(bis.read());
                    }
    
                    bos.close();
    
                }
    
            }catch(Exception ex)
            {
                System.out.println("error in socket programming ");
            }
        }
    
    0 讨论(0)
提交回复
热议问题