Java – How to send large files using sockets in android

How to send large files using sockets in android… here is a solution to the problem.

How to send large files using sockets in android

I

wrote this code to transfer files from the server to the client, but I can only send files less than 1 KB in size. I want to send a file of any size. It would be very helpful if you could modify my code :

File sender (server code).

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        infoIp = (TextView) findViewById(R.id.infoip);
        infoPort = (TextView) findViewById(R.id.infoport);

infoIp.setText(getIpAddress());

serverSocketThread = new ServerSocketThread();
        serverSocketThread.start();
    }

@Override
    protected void onDestroy() {
        super.onDestroy();

if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                 TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

private String getIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces.nextElement();
                Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses();

while (enumInetAddress.hasMoreElements()) {
                    InetAddress inetAddress = enumInetAddress.nextElement();

if (inetAddress.isSiteLocalAddress()) {
                        ip += "SiteLocalAddress: "+ inetAddress.getHostAddress() + "\n";
                    }
                }
            }

} catch (SocketException e) {
             TODO Auto-generated catch block
            e.printStackTrace();
            ip += "Something Wrong! " + e.toString() + "\n";
        }

return ip;
    }

public class ServerSocketThread extends Thread {

@Override
        public void run() {
            Socket socket = null;

try {
                serverSocket = new ServerSocket(SocketServerPORT);
                MainActivity.this.runOnUiThread(new Runnable() {

@Override
                    public void run() {
                        infoPort.setText("I'm waiting here: "
                                + serverSocket.getLocalPort());
                    }});

while (true) {
                    socket = serverSocket.accept();
                    FileTxThread fileTxThread = new FileTxThread(socket);
                    fileTxThread.start();
                }
            } catch (IOException e) {
                 TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                         TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }

public class FileTxThread extends Thread {
        Socket socket;
        FileTxThread(Socket socket){
            this.socket= socket;
        }

@Override
        public void run() {
            File file = new File(Environment.getExternalStorageDirectory(),"test.mp3");

byte[] bytes = new byte[(int) file.length()];

BufferedInputStream bis;
            try {
                bis = new BufferedInputStream(new FileInputStream(file));
                bis.read(bytes, 0, bytes.length);
                OutputStream os = socket.getOutputStream();
                os.write(bytes, 0, bytes.length);
                os.flush();
                socket.close();

final String sentMsg = "File sent to: " + socket.getInetAddress();
                System.out.println("socket getIntentAddress "+socket.getInetAddress());
                MainActivity.this.runOnUiThread(new Runnable() {

@Override
                    public void run() {
                        Toast.makeText(MainActivity.this,sentMsg,Toast.LENGTH_LONG).show();

}});

} catch (FileNotFoundException e) {
                 TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Ioexception"+e);
            } catch (IOException e) {
                 TODO Auto-generated catch block
                e.printStackTrace();
               } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                     TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("Ioexception"+e);
                }

File recipient (client code).

 buttonConnect.setOnClickListener(new OnClickListener(){

@Override
            public void onClick(View v) {
                ClientRxThread clientRxThread =
                        new ClientRxThread(editTextAddress.getText().toString(),SocketServerPORT);

clientRxThread.start();
            }});
    }

private class ClientRxThread extends Thread {
        String dstAddress;
        int dstPort;

ClientRxThread(String address, int port) {
            dstAddress = address;
            dstPort = port;
        }

@Override
        public void run() {
            Socket socket = null;

try {
                socket = new Socket(dstAddress, dstPort);

File file = new File(Environment.getExternalStorageDirectory(),"test.mp3");

byte[] bytes = new byte[1024];

InputStream is = socket.getInputStream();
                FileOutputStream fos = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                int bytesRead = is.read(bytes, 0, bytes.length);
                bos.write(bytes, 0, bytesRead);
                bos.close();
                socket.close();

MainActivity.this.runOnUiThread(new Runnable() {

@Override
                    public void run() {
                        Toast.makeText(MainActivity.this,"Finished",Toast.LENGTH_LONG).show();
                    }});

} catch (IOException e) {

e.printStackTrace();

final String eMsg = "Something wrong: " + e.getMessage();

MainActivity.this.runOnUiThread(new Runnable() {

@Override
                    public void run() {
                        Toast.makeText(MainActivity.this,eMsg,Toast.LENGTH_LONG).show();
                        System.out.println("run"+eMsg);
                    }});

} finally {
                if(socket != null){
                    try {

socket.close();
                    } catch (IOException e) {
                         TODO Auto-generated catch block
                        e.printStackTrace();

}

Ask God for help! Thanks in advance!

Solution

You need to put the reception of bytes in a loop that completes only after all the data has been received. For example: –

byte[] bytes = new byte[1024];
InputStream is = socket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
while (true) {
    int bytesRead = is.read(bytes);
    if (bytesRead < 0) break;
    bos.write(bytes, 0, bytesRead);
     Now it loops around to read some more.
}
bos.close();

Related Problems and Solutions