Java, передача файла через Socket

Рейтинг: 3Ответов: 2Опубликовано: 06.05.2011

Нужно передать файл любого размера через сокет, желательно чтобы к этому возможно было прикрутить прогрессбар. (Интересуют именно файлы, сокет вполне работает, и к моменту передачи клиент и сервер готовы отдавать/принимать файл)

Ответы

▲ 5Принят
  1. Какая разница что передавать, файлы или что-то другое?
  2. Что значит клиент и сервер готовы? У них уже есть имя файла? Они уже знают размер передачи/принятия?
client = new Socket("server", port);
bis = new BufferedInputStream(new FileInputStream("somefile.dat"));
bos = new BufferedOutputStream(client.getOutputStream());
byteArray = new byte[8192];
while ((in = bis.read(byteArray)) != -1){
    bos.write(byteArray,0,in);
}
bis.close();
bos.close();
▲ 2
public void sendFile(final File f) {
    Runnable r = new Runnable() {

        public void run() {
            System.out.println("Sending " + f.getName() + "...");
            out.println("@FILE_SEND"); 
            out.println(f.getName()); 
            try {
                byte[] byteArray = new byte[1024];
                FileInputStream fis = new FileInputStream(f.getPath());
                long s;
                s = f.length();
                out.println(s);
                int sp = (int)(s / 1024);
                if (s % 1024 != 0) sp++;
                Main.mainFrame.createProgressPanel(f.getPath(), sp);
                BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream());
                Thread.sleep(500);
                while (s > 0) {
                    int i = fis.read(byteArray);
                    bos.write(byteArray, 0, i);
                    Main.mainFrame.progressInStream(1);
                    s-= i;
                }
                bos.flush();
                fis.close();
            } catch (FileNotFoundException e) {
                System.err.println("File not found!");
            } catch (IOException e) {
                System.err.println("IOException");
            } catch (Exception e) {

            }
            new JOptionPane().showMessageDialog(null, f.getName() + " Sent");
            if (type == ClientServer.CLIENT_TYPE) Main.mainFrame.refreshFileList();
        }
    };
    new Thread(r).start();
}

private void recieveFile(String filename) {
    try {
        long s;
        s = Long.parseLong(in.readLine());

        System.out.println("File size: " + s);
        byte[] byteArray = new byte[1024];
        new File("Recieved").mkdir();
        File f = new File("./Recieved/" + filename);
        f.createNewFile();
        FileOutputStream fos = new FileOutputStream(f);
        int sp = (int)(s / 1024);
        if (s % 1024 != 0) sp++;
        Main.mainFrame.createProgressPanel(filename, sp);
        BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
        while (s > 0) {
            int i = bis.read(byteArray);
            fos.write(byteArray, 0, i);
            Main.mainFrame.progressInStream(1);
            s-= i;
        }
        fos.close();
    } catch (IOException e) {
        System.err.println("Recieve IO Error");
    }
    new JOptionPane().showMessageDialog(null, "Recieved " + filename);
}