计算客户端上的文件大小

时间:2017-11-22 14:28:22

标签: java sockets network-programming

我有3个类,Server,Client和TransferMain。我需要在客户端上显示完成的传输百分比,但如果文件不存在,我怎么知道客户端上的文件长度?

请记住,客户端和服务器在不同的PC上运行。

代码:https://pastebin.com/CBZauNRz

package servidor;
import java.io.BufferedInputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;



@SuppressWarnings("unused")
public class Servidor {
    private ServerSocket socketServidor;
    private Socket socketConexao;
    private int porta;

    public Servidor(int porta) {
        this.porta = porta;
    }
    public void iniciaConexaoServidor() {

        try {
            this.socketServidor = new ServerSocket(this.porta);
        } catch (IOException e) {
            System.out.println("Não conseguiu iniciar o socket do servidor");
            e.printStackTrace();
        }
        try {
            this.socketConexao = socketServidor.accept();
        } catch (IOException e) {
            System.out.println("Não conseguiu aceitar a conexao com o cliente.");
            e.printStackTrace();
        }
    }
    public void enviarArquivo(String diretorio) throws Exception {
        File arquivo = new File(diretorio);
        FileInputStream fis = new FileInputStream(arquivo);
        BufferedInputStream bis = new BufferedInputStream(fis);
        OutputStream os = this.socketConexao.getOutputStream();
        byte[] conteudo;
        long fileLength = arquivo.length();
        long current = 0;

        while(current!=fileLength){
            int size = 10000;
            if(fileLength - current >= size)
                current += size;    
            else{
                size = (int)(fileLength - current);
                current = fileLength;
            }
            conteudo = new byte[size];
            bis.read(conteudo, 0, size);
            os.write(conteudo);
            System.out.println("Mandando arquivo ... "+(current*100)/fileLength+"% completo!"+"ip do cliente:"+socketConexao.getInetAddress());
        }  

        os.flush();
        this.socketConexao.close();
        this.socketServidor.close();
        bis.close();
        System.out.println("Arquivo enviado com sucesso!");
    }
} 

客户端:

package Cliente;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Cliente {
    private Socket socketCliente;
    int porta;
    String address;
    public Cliente(int porta, String address) {
        this.porta=porta;
        this.address=address;
    }
    public void iniciarConexaoCliente() {
        try {
            this.socketCliente = new Socket(address, porta);
        } catch (UnknownHostException e) {
            System.out.println("Não conseguiu iniciar a conexao com o servidor");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Não conseguiu iniciar a conexao com o servidor");
            e.printStackTrace();
        }
    }
    public void transferenciaArquivo(String diretorio) throws IOException {
        byte[] conteudo = new byte[10000];

        FileOutputStream fos = new FileOutputStream(diretorio);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        InputStream is = socketCliente.getInputStream();
        int bytesRead = 0;
        long current= 0;
        long conteudoLength = conteudo.length;
        while((bytesRead=is.read(conteudo))!=-1) {
            bos.write(conteudo, 0, bytesRead);
            current = bytesRead;
            System.out.println("Recebendo arquivo..."+(current*100)/conteudoLength+"% recebido!" +"ip do servidor:"+this.address);
        }
        bos.flush();
        socketCliente.close();

        System.out.println("Arquivo recebido!");
    }

}

TransferMain:

import Cliente.Cliente;
import servidor.Servidor;

import java.io.IOException;
import java.util.Scanner;
@SuppressWarnings("unused")
public class TransferMain {

    public static void main(String[] args) {
        String adress; //192.168.25.9
        int porta;
        String escolha;
        Scanner in = new Scanner(System.in);
        Scanner str = new Scanner(System.in);
        System.out.println("Servidor ou cliente? S ou C");
        escolha = str.nextLine();
        System.out.println("endereço ip: ");
        adress = str.nextLine();
        System.out.println("porta: ");
        porta = in.nextInt();
        if(escolha.equals("S")) {
            Servidor servidor = new Servidor(porta);
            servidor.iniciaConexaoServidor();
            String diretorioServidor = "MusicasTeste.rar";
            try {
                servidor.enviarArquivo(diretorioServidor);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
             Cliente cliente = new Cliente(porta, adress);
             try {
                 cliente.iniciarConexaoCliente();
             } catch (Exception e) {
                 System.out.println("Não iniciou a conexão com o Cliente.");
                 e.printStackTrace();
             }
             String diretorioCliente = "MusicasTeste2.rar";
             try {
                 cliente.transferenciaArquivo(diretorioCliente);
             } catch (IOException e) {
                 System.out.println("Não conseguiu receber o arquivo.");
                 e.printStackTrace();
             }

        }





    }

}

0 个答案:

没有答案