Простая проблема программы передачи файлов Java - PullRequest
6 голосов
/ 23 мая 2011

Я пытаюсь выполнить простую передачу файла с сервера на клиент.

Он должен выглядеть следующим образом:

Клиент запрашивает файл.

Сервер отправляет файл клиенту.

Теперь в коде (ниже) (это единственный код, который я нашел, и его было трудно найти) Он отправляет мне только текстовый файл «хорошо» (и даже это делает только одну строку в клиенте).Если я пытаюсь отправить файл любого другого типа (например, файл изображения или rar), он повреждается.

Итак, кто-нибудь может помочь мне найти какой-нибудь рабочий код (на Java), который может отправлять и получать всетипы файлов, или объясните мне, в чем проблема с этим кодом.

Сторона сервера:

public class FileServer {   
    public static void main(String args[])throws IOException
    { 
        ServerSocket ss=null;
        try
        {  
            ss=new ServerSocket(8081);
        }
        catch(IOException e)
        { 
            System.out.println("couldn't listen");
            System.exit(0);
        }
        Socket cs=null;
        try
        { 
            cs=ss.accept();
            System.out.println("Connection established"+cs);
        }
        catch(Exception e)
        { 
            System.out.println("Accept failed");
            System.exit(1);
        } 
        PrintWriter put=new PrintWriter(cs.getOutputStream(),true);
        BufferedReader st=new BufferedReader(new InputStreamReader(cs.getInputStream()));
        String s=st.readLine();
        System.out.println("The requested file is : "+s);
        File f=new File(s);
        if(f.exists())
        { 
            BufferedReader d=new BufferedReader(new FileReader(s));
            String line;
            while((line=d.readLine())!=null)
            {
                put.write(line);
                put.flush();
            }
            d.close();
            System.out.println("File transfered");
            cs.close();
            ss.close();
        }  
    }  
}

Сторона клиента:

class MyClient {
    public static void main(String srgs[])throws IOException
    {
        Socket s=null;
        BufferedReader get=null;
        PrintWriter put=null;
        try
        { 
            s=new Socket("127.0.0.1",8081);
            get=new BufferedReader(new InputStreamReader(s.getInputStream()));
            put=new PrintWriter(s.getOutputStream(),true);
        }  
        catch(Exception e)
        {
            System.exit(0);
        }
        String u,f;
        System.out.println("Enter the file name to transfer from server:");
        DataInputStream dis=new DataInputStream(System.in);
        f=dis.readLine();
        put.println(f);
        File f1=new File("c:\\output");
        FileOutputStream  fs=new FileOutputStream(f1);
        while((u=get.readLine())!=null)
        { 
            byte jj[]=u.getBytes();
            fs.write(jj);
        }
        fs.close();
        System.out.println("File received");
        s.close();
    }
}

yesssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssнаконец ...

Это изменения

на стороне клиента.

class MyClient {public static void main(String srgs[])throws IOException
{
    Socket s=null;
    BufferedReader get=null;
    PrintWriter put=null;
    try
    { 
        s=new Socket("127.0.0.1",8081);
        get=new BufferedReader(new InputStreamReader(s.getInputStream()));
        put=new PrintWriter(s.getOutputStream(),true);        
    }  
    catch(Exception e)
    {
        System.exit(0);
    }
    InputStreamReader get2=new InputStreamReader(s.getInputStream());
    String u,f;
    System.out.println("Enter the file name to transfer from server:");
    DataInputStream dis=new DataInputStream(System.in);
    f=dis.readLine();
    put.println(f);
    File f1=new File("c:\\output");
    FileOutputStream  fs=new FileOutputStream(f1);

    BufferedInputStream d=new BufferedInputStream(s.getInputStream());
    BufferedOutputStream outStream = new BufferedOutputStream(new             FileOutputStream(f1));
    byte buffer[] = new byte[1024];
    int read;
    while((read = d.read(buffer))!=-1)
    {
        outStream.write(buffer, 0, read);
        outStream.flush();
    }

    //while((u=get.readLine())!=null)
    // { 
    //    byte jj[]=u.getBytes();
    //    fs.write(jj);
    //} 
    fs.close();
    System.out.println("File received");
    s.close();
    }
}

на стороне сервера.

public class FileServer {   
    public static void main(String args[])throws IOException
    { 
        ServerSocket ss=null;
        try
        {  
            ss=new ServerSocket(8081);
        }
        catch(IOException e)
        { 
            System.out.println("couldn't listen");
            System.exit(0);
        }
        Socket cs=null;
        try
        { 
            cs=ss.accept();
            System.out.println("Connection established"+cs);
        }
        catch(Exception e)
        { 
            System.out.println("Accept failed");
            System.exit(1);
        } 
        PrintWriter put=new PrintWriter(cs.getOutputStream(),true);
        BufferedReader st=new BufferedReader(new InputStreamReader(cs.getInputStream()));
        String s=st.readLine();
        System.out.println("The requested file is : "+s);
        File f=new File(s);
        if(f.exists())
        { 
            BufferedInputStream d=new BufferedInputStream(new FileInputStream(s));
            BufferedOutputStream outStream = new BufferedOutputStream(cs.getOutputStream());
            byte buffer[] = new byte[1024];
            int read;
            while((read = d.read(buffer))!=-1)
            {
                outStream.write(buffer, 0, read);
                outStream.flush();
            }
            d.close();
            System.out.println("File transfered");
            cs.close();
            ss.close();
        }  
    }  
}

Спасибомного всем вам ...

Ответы [ 3 ]

4 голосов
/ 23 мая 2011

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

http://download.oracle.com/javase/tutorial/i18n/text/stream.html

Обновление: В вашей серверной части после f.exist ():

BufferedInputStream d=new BufferedInputStream(new FileInputStream(s));
BufferedOutputStream outStream = new BufferedOutputStream(cs.getOutputStream());
byte buffer[] = new byte[1024];
int read;
while((read = d.read(buffer))!=-1)
{
    outStream.write(buffer, 0, read);
    outStream.flush();
}
d.close();
System.out.println("File transfered");
cs.close();
ss.close();
1 голос
/ 23 мая 2011

Класс Reader / Writer предназначен только для символьного потока, Reader doc .Вы должны использовать BufferedInputStream / BufferedOutputStream или что-то подобное для необработанных / двоичных данных.

0 голосов
/ 23 мая 2011

Да, но InpustStreamReader все еще является Читателем, который попытается преобразовать базовые байты в символ данные, а не двоичные данные.Поскольку вы просто пытаетесь отправить необработанные байты файла, не используйте ничего с именем «reader» или «writer» в имени - вместо этого используйте InputStream и OutputStream (и их подклассы) как на сервере, так и на клиенте.

...