Android:手机扫描局域网所有ip,并进行socket通讯

Android手机局域网扫描PC机,利用android的ping命令扫描局域网内所有ip,并对其进行socket通信
import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;
import org.apache.http.conn.util.InetAddressUtils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
 
public class NetTool {
   
   
  private int SERVERPORT = 8888;
   
  private String locAddress;//存储本机ip,例:本地ip :192.168.1.
   
  private Runtime run = Runtime.getRuntime();//获取当前运行环境,来执行ping,相当于windows的cmd
   
  private Process proc = null;
   
  private String ping = "ping -c 1 -w 0.5 " ;//其中 -c 1为发送的次数,-w 表示发送后等待响应的时间
   
  private int j;//存放ip最后一位地址 0-255
   
  private Context ctx;//上下文
   
  public NetTool(Context ctx){
    this.ctx = ctx;
  }
 
 
 
  private Handler handler = new Handler(){
     
    public void dispatchMessage(Message msg) {
      switch (msg.what) {
       
      case 222:// 服务器消息
        break;
         
      case 333:// 扫描完毕消息
        Toast.makeText(ctx, "扫描到主机:"+((String)msg.obj).substring(6), Toast.LENGTH_LONG).show();
         
        break;
      case 444://扫描失败
        Toast.makeText(ctx, (String)msg.obj, Toast.LENGTH_LONG).show();
        break;
      }
    }
 
  };
   
 
 
  //向serversocket发送消息
  public String sendMsg(String ip,String msg) {
     
    String res = null;
    Socket socket = null;
     
    try {
      socket = new Socket(ip, SERVERPORT);
      //向服务器发送消息
      PrintWriter os = new PrintWriter(socket.getOutputStream());
      os.println(msg);
      os.flush();// 刷新输出流,使Server马上收到该字符串
       
      //从服务器获取返回消息
      DataInputStream input = new DataInputStream(socket.getInputStream());  
      res = input.readUTF();
      System.out.println("server 返回信息:" + res);
      Message.obtain(handler, 222, res).sendToTarget();//发送服务器返回消息
 
    } catch (Exception unknownHost) {
      System.out.println("You are trying to connect to an unknown host!");
    } finally {
      // 4: Closing connection
      try {
        if (socket != null) {
          socket.close();
        }
      } catch (IOException ioException) {
        ioException.printStackTrace();
      }
    }
    return res;
  }
   
 
 
  /**
   * 扫描局域网内ip,找到对应服务器
   */
  public void scan(){
     
    locAddress = getLocAddrIndex();//获取本地ip前缀
     
    if(locAddress.equals("")){
      Toast.makeText(ctx, "扫描失败,请检查wifi网络", Toast.LENGTH_LONG).show();
      return ;
    }
     
    for ( int i = 0; i < 256; i++) {//创建256个线程分别去ping
       
      j = i ;
       
      new Thread(new Runnable() {
         
        public void run() {
           
          String p = NetTool.this.ping + locAddress + NetTool.this.j ;
           
          String current_ip = locAddress+ NetTool.this.j;
           
          try {
            proc = run.exec(p);
             
            int result = proc.waitFor();
            if (result == 0) {
              System.out.println("连接成功" + current_ip);
              // 向服务器发送验证信息
              String msg = sendMsg(current_ip,"scan"+getLocAddress()+" ( "+android.os.Build.MODEL+" ) ");
               
              //如果验证通过...
              if (msg != null){
                if (msg.contains("OK")){
                  System.out.println("服务器IP:" + msg.substring(8,msg.length()));
                  Message.obtain(handler, 333, msg.substring(2,msg.length())).sendToTarget();//返回扫描完毕消息
                }
              }
            } else {
               
            }
          } catch (IOException e1) {
            e1.printStackTrace();
          } catch (InterruptedException e2) {
            e2.printStackTrace();
          } finally {
            proc.destroy();
          }
        }
      }).start();
       
    }
     
  }
 
   
  //获取本地ip地址
  public String getLocAddress(){
     
    String ipaddress = "";
     
    try {
      Enumeration<networkinterface> en = NetworkInterface.getNetworkInterfaces();
      // 遍历所用的网络接口
      while (en.hasMoreElements()) {
        NetworkInterface networks = en.nextElement();
        // 得到每一个网络接口绑定的所有ip
        Enumeration<inetaddress> address = networks.getInetAddresses();
        // 遍历每一个接口绑定的所有ip
        while (address.hasMoreElements()) {
          InetAddress ip = address.nextElement();
          if (!ip.isLoopbackAddress()
              && InetAddressUtils.isIPv4Address(ip.getHostAddress())) {
            ipaddress = ip.getHostAddress();
          }
        }
      }
    } catch (SocketException e) {
      Log.e("", "获取本地ip地址失败");
      e.printStackTrace();
    }
     
    System.out.println("本机IP:" + ipaddress);
     
    return ipaddress;
 
  }
   
  //获取IP前缀
  public String getLocAddrIndex(){
     
    String str = getLocAddress();
     
    if(!str.equals("")){
      return str.substring(0,str.lastIndexOf(".")+1);
    }
     
    return null;
  }
   
  //获取本机设备名称
  public String getLocDeviceName() {
     
    return android.os.Build.MODEL;
     
  }
   
   
}
 
</inetaddress>
</networkinterface>


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值