如何用Java实现快速扫描当前局域网中的网络设备
1个回答
展开全部
在局域网环境中,首先需要解决下面两个问题:
1.局域网中任意一台计算机可以建立游戏服务器
2.局域网中的计算机可以寻找服务器,而不是玩家手工设置服务器的IP地址
建立服务器其实很简单,只要生成一个ServerSocketChannel,并且让其Socket监听自己挑选的一个计算机网络端口做为游戏服务器连接专用口即可.
建立并监听端口的程序代码如下:
public static final int PORT = 10997;
private ServerSocketChannel ssChannel;
-----------------------------------------------------------------
ssChannel = ServerSocketChannel.open();
ssChannel.configureBlocking(false);
ServerSocket ssocket = ssChannel.socket();
InetAddress iaddr = InetAddress.getLocalHost();
ssocket.bind(new InetSocketAddress(iaddr,PORT));
上面代码完成简单的初始化,并将ServerSocket绑定到本机的PORT端口.
客户机要连过来比较周折,因为不知道哪一台机器会成为服务器,所以需要扫描本网所有机器的PORT端口.
因此:
得到本机的IP地址,然后分析一下自己的机器在什么类型的网络中,程序中只简单处理了C类型的网络,我让程序从*.*.*.0开始一至扫描到255,得到所有可以连通的机器的IP地址.关于测试服务器PORT端口是否游戏服务器占用的代码没有给出,本文只观注扫描局域网内计算机的小方法.
扫描源程序完整如下:
import java.net.InetAddress;
public class Searcher {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress addr = InetAddress.getLocalHost();
byte[] addrs = addr.getAddress();
System.out.println(addr.getHostName());
for (int i = 0; i < addrs.length; i++) {
System.out.print((addrs[i] & 0xFF) + ".");
}
if ((addrs[0] & 0x80) == 0)
System.out.println("the ip class is A");
else if ((addrs[0] & 0xC0) == 0x80)
System.out.println("The ip class is B");
else if ((addrs[0] & 0xE0) == 0xC0){
System.out.println("The ip class is C");
addrs[3] = 0;
for(int i=0;i<256;i++){
InetAddress n = InetAddress.getByAddress(addrs);
if(n.isReachable(5)){
System.out.println(n);
}
addrs[3]++;
}
}
else if ((addrs[0] & 0xF0) == 0xE0)
System.out.println("The ip class is D");
else if ((addrs[0] & 0xF8) == 0xF0)
System.out.println("The ip class is E");
} catch (Exception e) {
// TODO: handle exception
}
}
}
1.局域网中任意一台计算机可以建立游戏服务器
2.局域网中的计算机可以寻找服务器,而不是玩家手工设置服务器的IP地址
建立服务器其实很简单,只要生成一个ServerSocketChannel,并且让其Socket监听自己挑选的一个计算机网络端口做为游戏服务器连接专用口即可.
建立并监听端口的程序代码如下:
public static final int PORT = 10997;
private ServerSocketChannel ssChannel;
-----------------------------------------------------------------
ssChannel = ServerSocketChannel.open();
ssChannel.configureBlocking(false);
ServerSocket ssocket = ssChannel.socket();
InetAddress iaddr = InetAddress.getLocalHost();
ssocket.bind(new InetSocketAddress(iaddr,PORT));
上面代码完成简单的初始化,并将ServerSocket绑定到本机的PORT端口.
客户机要连过来比较周折,因为不知道哪一台机器会成为服务器,所以需要扫描本网所有机器的PORT端口.
因此:
得到本机的IP地址,然后分析一下自己的机器在什么类型的网络中,程序中只简单处理了C类型的网络,我让程序从*.*.*.0开始一至扫描到255,得到所有可以连通的机器的IP地址.关于测试服务器PORT端口是否游戏服务器占用的代码没有给出,本文只观注扫描局域网内计算机的小方法.
扫描源程序完整如下:
import java.net.InetAddress;
public class Searcher {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress addr = InetAddress.getLocalHost();
byte[] addrs = addr.getAddress();
System.out.println(addr.getHostName());
for (int i = 0; i < addrs.length; i++) {
System.out.print((addrs[i] & 0xFF) + ".");
}
if ((addrs[0] & 0x80) == 0)
System.out.println("the ip class is A");
else if ((addrs[0] & 0xC0) == 0x80)
System.out.println("The ip class is B");
else if ((addrs[0] & 0xE0) == 0xC0){
System.out.println("The ip class is C");
addrs[3] = 0;
for(int i=0;i<256;i++){
InetAddress n = InetAddress.getByAddress(addrs);
if(n.isReachable(5)){
System.out.println(n);
}
addrs[3]++;
}
}
else if ((addrs[0] & 0xF0) == 0xE0)
System.out.println("The ip class is D");
else if ((addrs[0] & 0xF8) == 0xF0)
System.out.println("The ip class is E");
} catch (Exception e) {
// TODO: handle exception
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询