Java获取内网所有IP地址以及创建套接字

获取内网的所有IP地址

在进行网络编程时,有时候需要对局域网内的所有主机进行遍历,获得内网的所有IP地址

首先创建一个继承JFrame类的窗体类

GetIpFrame类构造方法,在窗体类放置内容面板,再在面板上添加两个按钮,在设置滚动面板时添加一个文本域控件,用于显示获取到IP

public GetIpFrame() {

        super();

        addWindowListener(new WindowAdapter() {

            public void windowOpened(final WindowEvent e) {

                    gainAllIp();

                    ta_allIp.setText(null);

            }

        });

       // 省略了部分非关键代码

        final JButton button_2 = new JButton();

        button_2.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {

                try {

                    ta_allIp.setText(null);

                    gainAllIp();

                } catch (Exception e1) {

                    ta_allIp.setText(null);

                }

            }

        });

        button_2.setText("显示IP");

        panel.add(button_2); //将按钮添加到面板中

        final JButton button = new JButton();

        button.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {

                System.exit(0);

            }

        });

        button.setText("退出");

        panel.add(button);

        pingMap = new Hashtable<String, String>();

    }

通过获取本机的IP地址所属的网段,然后Ping网络中的IP地址通过输入流对象读取所Ping结果,并判断是否为内网的IP地址。

public void gainAllIp() throws Exception {// 获得所有IP,并显示在文本域中的方法

// 获得本机的InetAddress对象

        InetAddress host = InetAddress.getLocalHost();

        String hostAddress = host.getHostAddress();// 获得本机的IP地址

// 获得IP地址中最后一个点的位置

        int pos = hostAddress.lastIndexOf(".");

// 对本机的IP进行截取,获得网段

        String wd = hostAddress.substring(0, pos + 1);

        for (int i = 1; i <= 200; i++) { // 对局域网的IP地址进行遍历

            String ip = wd + i;// 生成IP地址

            PingIpThread thread = new PingIpThread(ip);// 创建线程对象

            thread.start();// 启动线程对象

        }

// 获得集合中键的Set视图

        Set<String> set = pingMap.keySet();

// 获得迭代器对象

        Iterator<String> it = set.iterator();

        while (it.hasNext()) {

            String key = it.next();

// 获取指定键的值

            String value = pingMap.get(key);

            if (value.equals("true")) {

// IP地址显示追加到文本域中

                ta_allIp.append(key + "\n");

            }

        }

    }

定义一个名为PingIpThread的线程类,用于Ping指定的IP地址,判断是否有效的内网IP地址,如果是有效的内网IP地址,就添加到集合对象中

class PingIpThread extends Thread {// 判断给定IP是否为内网IP的线程对象

        public String ip; // 表示IP地址的成员变量

        public PingIpThread(String ip) {// 参数为需要判断的IP地址

            this.ip = ip;

        }

        public void run() {

            try {

          // 获得所pingIP进程,280是等待每次回复的超时时间

                Process process = Runtime.getRuntime().exec(

                        "ping" + ip + " -w 280 -n 1");

                InputStream is= process.getInputStream();//获得进程的输入流对象

// 创建InputStreamReader对象

                InputStreamReader isr = new InputStreamReader(is);                BufferedReader in = new BufferedReader(isr);// 创建缓冲字符流对象

                String line = in.readLine();// 读取信息

                while (line != null) {

                    if (line != null && !line.equals("")) {

                        if (line.substring(0, 2).equals("来自")

                                || (line.length() > 10 && line.substring(0, 10)

                                        .equals("Reply from"))) {// 判断是ping通过的IP地址

                            pingMap.put(ip, "true");// 向集合中添加IP

                        }

                    }

                    line = in.readLine();// 再读取信息

                }

            } catch (IOException e) {

            }

        }

}

效果,由于我这没有连接的主机IP,所以没有显示出来

 

 

 

创建服务端套接字

网络编程中,需要先运行服务器程序,服务端运行后要等待客户端的连接,因此需要建立服务器套接字,并等待客户端的连接

关键代码如下

public void getServer() {

        try {

            server = new ServerSocket(1978); // 实例化Socket对象

            ta_info.append("服务器套接字创建成功\n"); // 输出信息

            while (true) { // 如果套接字是连接状态

                ta_info.append("等待连接......\n"); // 输出信息

                socket = server.accept(); // 实例化Socket对象

                ta_info.append("连接成功......\n");

            }

        } catch (Exception e) {

            e.printStackTrace();  

        }

    }

主要通过ServerSocket类创建绑定到指定端口的服务器套接字对象,然后调用ServerSocket类的accept()方法监听客户端的连接。

 

建立客户端套接字(关键代码)

下面方法是主要通过Socket类创建指定服务器和端口的套接字对象

private void connect() { // 连接套接字方法

        ta_info.append("正在尝试连接......\n"); // 文本域中信息信息

        try { //第一个参数为主机名或IP地址,第二个连接到服务器的端口号

            socket = new Socket("127.0.0.1", 1998); // 实例化Socket对象

            ta_info.append("完成连接。\n"); // 文本域中提示信息

        } catch (Exception e) {

            e.printStackTrace(); // 输出异常信息

        }

}

效果

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值