android: file transfer through sockets
<p>hi i am trying to send a file through sockets in an android messenger. for some reason its not working. at times it does output a file but transfers no bytes that is the output file is of 0 bytes and sometimes the output or the received file is of 57 bytes precisely. following the code where i actually send the file :</p>

<pre><code>public boolean sendFile(String ip, int port) {      
     try {                      
         String[] str = ip.split("\\.");
         byte[] IP = new byte[str.length];
         for (int i = 0; i &lt; str.length; i++) {
             IP[i] = (byte) Integer.parseInt(str[i]);
         }
         Socket socket = getSocket(InetAddress.getByAddress(IP), port);
         if (socket == null) {
             return false;
         }
         Log.i("SocketOP", "sendFILE-1");
         File  f = new File("/sdcard/chats/gas.jpg/");
         filesize = (int) f.length();

         BufferedOutputStream out = new BufferedOutputStream( socket.getOutputStream() );

         FileInputStream fileIn = new FileInputStream(f);
         Log.i("SocketOP", "sendFILE-2");
         byte [] buffer  = new byte [filesize];
         int bytesRead =0;
         while ((bytesRead = fileIn.read(buffer)) &gt; 0) {
             out.write(buffer, 0, bytesRead);
         }
         out.flush();
         out.close();
         fileIn.close();
         Log.i("SocketOP", "sendFILE-3");
     } catch (IOException e) {
         return false;          
         //e.printStackTrace();
     }
     return true;       
 }  
</code></pre>

<p>this is where i send the inputstream to the receivefile method :</p>

<pre><code>private class ReceiveConnection extends Thread {

    Socket clientSocket = null;
    public ReceiveConnection(Socket socket) {
        this.clientSocket = socket;
        SocketOperator.this.sockets.put(socket.getInetAddress(), socket);
    }

    @Override
    public void run() {
        try {
            //PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(
                clientSocket.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                InputStream is=clientSocket.getInputStream();
                if (inputLine.contains("Text") == true) {
                    appManager.messageReceived(inputLine);  
                    Log.i("SocketOP","text");

                } else if (inputLine.contains("Text") == false) {
                        Log.i("SocketOP","filee");
                        appManager.fileReceived(is);
                } else {
                    clientSocket.shutdownInput();
                    clientSocket.shutdownOutput();
                    clientSocket.close();
                    SocketOperator.this.sockets.remove(clientSocket.getInetAddress());
                    Log.i("SocketOP", "CLOSING CONNECTION");
                }                        
            }
        }
    }
}
</code></pre>

<p>and finally this is how i receive the file :</p>

<pre><code>public void fileReceived(InputStream is)
    throws FileNotFoundException, IOException {
    Log.i("IMSERVICE", "FILERECCC-1");

    //int filesize=6022386; // filesize temporary hardcoded

    int bytesRead;

    final byte[] aByte = new byte[is.toString().length()];


    if (is!= null) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fos = new FileOutputStream("/sdcard/chats/gas1.jpg/");
            bos = new BufferedOutputStream(fos);
            bytesRead = is.read(aByte, 0, aByte.length);

            do {
                baos.write(aByte);
                bytesRead = is.read(aByte);
            } while (bytesRead != -1);

            bos.write(baos.toByteArray());
            bos.flush();
            bos.close();
            Log.i("IMSERVICE", "FILERECCC-2");

        } catch (IOException ex) {
            // Do exception handling
        }
    }
}}
</code></pre>

<p>the following is the complete socketoperator file :</p>

<pre><code>package hardy.scl.communication;

import hardy.scl.interfaces.IAppManager;
import hardy.scl.interfaces.ISocketOperator;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Iterator;

import android.util.Log;


public class SocketOperator implements ISocketOperator
{
private static final String AUTHENTICATION_SERVER_ADDRESS = "http://10.10.10.100/chippers/";

private int listeningPort = 0;

private static final String HTTP_REQUEST_FAILED = null;



private HashMap&lt;InetAddress, Socket&gt; sockets = new HashMap&lt;InetAddress, Socket&gt;();

private ServerSocket serverSocket = null;

private boolean listening;

private IAppManager appManager;

public int filesize ;



private class ReceiveConnection extends Thread {
Socket clientSocket = null;
Socket fileSocket=null;
public ReceiveConnection(Socket socket) 
{
    this.clientSocket = socket;
    this.fileSocket=socket;
    SocketOperator.this.sockets.put(socket.getInetAddress(), socket);
}

@Override
public void run() {
     try {
//          PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),    true);
        BufferedReader in = new BufferedReader(
                   new InputStreamReader(
                            clientSocket.getInputStream()));



         InputStream is=fileSocket.getInputStream();

        String inputLine;
        while ((inputLine = in.readLine()) != null)                  {



             if (inputLine.contains("Text") == true)
             {


                appManager.messageReceived(inputLine);  
        Log.i("SocketOP","text");}

             else  if 
            (inputLine.contains("Text") == false)
            {

                Log.i("SocketOP","filee");
                 appManager.fileReceived(is);

             }
            else{

                 clientSocket.shutdownInput();
                 clientSocket.shutdownOutput();
                 clientSocket.close();

                 fileSocket.shutdownInput();
                 fileSocket.shutdownOutput();
                 fileSocket.close();
                      SocketOperator.this.sockets.remove(clientSocket.getInetAddress());
                 SocketOperator.this.sockets.remove(fileSocket.getInetAddress());

                 Log.i("SocketOP", "CLOSING CONNECTION");
             }                       
    }       

    } catch (IOException e) {
        Log.e("ReceiveConnection.run: when receiving connection ","");
}           
}   
}

public SocketOperator(IAppManager appManager) {
this.appManager = appManager;   
}


public String sendHttpRequest(String params)
{       
URL url;
String result = new String();
try 
{
    url = new URL(AUTHENTICATION_SERVER_ADDRESS);
    HttpURLConnection connection;
    connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);

    PrintWriter out = new PrintWriter(connection.getOutputStream());

    out.println(params);
    out.close();

    BufferedReader in = new BufferedReader(
            new InputStreamReader(
                    connection.getInputStream()));
    String inputLine;

    while ((inputLine = in.readLine()) != null) {
        result = result.concat(inputLine);              
    }
    in.close();         
} 
catch (MalformedURLException e) {
    e.printStackTrace();
} 
catch (IOException e) {
    e.printStackTrace();
}           

if (result.length() == 0) {
    result = HTTP_REQUEST_FAILED;
}

return result;


}


public boolean sendMessage(String message, String ip, int port) 
{
try {


    String[] str = ip.split("\\.");

    byte[] IP = new byte[str.length];

    for (int i = 0; i &lt; str.length; i++) {

        IP[i] = (byte) Integer.parseInt(str[i]);                
    }
    Socket socket = getSocket(InetAddress.getByAddress(IP), port);
    if (socket == null) {
        return false;
    }

    PrintWriter out = null;
    out = new PrintWriter(socket.getOutputStream(), true);
    //OutputStreamWriter outputStream = new OutputStreamWriter(socket.getOutputStream());
    //outputStream.write("Text");
   // outputStream.flush();
    String flag = "Text";
    message = message+flag;
    out.println(message);
} catch (UnknownHostException e) {          
    return false;
    //e.printStackTrace();
} catch (IOException e) {
    return false;           
    //e.printStackTrace();
}

return true;        
}




public int startListening(int portNo) 
{
listening = true;

try {
    serverSocket = new ServerSocket(portNo);
    this.listeningPort = portNo;
} catch (IOException e) {           

    //e.printStackTrace();
    this.listeningPort = 0;
    return 0;
}

while (listening) {
    try {
        new ReceiveConnection(serverSocket.accept()).start();

    } catch (IOException e) {
        //e.printStackTrace();              
        return 2;
    }
}

try {
    serverSocket.close();
} catch (IOException e) {           
    Log.e("Exception server socket", "Exception when closing server socket");
    return 3;
}


return 1;
}


public void stopListening() 
{
this.listening = false;
}

private Socket getSocket(InetAddress addr, int portNo) 
{
Socket socket = null;
if (sockets.containsKey(addr) == true) 
{
    socket = sockets.get(addr);
    // check the status of the socket
    if  ( socket.isConnected() == false ||
          socket.isInputShutdown() == true ||
          socket.isOutputShutdown() == true ||
          socket.getPort() != portNo 
         )  
    {           
        // if socket is not suitable,  then create a new socket
        sockets.remove(addr);               
        try {
            socket.shutdownInput();
            socket.shutdownOutput();
            socket.close();
            socket = new Socket(addr, portNo);
            sockets.put(addr, socket);
        } 
        catch (IOException e) {                 
            Log.e("getSocket: when closing and removing", "");
        }               
    }
}
else  
{
    try {
        socket = new Socket(addr, portNo);
        sockets.put(addr, socket);
    } catch (IOException e) {
        Log.e("getSocket: when creating", "");              
    }                   
}
return socket;      
}


public void exit() 
{           
for (Iterator&lt;Socket&gt; iterator = sockets.values().iterator(); iterator.hasNext();) 
{
    Socket socket = (Socket) iterator.next();
    try {
        socket.shutdownInput();
        socket.shutdownOutput();
        socket.close();
    } catch (IOException e) 
    {               
    }       
}

sockets.clear();
this.stopListening();
appManager = null;
//      timer.cancel();     
}


public int getListeningPort() {

return this.listeningPort;
}


@Override
public boolean sendFile(String ip, int port) {
// TODO Auto-generated method stub


try {


    String[] str = ip.split("\\.");

    byte[] IP = new byte[str.length];

    for (int i = 0; i &lt; str.length; i++) {

        IP[i] = (byte) Integer.parseInt(str[i]);


    }
    Socket socket = getSocket(InetAddress.getByAddress(IP), port);
    if (socket == null) {
        return false;
    }
    Log.i("SocketOP", "sendFILE-1");
   File  f = new File("/sdcard/chats/gas.jpg/");



   BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
int readData;
   byte[] buffer = new byte[1024];   
   bis.read(buffer, 0,buffer.length);
  OutputStream os = socket.getOutputStream();

  while((readData=bis.read(buffer))!=-1){
      os.write(buffer,0,readData);


   Log.i("SocketOP", "sendFILE-3");
   }









} catch (IOException e) {
    return false;           
    //e.printStackTrace();
}
//  Toast.makeText(this, "Lvbvhhging...", Toast.LENGTH_SHORT).show();

return true;        
}
}   
</code></pre>

<p>This is my IMService service that runs and calls startlistening. i am totally cluless. its giving me an error as suspected. how do i go about resolving this now..
IMService code block :</p>

<pre><code>public void onCreate() 
{       
     mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    // Display a notification about us starting.  We put an icon in the status bar.
 //   showNotification();
    conManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);


    // Timer is used to take the friendList info every UPDATE_TIME_PERIOD;
    timer = new Timer();   

    Thread thread = new Thread()
    {
        @Override
        public void run() {         

            //socketOperator.startListening(LISTENING_PORT_NO);
            Random random = new Random();
            int tryCount = 0;
            while (socketOperator.startListening(10000 +     random.nextInt(20000))      == 0 )
            {       
                tryCount++; 
                if (tryCount &gt; 10)
                {
                    // if it can't listen a port after trying 10 times,    give up...
                    break;
                }

            }
        }
    };      
    thread.start();

}
</code></pre>
