'Android:SocketTimeoutException: failed to connect to /103.24.4.60 (port 80) after 30000ms
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();
}
}
Solution 1:[1]
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
Solution 2:[2]
This issue can occur due to FIREWALL, please check below steps to resolve it
- Check whether you can connect directly through URL, using any of browser instead of Android app.
- If it fails, then it could be an issue with network connectivity not with android code.
- One of reason behind Network connection failure is "FIREWALL" option, which might be blocking connection request.
- In case of MAC machine, open "System Preferences==>Security & Privacy ==> Firewall ==> Turn Off Firewall". It will turn of FIREWALL on system.
- 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.
Solution 3:[3]
The issue was resolved when my phone was connected to the local server wifi in which the webservices were hosted.
Solution 4:[4]
If you are using an emulator in android studio, and have never accessed the network through it, then try launching the browser and accepting the agreement.
Solution 5:[5]
for window user
type ipconfig in your cmd find out the ipv4 IP address, it is your post URL IP address then find out the port number and disable your network firework
done
Solution 6:[6]
My android phone had AnonyTun (vpn app) connected. Disconnecting was the solution.
Solution 7:[7]
Sometimes if your system from where you are trying to start Metro bundler is connected to VPN will cause such errors.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Community |
| Solution 2 | Sagar Mahewar |
| Solution 3 | shiny vn |
| Solution 4 | ??????? ????????? |
| Solution 5 | Michael |
| Solution 6 | RonaldPaguay |
| Solution 7 | Anuj sharma |
