Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unknownhost exception upon data transfer

Tags:

android

I need to send a file and some data to PHP server.I am using a thread for that and a service that executes every 15 min.It is working fine when network is available.But when not in network it stops sending the file (if the size of file is relatively bigger).Upon applying logs I got to see that ,the respnse from the server is not fetched.And it got struk.Moreover it is sending Unknownhost exception when trying to send the file for first time.What could be the problem?please help.

Here is the code:-

public void run(){


    while (keepRunning){
        isRunning = true;

        SystemClock.sleep(900000);



        File tempFile = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "barcode_log");
        File tempFile1 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "data_log.txt");


        if(tempFile.exists())
        {           

        Log.d(TAG," in keep running");  

        String[] files =  (new File(Environment.getExternalStorageDirectory() + PATH)).list();

        Log.d(TAG," below file list");  

        SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMdd_HHmmss");
        Date curDate = new Date();
        String s= "data_log";//df3.format(curDate);


        Log.d("log",files[0]);


        File file = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/","barcode_log");

        String new_file_name =s+".txt";
        // File (or directory) with new name
        File file2 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/",new_file_name);
        // Rename file (or directory)
        if(!tempFile1.exists()){

            boolean success = file.renameTo(file2);
            Log.d(TAG," file name created");


            if (success) {
                // File was not successfully renamed

                Log.d(TAG," file rename success");
            }
            else
            {
                Log.d(TAG," file not rename success");
            }
        } 

        ts.writeBarcodeToFile(" S L", "");
        HttpURLConnection connection = null;
        DataOutputStream outputStream = null;
        DataInputStream inputStream = null;

        String pathToOurFile = Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/"+new_file_name;//zipName;
        String urlServer = "http://xyz.com/xyz.php?fname="+s+".txt";
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary =  "V2ymHFg03ehbqgZCaKO6jy";

        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 2*1024*1024;

        FileInputStream fileInputStream=null;

        try
        {


        ts.writeBarcodeToFile(" in try sl", "");
        fileInputStream = new FileInputStream(new File(pathToOurFile) );

        InetAddress iAddr = InetAddress.getByName("http://xyz.com");
        URL url = new URL(urlServer);
        connection = (HttpURLConnection) url.openConnection();

        // Allow Inputs & Outputs
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);

        // Enable POST method
        connection.setRequestMethod("POST");

        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        connection.setConnectTimeout(20000);

        outputStream = new DataOutputStream( connection.getOutputStream() );
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
        outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd);
        outputStream.writeBytes(lineEnd);




        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        // Read file
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        ts.writeBarcodeToFile("before while sl ", "");
        while (bytesRead > 0)
        {
        outputStream.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

        outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        ts.writeBarcodeToFile("after while sl ", "");
        // Responses from the server (code and message)

        try{
        int serverResponseCode = connection.getResponseCode();
        String serverResponseMessage = connection.getResponseMessage();
        if(serverResponseCode==200)
        {
            ts.writeBarcodeToFile("in if server response ", "");
            //ts.writeBarcodeToFile("L S", ""); 
            tempFile1.delete();
        }
        else
        {
            ts.writeBarcodeToFile("in else server response ", "");
            ts.writeBarcodeToFile(serverResponseCode+"", "");

        }

        }
        catch(Exception e)
        {
            try{

                outputStream.flush();
                outputStream.close();
                }
                catch(Exception ex)
                {

                }

            ts.writeBarcodeToFile("in url catch response "+e.toString(), "");
            connection.disconnect();

        }

        ts.writeBarcodeToFile("after server  sl ", "");
        fileInputStream.close();
        outputStream.flush();
        outputStream.close();
        ts.writeBarcodeToFile("after close  sl ", "");
        }
        catch (java.net.SocketTimeoutException e) {
            try{
                fileInputStream.close();
            outputStream.flush();
            outputStream.close();
            }
            catch(Exception ex)
            {

            }
            ts.writeBarcodeToFile("in socketex  sl "+e.toString(), "");
            connection.disconnect();
            } 
        catch (java.io.IOException e) 
            {
            try{
                fileInputStream.close();
                outputStream.flush();
                outputStream.close();
                connection.disconnect();
                }
                catch(Exception ex)
                {

                }
            ts.writeBarcodeToFile("in ioex  sl "+e.toString(), "");

            }
        catch (Exception ex)
        {
            try{
                fileInputStream.close();
                outputStream.flush();
                outputStream.close();
                }
                catch(Exception exy)
                {

                }
            ts.writeBarcodeToFile("in catch  sl "+ex.toString(), "");
            connection.disconnect();
        //Exception handling
        }

        //System.gc();
        }




    }
    isRunning = false;
}
like image 804
Payal Avatar asked Jan 16 '13 17:01

Payal


2 Answers

This issue is related to the connectivity. i have also seen when we are on the wifi, we haven't hit an unknown host exception error (except when I unplugged the device). We're hitting unknown host exception errors when the device is solely on the 3g/4g.

You can try resumable support for upload similar thread resume uploads using HTTP?

or write your own protocol (chunk uploads).

like image 160
android2013 Avatar answered Oct 18 '22 03:10

android2013


You need to use AsyncTask for network operations for android versions 3.x and above..You can not use network operations in main thread....and If file size is big you may have to use wake_lock on service....and if network is not available than simply close your AsyncTask and than again check after 15 min as you are saying in service...use this code for checking network availability in AsyncTask

public boolean isOnline() {
   if(MyService.CONTEXT !=null){
       ConnectivityManager cm = (ConnectivityManager) MyService.CONTEXT.getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo netInfo = cm.getActiveNetworkInfo();
       if (netInfo != null && netInfo.isConnectedOrConnecting()) {
       return true;
       }
    }
  return false 
}
like image 44
R Gandhi Avatar answered Oct 18 '22 05:10

R Gandhi