Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android:SocketTimeoutException: failed to connect to /103.24.4.60 (port 80) after 30000ms

Tags:

android

I want to download image from Http url and save into sd card after that load and show into image view. I have tried Image-loader tutorial from android-hive used my http url for load the image but after run image can't load and show. App is not crash but getting error exception java.net.SocketTimeoutException: failed to connect to /103.24.4.60 (port 80) after 30000ms in ImageLoader class

Here is my Log information

09-30 02:32:15.820  18371-18389/? W/System.err﹕ java.net.SocketTimeoutException: failed to connect to /103.24.4.60 (port 80) after 30000ms
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:169)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:122)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.net.Socket.connect(Socket.java:882)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.Platform.connectSocket(Platform.java:139)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.Connection.connect(Connection.java:148)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.example.tazeen.imgloader.ImageLoader.getBitmap(ImageLoader.java:73)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.example.tazeen.imgloader.ImageLoader.access$000(ImageLoader.java:23)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at com.example.tazeen.imgloader.ImageLoader$PhotosLoader.run(ImageLoader.java:134)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
09-30 02:32:15.820  18371-18389/? W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-30 02:32:15.821  18371-18389/? W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-30 02:32:15.821  18371-18389/? W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-30 02:32:15.821  18371-18389/? W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

This is ImageLoader class

public class ImageLoader {

    MemoryCache memoryCache=new MemoryCache();
    FileCache fileCache;
    private Map<ImageView, String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
    ExecutorService executorService; 

    public ImageLoader(Context context){
        fileCache=new FileCache(context);
        executorService=Executors.newFixedThreadPool(5);
    }

    int stub_id = R.drawable.ic_launcher;
    public void DisplayImage(String url, int loader, ImageView imageView)
    {
        stub_id = loader;
        imageViews.put(imageView, url);
        Bitmap bitmap=memoryCache.get(url);
        if(bitmap!=null)
            imageView.setImageBitmap(bitmap);
        else
        {
            queuePhoto(url, imageView);
            imageView.setImageResource(loader);
        }
    }

    private void queuePhoto(String url, ImageView imageView)
    {
        PhotoToLoad p=new PhotoToLoad(url, imageView);
        executorService.submit(new PhotosLoader(p));
    }

    private Bitmap getBitmap(String url)
    {
        File f=fileCache.getFile(url);

        //from SD cache
        Bitmap b = decodeFile(f);
        if(b!=null)
            return b;

        //from web
        try {
            Bitmap bitmap=null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is=conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Exception ex){
           ex.printStackTrace();
           return null;
        }
    }

    //decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f){
        try {
            //decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f),null,o);

            //Find the correct scale value. It should be the power of 2.
            final int REQUIRED_SIZE=70;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
            int scale=1;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }

            //decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {}
        return null;
    }

    //Task for the queue
    private class PhotoToLoad
    {
        public String url;
        public ImageView imageView;
        public PhotoToLoad(String u, ImageView i){
            url=u;
            imageView=i;
        }
    }

    class PhotosLoader implements Runnable {
        PhotoToLoad photoToLoad;
        PhotosLoader(PhotoToLoad photoToLoad){
            this.photoToLoad=photoToLoad;
        }

        @Override
        public void run() {
            if(imageViewReused(photoToLoad))
                return;
            Bitmap bmp=getBitmap(photoToLoad.url);
            memoryCache.put(photoToLoad.url, bmp);
            if(imageViewReused(photoToLoad))
                return;
            BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
            Activity a=(Activity)photoToLoad.imageView.getContext();
            a.runOnUiThread(bd);
        }
    }

    boolean imageViewReused(PhotoToLoad photoToLoad){
        String tag=imageViews.get(photoToLoad.imageView);
        if(tag==null || !tag.equals(photoToLoad.url))
            return true;
        return false;
    }

    //Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable
    {
        Bitmap bitmap;
        PhotoToLoad photoToLoad;
        public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
        public void run()
        {
            if(imageViewReused(photoToLoad))
                return;
            if(bitmap!=null)
                photoToLoad.imageView.setImageBitmap(bitmap);
            else
                photoToLoad.imageView.setImageResource(stub_id);
        }
    }

    public void clearCache() {
        memoryCache.clear();
        fileCache.clear();
    }

}
like image 673
androidTag Avatar asked Sep 30 '15 04:09

androidTag


3 Answers

There are two possibilities:

1) Have you checked and tested your connection.

2) Better don't set any connection timeout,if you are setting chose maximum time, because it throws an error,if server didn't response within given time.

so you can use:

HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(7000);

or you can use:

for (int retries = 0; retries < 3; retries++) {
    try {
        final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null);
        final HttpResponse response = client.execute(get);
        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != 200) {
            throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
        } else {                
            return response.getEntity();
        }
    } catch (final java.net.SocketTimeoutException e) {
    // connection timed out...let's try again                
   }
}

hope so it will helps you, enjoy your code :)

like image 136
John smith Avatar answered Nov 20 '22 00:11

John smith


I also had this problem. In my case, I was trying to connect my Android app with node REST api which was running on port 3000. I also had this connection timeout problem. My OS is windows.

Folow these steps.

1)- Check whether the mobile and Computer are connected to same network

2)-Check the computer IP assigned by router using below comand on cmd

ipconfig

The result will be like this

Windows IP Configuration

  Wireless LAN adapter Wi-Fi:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : ********
   IPv4 Address. . . . . . . . . . . : ********
   Subnet Mask . . . . . . . . . . . : ********
   Default Gateway . . . . . . . . . : ********
                                   ***.***.8.1

Then check the used IP address. It must be IPv4 Address of the connected wifi network

3)-Set the network as private/ Home network

On windoes 10, you can do this by select taskbar wifi icon ==> selecte the properties of connected network ==> Under Network profile set the network as private

4)-Check the Firewall is disabled.

If your firewall is enabled please turn off it until test finish and remember to turn on it again after finishing your task

like image 15
Chanaka Fernando Avatar answered Nov 20 '22 00:11

Chanaka Fernando


This issue can occur due to FIREWALL, please check below steps to resolve it

  1. Check whether you can connect directly through URL, using any of browser instead of Android app.
  2. If it fails, then it could be an issue with network connectivity not with android code.
  3. One of reason behind Network connection failure is "FIREWALL" option, which might be blocking connection request.
  4. In case of MAC machine, open "System Preferences==>Security & Privacy ==> Firewall ==> Turn Off Firewall". It will turn of FIREWALL on system.
  5. In case of other OS, please turn off FIREWALL with respective settings.

Now you should be able to connect through code as well direct through browser, hence there won't be any "SocketTimeoutException" error. Good Luck.

like image 7
Sagar Mahewar Avatar answered Nov 20 '22 02:11

Sagar Mahewar