获取内网的所有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
}
通过获取本机的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
// 获得迭代器对象
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 {
// 获得所ping的IP进程,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(); // 输出异常信息
}
}
效果