How to get external IP successfully

前端 未结 9 1268
耶瑟儿~
耶瑟儿~ 2020-12-03 16:16

After reading: Getting the 'external' IP address in Java

code:

public static void main(String[] args) throws IOException
{
    URL whatismyip         


        
9条回答
  •  情歌与酒
    2020-12-03 16:52

    This is how I do it with rxJava2 and Butterknife. You'll want to run the networking code in another thread because you'll get an exception for running network code on the main thread! I use rxJava instead of AsyncTask because the rxJava cleans up nicely when the user moves on to the next UI before the thread is finished. (this is super useful for very busy UI's)

    public class ConfigurationActivity extends AppCompatActivity {
    
        // VIEWS
        @BindView(R.id.externalip) TextInputEditText externalIp;//this could be TextView, etc.
    
        // rxJava - note: I have this line in the base class - for demo purposes it's here
        private CompositeDisposable compositeSubscription = new CompositeDisposable();
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_wonderful_layout);
    
            ButterKnife.bind(this);
    
            getExternalIpAsync();
        }
    
        // note: I have this code in the base class - for demo purposes it's here
        @Override
        protected void onStop() {
            super.onStop();
            clearRxSubscriptions();
        }
    
        // note: I have this code in the base class - for demo purposes it's here
        protected void addRxSubscription(Disposable subscription) {
            if (compositeSubscription != null) compositeSubscription.add(subscription);
        }
    
        // note: I have this code in the base class - for demo purposes it's here
        private void clearRxSubscriptions() {
            if (compositeSubscription != null) compositeSubscription.clear();
        }
    
        private void getExternalIpAsync() {
            addRxSubscription(
                    Observable.just("")
                            .map(s -> getExternalIp())
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe((String ip) -> {
                                if (ip != null) {
                                    externalIp.setText(ip);
                                }
                            })
            );
        }
    
        private String getExternalIp() {
            String externIp = null;
            try {
                URL connection = new URL("http://checkip.amazonaws.com/");
                URLConnection con = connection.openConnection(Proxy.NO_PROXY);
                con.setConnectTimeout(1000);//low value for quicker result (otherwise takes about 20secs)
                con.setReadTimeout(5000);
                BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                externIp = reader.readLine();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return externIp;
        }
    }
    

    UPDATE - I've found that URLConnection is really quite shit; it'll take a long time to get a result, not really time out very well, etc. The code below improves the situation with OKhttp

    private String getExternalIp() {
        String externIp = "no connection";
        OkHttpClient client = new OkHttpClient();//should have this as a member variable
        try {
            String url = "http://checkip.amazonaws.com/";
            Request request = new Request.Builder().url(url).build();
            Response response = client.newCall(request).execute();
            ResponseBody responseBody = response.body();
            if (responseBody != null) externIp = responseBody.string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return externIp;
    }
    

提交回复
热议问题