我正在用java编写一个小游戏。有一个服务器和一个客户端模块。目前,每个客户端都必须手动输入服务器IP(在本地网络中)。这就是我在这里写这段代码的原因:
import java.net.*;
public class myIP {
public static void main (String argv[])
{
try{
InetAddress ownIP=InetAddress.getLocalHost();
String myIP = ownIP.getHostAddress();
System.out.println( "IP of my system is := "+ myIP );
}catch (Exception e){
System.out.println( "Exception caught ="+e.getMessage() );
}
}
}
这段代码返回机器的IP地址。有了这些信息(我自己的IP地址),我现在要检查此范围内的其他IP地址,以便自动查找服务器。
现在我不知道如何迭代这个IP范围。例如:如果“myIP”是10.0.0.5,我该如何修改该字符串,以便以10.0.0.6为例?如果它是一个整数值,每次添加1都很容易 - 但由于它是一个字符串 - 用点分隔 - 我不知道如何解决这个问题:)?
欢呼声
答案 0 :(得分:4)
这倾向于使用广播/多播来实现。这不是我曾经玩过的东西,因此无法为您提供任何代码,但this link提供了一个很好的解释。
编辑:它超越了你可以使用的MulticastSocket课程。
答案 1 :(得分:2)
因此,您需要将IPv4地址转换为Int并返回。
看看这是否有帮助:
http://teneo.wordpress.com/2008/12/23/java-ip-address-to-integer-and-back/
答案 2 :(得分:0)
你应该getAddress
将ip作为字节数组而不是getHostAdress
返回。
答案 3 :(得分:0)
以下是来自TechnoJeeves的代码示例。
import java.net.InetAddress;
public class ScanNet {
public static void main(String[] args) throws Exception {
int[] bounds = ScanNet.rangeFromCidr("192.168.1.255/24");
for (int i = bounds[0]; i <= bounds[1]; i++) {
String address = InetRange.intToIp(i);
InetAddress ip = InetAddress.getByName(address);
if (ip.isReachable(100)) { // Try for one tenth of a second
System.out.printf("Address %s is reachable\n", ip);
}
}
}
public static int[] rangeFromCidr(String cidrIp) {
int maskStub = 1 << 31;
String[] atoms = cidrIp.split("/");
int mask = Integer.parseInt(atoms[1]);
System.out.println(mask);
int[] result = new int[2];
result[0] = InetRange.ipToInt(atoms[0]) & (maskStub >> (mask - 1)); // lower bound
result[1] = InetRange.ipToInt(atoms[0]); // upper bound
System.out.println(InetRange.intToIp(result[0]));
System.out.println(InetRange.intToIp(result[1]));
return result;
}
static class InetRange {
public static int ipToInt(String ipAddress) {
try {
byte[] bytes = InetAddress.getByName(ipAddress).getAddress();
int octet1 = (bytes[0] & 0xFF) << 24;
int octet2 = (bytes[1] & 0xFF) << 16;
int octet3 = (bytes[2] & 0xFF) << 8;
int octet4 = bytes[3] & 0xFF;
int address = octet1 | octet2 | octet3 | octet4;
return address;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public static String intToIp(int ipAddress) {
int octet1 = (ipAddress & 0xFF000000) >>> 24;
int octet2 = (ipAddress & 0xFF0000) >>> 16;
int octet3 = (ipAddress & 0xFF00) >>> 8;
int octet4 = ipAddress & 0xFF;
return new StringBuffer().append(octet1).append('.').append(octet2)
.append('.').append(octet3).append('.')
.append(octet4).toString();
}
} }