Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple Java file transfer program problem

I am trying to do a simple file transfer from server to client.

It needs to go like this:

Client asks for file.

Server sends the file to client.

Now in the code (down below) (this is the only code I found and it was hard to find) It sends me only a text file "good" (and even that only makes it to one line in the client). If i try to send any other file type (like image or rar file) it gets it corrupted.

So, could some one please help me to find some working code (in Java) that can send and receive all types of files, or explain to me what the problem with this code is.

Server side:

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();
        }  
    }  
}

Client Side:

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();
    }
}

yesssssssssssssssssssssssssssssssssssssssssssssssssss at last...

This is the changes

client side.

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();
    }
}

Server Side.

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();
        }  
    }  
}

Thanks a lot to all of you...

like image 717
dan Avatar asked May 23 '11 19:05

dan


1 Answers

You shouldn't use reader in this case. Reader are supposed to deal when you read/writer character data (text) not binary. Use some kind of InputStream

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

Update: In you server part after 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();
like image 170
Mikita Belahlazau Avatar answered Oct 10 '22 05:10

Mikita Belahlazau