Android Ping tool

MaxG.

Bekanntes Mitglied
Hi,
ich bin gerade dabei ein Ping tool zu Programmieren. Nachdem ich es als normales Java Programm programmiert hatte und es sehr gut funktioniert hat, habe ich mir gedacht das ich es auch als Android App programmieren könnte. Als ich meine App ausprobiert habe, viel mir auf das als Meldung immer "Host is not reatchable" zurück kommt. Genau wie in meinem Java Programm habe ich auch die Klasse
Code:
java.net.InetAddress.getByName(ipAddress).isReachable(5000);
verwendet.

Wie kommt es dazu das das Java Programm funktioniert und die Android App nicht?

Java:
package com.grohmann.pingtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.content.Context;
import android.widget.TextView;

import java.net.InetAddress;

public class MainActivity extends AppCompatActivity {

    Button buttonStartPing;
    EditText ipAdresse;
    RadioButton radioButton;
    RadioButton radioButtonURL;
    RadioGroup radioGroup;
    TextView textViewResults;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        buttonStartPing = (Button) findViewById(R.id.buttonPingStarten);
        ipAdresse = (EditText) findViewById(R.id.textFeldIPAdresse);
        radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
        textViewResults = (TextView) findViewById(R.id.textViewResults);
        radioButtonURL = (RadioButton) findViewById(R.id.radioButtonURL);
        final Context context = getApplicationContext();


        radioButtonURL.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ipAdresse.setText("https://");
            }
        });


        buttonStartPing.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String ip = ipAdresse.getText().toString();

                int selectedId = radioGroup.getCheckedRadioButtonId();
                radioButton = (RadioButton) findViewById(selectedId);

                String selectetButton = radioButton.getText().toString();

                if(selectetButton.equals("IP")){


                    boolean reachable = ping(ip);

                    textViewResults.setText((reachable) ? "Host ist reachable" : "Host is NOT reachable");


                }else{
                    boolean reachable = ping(ip);

                    textViewResults.setText((reachable) ? "Host ist reachable" : "Host is NOT reachable");
                }



            }
        });





    }

    public boolean ping(String ipAddress){
        boolean reachable = false;
        try{
            reachable = InetAddress.getByName(ipAddress).isReachable(5000);
        }catch (Exception e){
            e.printStackTrace();
        }

        return  reachable;
    }
}

Java:
package Sonstige;

import java.net.InetAddress;

public class PingTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        boolean reachable = false;
          
        try
        {
            reachable = InetAddress.getByName("10.36.56.11").isReachable(5000);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        System.out.println((reachable) ? "Host ist reachable" : "Host is NOT reachable");

    }

}
 

Robat

Top Contributor
Bekommst du eine Exception?
Hast du die Permissions INTERNET und ACCESS_NETWORK_STATE in der Manifest gesetzt?
 

MaxG.

Bekanntes Mitglied
hab meine Manifest.xml angepasst aber geht immer noch nicht bekomme auch keine Exeption
Java:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.grohmann.pingtest">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 

Robat

Top Contributor
Okay, hab noch mal in der AndroidDoc nachegelsen und festgestellt dass die #isReachable(int) Methode (wie bei Java auch) versucht einen ICMP ECHO REQUEST zu schicken. Sollte das Fehlschlagen wird versucht eine TCP Verbindung über Port 7 aufzubauen. Nun ist es so, dass viele Android Devices (zmd mMn / mEn) kein ICMP untersützen und die meisten Server keine TCP Connections über den Port 7 zulassen. (letzteres ist eher solides Halbwissen als ein Fakt von mir). Demnach kann es gut sein das die #isReachable(int) einfach immer abbricht und daher false zurückliefert.

Was du sonst noch versuchen könntest wäre dir eine eigene Methode zu schrieben die schaut ob eine IP angepingt werden kann.. sowas in der Art:

Java:
public boolean reachable(Context c)
{
    ConnectivityManager cManager = (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cManager.getActiveNetworkInfo();
  
    if(networkInfo != null && networkInfo.isConnected())
    {
         try
         {
               URL url = new URL("http://10.36.56.11"); // ip entsprechend ändern bspw zu: http://www.google.de
               HttpUrlConnection urlCon = (HttpUrlConnection) url.openConnection();
               urlCon.setConnectTimeout(1000); // in ms
               urlCon.connect();
            
               return (urlCon.getResponseCode() == 200); // 200 i= "OK"
            
         } catch (IOException e) {
            return false;
         }

    }

     return false; // Verbindung fehlgeschlagen 

}

Denk aber daran dass du die Verbindung nicht auf dem MainThread laufen lässt. Dir fliegt sonst eine Exception um die Ohren ;)

Gruß Robert
 

Neue Themen


Oben