我也想知道,或许可以循环ping完局域网内所有IP,但这个肯定很慢。坐等高手!

解决方案 »

  1.   

    public class WifiDemoActivity extends Activity {
    private Button mTestButton;
    private WifiManager mWifiManager;
    private TextView iptextview;
    staticintthreadCount = 0;
    booleanisOver = false;
    staticintpingSize = 0;
    public ArrayList<Map<String, Object>> ping; // ping 后的结果集
    private ListView showiplistview;
     
    public ArrayList<Map<String, Object>> getPing() { // 用来得到ping后的结果集
    returnping;
    }
       public void setPing(ArrayList<Map<String, Object>> ping){
      this.ping=ping;
       }
    @Override
    protected void onPause() {
    System.exit(0);
    finish();
    super.onPause();
    }
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ping = new ArrayList<Map<String, Object>>();
    iptextview = (TextView) findViewById(R.id.IPTEXTVIEWID);
    mTestButton = (Button) findViewById(R.id.button1);
    showiplistview = (ListView) findViewById(R.id.SHOWIPLISTVIEWID);
    mTestButton.setOnClickListener(mAllClickListener);
    mWifiManager = (WifiManager) this
    .getSystemService(Context.WIFI_SERVICE);
    }
    @Override
    protected void onResume() {
    isOver = true;
    mUpdaHandler.sendMessage(createMessage(10003, null));
    super.onResume();
    }
    private View.OnClickListener mAllClickListener = new View.OnClickListener() {
     
    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
    if (ping.size() > 0) {
    ping.clear();
    ((IpAdapter) showiplistview.getAdapter()).setIpData(ping);
    }
    new Thread() {
    public void run() {
    WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
    mWifiManager.getConfiguredNetworks();
    List<WifiConfiguration> list = mWifiManager
    .getConfiguredNetworks();
    for (WifiConfiguration wifiConfiguration : list) {
    String ssid = wifiConfiguration.SSID;
    String mSsid = ssid.substring(1, ssid.length() - 1);
    String result = wifiConfiguration.toString();
    if (mSsid.equalsIgnoreCase(wifiInfo.getSSID())) {
    Log.d("Tag", wifiConfiguration.toString());
    try {
    int i = result.indexOf("LinkAddresses");
    int i1 = result.indexOf("Routes");
    String ipAddress = result
    .substring(i, i1)
    .trim()
    .substring(
    16,
    result.substring(i, i1)
    .length() - 6);
    Log.d("Tag", ipAddress);
    int i2 = result.indexOf("DnsAddresses");
    String mWifiIntAddress = result
    .substring(i2)
    .trim()
    .substring(
    15,
    result.substring(i2)
    .length() - 4);
    Log.d("Tag", "WifiInetAddresses   "
    + mWifiIntAddress);
    String[] s = { mWifiIntAddress, ipAddress };
    mUpdaHandler.sendMessage(createMessage(
    10002, s));
    PingAll(mWifiIntAddress);
    } catch (Exception e) {
    Log.e("Tag", "erro" + e);
    }
    }
    }
    }
    }.start();
     
    break;
     
    default:
    break;
    }
    }
    };
     
    public void PingAll(String hostAddress) {
    // 首先得到本机的IP,得到网段
    try {
    int k = 0;
    k = hostAddress.lastIndexOf(".");
    String ss = hostAddress.substring(0, k + 1);
    for (int i = 1; i <= 250; i++) { // 对所有局域网Ip
    String iip = ss + i;
    creatLog(WifiDemoActivity.class, "PingAll", iip, null);
    Ping(iip);
    }
     
    // 等着所有Ping结束
    while (isOver) {
    Thread.sleep(3000);
    if (threadCount == 0) {
    isOver = false;
    int k1 = 0;
    String result="";
    result=(String)ping.get(0).get("ip");
    k1=result.lastIndexOf(".");
    result=result.substring(k1+1,result.length());
    int mResult=Integer.valueOf(result);
    for(Map<String, Object> map:ping){
    String s=(String) map.get("ip");
    String s1= s.substring(k1+1,s.length());
    int mS1=Integer.valueOf(s1);
    mResult=mResult>mS1?mResult:mS1;
    }
    Log.d("Tag", ""+mResult);
    mUpdaHandler.sendMessage(createMessage(10003, null));
    }
    creatLog(WifiDemoActivity.class, "pingall", "wait......", null);
    }
    } catch (Exception e) {
    creatLog(WifiDemoActivity.class, "pingAll", "", e);
    }
    }
     
    public void Ping(String ip) {
    // 最多30个线程
    try {
    while (threadCount > 30) {
    Thread.sleep(2);
    }
    creatLog(WifiDemoActivity.class, "ping", threadCount + "", null);
    threadCount += 1;
    runPingIPprocess(ip);
    } catch (Exception e) {
    creatLog(WifiDemoActivity.class, "ping", null, e);
    }
    }
    public void runPingIPprocess(final String ipString) {
    final Thread pingThread = new Thread() {
     
    @Override
    public void run() {
    try {
    //ping ip地址  
    Process p = Runtime.getRuntime().exec(
    "ping -c 1 -w 5 " + ipString);
    int status = p.waitFor();
    if (status == 0) {
    Map<String, Object> map = new HashMap<String, Object>();
    creatLog(WifiDemoActivity.class, "runpingIpProcesses",
    "true" + ipString, null);
    map.put("ip", ipString);
    ping.add(map);
    pingSize++;
    if (pingSize > 10) {
    pingSize = 0;
    //setPing(ping);
    mUpdaHandler
    .sendMessage(createMessage(10001, ping));
    Log.d("Tag", "you are number");
    }
    creatLog(WifiDemoActivity.class, "run",
    ping.toString(), null);
    } else {
    creatLog(WifiDemoActivity.class, "runpingIPprocess",
    "false", null);
    }
    threadCount--;
    creatLog(WifiDemoActivity.class, "run now ",
    threadCount + "", null);
    } catch (Exception e) {
    threadCount--;
    creatLog(WifiDemoActivity.class, "runPingIpprocess", null,
    e);
    } finally {
    }
    }
    };
    pingThread.start();
    }
    private Handler mUpdaHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    IpAdapter adapter ;
    switch (msg.what) {
    case 10001:
    try {
    Log.d("Tag", ping.toString() + "over");
    ArrayList<Map<String, Object>> pings = (ArrayList<Map<String, Object>>) msg.obj;
    adapter = (IpAdapter) showiplistview.getAdapter();
    adapter.setIpData(getPing());
    creatLog(WifiDemoActivity.class, "10001", pings + "", null);
    adapter.notifyDataSetChanged();
                        isOver=true;
    } catch (Exception e) {
    creatLog(WifiDemoActivity.class, "1001", null, e);
    }
    break;
    case 10002:
    String[] s = (String[]) msg.obj;
    iptextview.setText("本机IP:" + s[1] + "\n路由器IP:" + s[0]);
    break;
    case 10003:
    adapter = new IpAdapter(WifiDemoActivity.this, ping);
    showiplistview.setAdapter(adapter);
    break;
    default:
    break;
    }
    }
    };
    public static Message createMessage(int what, Object object) {
    Message message = new Message();
    message.what = what;
    message.obj = object;
    return message;
    }
    public static void creatLog(Class class1, String where, String data,
    Exception e) {
    if (e != null) {
    Log.e(class1.getSimpleName() + "  "+where, "erro \n" + e);
    } else if (e == null) {
    Log.d(class1.getSimpleName() + "  "+where + "", data + "");
    }
    }
      

  2.   

    连接一般要先发现对方主机,然后再建立连接
    发现的过程可以有好多种
    你可以去那台机器上执行个命令一查就能知道,这是笨办法,也是连的机器不多的偷懒办法
    也可以对局域网进行一下扫描,PING或者其它的什么方式都行,
    其实也可以直接对局域网所有IP对要连的端口进行连接,如果有主机并能连上,肯定是能连的上,也省的专门去扫描了。
    希望对你有用
      

  3.   

    Ping 局域网内的所有端口,暂时没想到其他的。
      

  4.   

    System.exit(0);
    finish();
    这样用 要分清楚,不然出现错误。
      

  5.   

    换个思路的话,我想将一台手机设置成静态的ip,然后另一台直接去连接这个ip,
    可是为什么设置的静态ip没有起作用呢??
      

  6.   

    不好意思,您的IpAdapter是不是自己编写的类?如果是的话,请不吝赐教把IpAdapter以及前台xml代码都贴出来好吗?
      

  7.   

    我说说我的想法。手机往一个地址发组播消息,把自己的IP地址,端口发送出去。另一端接收数据包,解析出IP地址,端口,不就可以进行Socket通讯了吗?
      

  8.   

    求3楼的IpAdapter代码,[email protected]