Java/Network Protocol/IP Address
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
- 1 A class that performs some subnet calculations given a network address and a subnet mask.
- 2 An nslookup clone in Java
- 3 Convert a hostname to the equivalent IP address
- 4 Determine the IP address and hostname of the local machine
- 5 Display multiple IP addresses
- 6 Get all IP addresses
- 7 Get canonical host name
- 8 Get hostname by a byte array containing the IP address
- 9 Get IP
- 10 Getting the Hostname of an IP Address
- 11 Getting the IP Address and Hostname of the Local Machine
- 12 Looking for Port: 1024 -- 65536
- 13 Looking for Ports: 0 -- 1024
- 14 Looking for Port: start from 65535
- 15 Looking Up the Address of a Host
- 16 Perform Network Lookup with the InetAddress class
- 17 Report By Address
- 18 Resolves hostname and returns ip address as a string
- 19 Resolves ip address and returns host name as a string
- 20 Resolves string ip address and returns host name as a string
- 21 Retrieve the hostname of an IP Address
- 22 Retrieve the IP address of a hostname
A class that performs some subnet calculations given a network address and a subnet mask.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* A class that performs some subnet calculations given a network address and a subnet mask.
* @see http://www.faqs.org/rfcs/rfc1519.html
* @author <rwinston@apache.org>
* @since 2.0
*/
public class SubnetUtils {
private static final String IP_ADDRESS = "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})";
private static final String SLASH_FORMAT = IP_ADDRESS + "/(\\d{1,3})";
private static final Pattern addressPattern = Pattern.rupile(IP_ADDRESS);
private static final Pattern cidrPattern = Pattern.rupile(SLASH_FORMAT);
private static final int NBITS = 32;
private int netmask = 0;
private int address = 0;
private int network = 0;
private int broadcast = 0;
/**
* Constructor that takes a CIDR-notation string, e.g. "192.168.0.1/16"
* @param cidrNotation A CIDR-notation string, e.g. "192.168.0.1/16"
*/
public SubnetUtils(String cidrNotation) {
calculate(cidrNotation);
}
/**
* Constructor that takes two dotted decimal addresses.
* @param address An IP address, e.g. "192.168.0.1"
* @param mask A dotted decimal netmask e.g. "255.255.0.0"
*/
public SubnetUtils(String address, String mask) {
calculate(toCidrNotation(address, mask));
}
/**
* Convenience container for subnet summary information.
*
*/
public final class SubnetInfo {
private SubnetInfo() {}
private int netmask() { return netmask; }
private int network() { return network; }
private int address() { return address; }
private int broadcast() { return broadcast; }
private int low() { return network() + 1; }
private int high() { return broadcast() - 1; }
public boolean isInRange(String address) { return isInRange(toInteger(address)); }
private boolean isInRange(int address) { return ((address-low()) <= (high()-low())); }
public String getBroadcastAddress() { return format(toArray(broadcast())); }
public String getNetworkAddress() { return format(toArray(network())); }
public String getNetmask() { return format(toArray(netmask())); }
public String getAddress() { return format(toArray(address())); }
public String getLowAddress() { return format(toArray(low())); }
public String getHighAddress() { return format(toArray(high())); }
public int getAddressCount() { return (broadcast() - low()); }
public int asInteger(String address) { return toInteger(address); }
public String getCidrSignature() {
return toCidrNotation(
format(toArray(address())),
format(toArray(netmask()))
);
}
public String[] getAllAddresses() {
String[] addresses = new String[getAddressCount()];
for (int add = low(), j=0; add <= high(); ++add, ++j) {
addresses[j] = format(toArray(add));
}
return addresses;
}
}
/**
* Return a {@link SubnetInfo} instance that contains subnet-specific statistics
* @return
*/
public final SubnetInfo getInfo() { return new SubnetInfo(); }
/*
* Initialize the internal fields from the supplied CIDR mask
*/
private void calculate(String mask) {
Matcher matcher = cidrPattern.matcher(mask);
if (matcher.matches()) {
address = matchAddress(matcher);
/* Create a binary netmask from the number of bits specification /x */
int cidrPart = rangeCheck(Integer.parseInt(matcher.group(5)), 0, NBITS-1);
for (int j = 0; j < cidrPart; ++j) {
netmask |= (1 << 31-j);
}
/* Calculate base network address */
network = (address & netmask);
/* Calculate broadcast address */
broadcast = network | ~(netmask);
}
else
throw new IllegalArgumentException("Could not parse [" + mask + "]");
}
/*
* Convert a dotted decimal format address to a packed integer format
*/
private int toInteger(String address) {
Matcher matcher = addressPattern.matcher(address);
if (matcher.matches()) {
return matchAddress(matcher);
}
else
throw new IllegalArgumentException("Could not parse [" + address + "]");
}
/*
* Convenience method to extract the components of a dotted decimal address and
* pack into an integer using a regex match
*/
private int matchAddress(Matcher matcher) {
int addr = 0;
for (int i = 1; i <= 4; ++i) {
int n = (rangeCheck(Integer.parseInt(matcher.group(i)), 0, 255));
addr |= ((n & 0xff) << 8*(4-i));
}
return addr;
}
/*
* Convert a packed integer address into a 4-element array
*/
private int[] toArray(int val) {
int ret[] = new int[4];
for (int j = 3; j >= 0; --j)
ret[j] |= ((val >>> 8*(3-j)) & (0xff));
return ret;
}
/*
* Convert a 4-element array into dotted decimal format
*/
private String format(int[] octets) {
StringBuilder str = new StringBuilder();
for (int i =0; i < octets.length; ++i){
str.append(octets[i]);
if (i != octets.length - 1) {
str.append(".");
}
}
return str.toString();
}
/*
* Convenience function to check integer boundaries
*/
private int rangeCheck(int value, int begin, int end) {
if (value >= begin && value <= end)
return value;
throw new IllegalArgumentException("Value out of range: [" + value + "]");
}
/*
* Count the number of 1-bits in a 32-bit integer using a divide-and-conquer strategy
* see Hacker"s Delight section 5.1
*/
int pop(int x) {
x = x - ((x >>> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >>> 2) & 0x33333333);
x = (x + (x >>> 4)) & 0x0F0F0F0F;
x = x + (x >>> 8);
x = x + (x >>> 16);
return x & 0x0000003F;
}
/* Convert two dotted decimal addresses to a single xxx.xxx.xxx.xxx/yy format
* by counting the 1-bit population in the mask address. (It may be better to count
* NBITS-#trailing zeroes for this case)
*/
private String toCidrNotation(String addr, String mask) {
return addr + "/" + pop(toInteger(mask));
}
}
An nslookup clone in Java
import java.io.DataInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* An "nslookup" clone in Java.
*
* @author Elliot Rusty Harold, O"Reilly & Associates
*/
public class JavaLookup {
public static void main(String args[]) {
if (args.length > 0) { // use command line
for (int i = 0; i < args.length; i++) {
lookup(args[i]);
}
} else {
DataInputStream myInputStream = new DataInputStream(System.in);
System.out
.println("Enter names and IP addresses. Enter \"exit\" to quit.");
while (true) {
String s;
try {
s = myInputStream.readLine();
} catch (IOException e) {
break;
}
if (s.equals("exit"))
break;
if (s.equals("quit"))
break;
if (s.charAt(0) == "\004")
break; // unix ^D
lookup(s);
}
}
} /* end main */
private static void lookup(String s) {
InetAddress thisComputer;
byte[] address;
// get the bytes of the IP address
try {
thisComputer = InetAddress.getByName(s);
address = thisComputer.getAddress();
} catch (UnknownHostException ue) {
System.out.println("Cannot find host " + s);
return;
}
if (isHostname(s)) {
// Print the IP address
for (int i = 0; i < address.length; i++) {
int unsignedByte = address[i] < 0 ? address[i] + 256
: address[i];
System.out.print(unsignedByte + ".");
}
System.out.println();
} else { // this is an IP address
try {
System.out.println(InetAddress.getByName(s));
} catch (UnknownHostException e) {
System.out.println("Could not lookup the address " + s);
}
}
} // end lookup
private static boolean isHostname(String s) {
char[] ca = s.toCharArray();
// if we see a character that is neither a digit nor a period
// then s is probably a hostname
for (int i = 0; i < ca.length; i++) {
if (!Character.isDigit(ca[i])) {
if (ca[i] != ".") {
return true;
}
}
}
// Everything was either a digit or a period
// so s looks like an IP address in dotted quad format
return false;
} // end isHostName
} // end javalookup
Convert a hostname to the equivalent IP address
import java.net.InetAddress;
import java.net.UnknownHostException;
public class GetIP {
public static void main(String[] args) {
InetAddress address = null;
try {
address = InetAddress.getByName("www.jexp.ru");
} catch (UnknownHostException e) {
System.exit(2);
}
System.out.println(address.getHostName() + "="
+ address.getHostAddress());
System.exit(0);
}
}
Determine the IP address and hostname of the local machine
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
InetAddress addr = InetAddress.getLocalHost();
// Get IP Address
byte[] ipAddr = addr.getAddress();
// Get hostname
String hostname = addr.getHostName();
}
}
Display multiple IP addresses
import java.net.*;
public class GetAllIP {
public static void main(String [] args) throws Exception {
InetAddress[] addr = InetAddress.getAllByName("www.jexp.ru");
for (int i=0;i<addr.length;i++)
System.out.println(addr[i]);
}
}
Get all IP addresses
import java.net.InetAddress;
public class Main {
public static void main(String[] args) throws Exception {
InetAddress[] addr = InetAddress.getAllByName(args[0]);
for (int i = 0; i < addr.length; i++)
System.out.println(addr[i]);
}
}
Get canonical host name
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
byte[] ipAddr = new byte[] { 127, 0, 0, 1 };
InetAddress addr = InetAddress.getByAddress(ipAddr);
String hostnameCanonical = addr.getCanonicalHostName();
}
}
Get hostname by a byte array containing the IP address
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
byte[] ipAddr = new byte[] { 127, 0, 0, 1 };
InetAddress addr = InetAddress.getByAddress(ipAddr);
}
}
Get IP
import java.net.InetAddress;
public class Main {
public static void main(String[] args) throws Exception {
InetAddress address = null;
if (args.length == 0) {
System.out.println("usage: GetIP host");
System.exit(1);
}
address = InetAddress.getByName(args[0]);
System.out.println(address.getHostName() + "=" + address.getHostAddress());
System.exit(0);
}
}
Getting the Hostname of an IP Address
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
// Get hostname by textual representation of IP address
InetAddress addr = InetAddress.getByName("127.0.0.1");
}
}
Getting the IP Address and Hostname of the Local Machine
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
InetAddress addr = InetAddress.getLocalHost();
// Get IP Address
byte[] ipAddr = addr.getAddress();
// Get hostname
String hostname = addr.getHostName();
}
}
Looking for Port: 1024 -- 65536
import java.net.*;
import java.io.*;
public class lookForPorts2 {
public static void main(String[] args) {
Socket theSocket;
String host = "localhost";
if (args.length > 0) {
host = args[0];
}
try {
InetAddress theAddress = InetAddress.getByName(host);
for (int i = 1024; i < 65536; i++) {
try {
System.out.println("Looking for port "+ i);
theSocket = new Socket(theAddress, i);
System.out.println("There is a server on port " + i + " of " + host);
} catch (IOException e) {
// must not be a server on this port
}
}
} catch (UnknownHostException e) {
System.err.println(e);
}
}
}
Looking for Ports: 0 -- 1024
import java.net.*;
import java.io.*;
public class lookForPorts {
public static void main(String[] args) {
Socket theSocket;
String host = "localhost";
if (args.length > 0) {
host = args[0];
}
for (int i = 0; i < 1024; i++) {
try {
System.out.println("Looking for "+ i);
theSocket = new Socket(host, i);
System.out.println("There is a server on port " + i + " of " + host);
}
catch (UnknownHostException e) {
System.err.println(e);
break;
}
catch (IOException e) {
// must not be a server on this port
}
}
}
}
Looking for Port: start from 65535
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class lookForPorts3 {
public static void main(String[] args) {
Socket theSocket;
String host = "localhost";
if (args.length > 0) {
host = args[0];
}
try {
InetAddress theAddress = InetAddress.getByName(host);
for (int i = 1; i <= 65535; i++) {
try {
theSocket = new Socket(host, i);
System.out.println("There is a server on port " + i + " of " + host);
theSocket.close();
} catch (IOException e) {
// must not be a server on this port
}
}
} catch (UnknownHostException e) {
System.err.println(e);
}
}
}
Looking Up the Address of a Host
import java.net.InetAddress;
import java.net.UnknownHostException;
public class DNSLookup {
public static void main(String args[]) {
try {
InetAddress host;
if (args.length == 0) {
host = InetAddress.getLocalHost();
} else {
host = InetAddress.getByName(args[0]);
}
System.out.println("Host:"" + host.getHostName()
+ "" has address: " + host.getHostAddress());
byte bytes[] = host.getAddress();
int fourBytes[] = new int[bytes.length];
for (int i = 0, n = bytes.length; i < n; i++) {
fourBytes[i] = bytes[i] & 255;
}
System.out.println("\t" + fourBytes[0] + "." + fourBytes[1] + "."
+ fourBytes[2] + "." + fourBytes[3]);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
Perform Network Lookup with the InetAddress class
import java.net.InetAddress;
public class Main {
public static void main(String[] args) throws Exception{
InetAddress inetHost = InetAddress.getByName("www.google.ru");
String hostName = inetHost.getHostName();
System.out.println(hostName);
System.out.println(inetHost.getHostAddress());
}
}
Report By Address
import java.net.InetAddress;
import java.net.NetworkInterface;
public class Main {
static public void main(String args[]) throws Exception {
InetAddress ia = InetAddress.getByName(args[0]);
NetworkInterface ni = NetworkInterface.getByInetAddress(ia);
System.out.println(ni);
}
}
Resolves hostname and returns ip address as a string
// Copyright (c) 2003-2009, Jodd Team (jodd.org). All Rights Reserved.
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
/**
* Network utilities.
*/
public class NetUtil {
/**
* Resolves hostname and returns ip address as a string.
*/
public static String resolveHost(String hostname) {
try {
InetAddress addr = Inet4Address.getByName(hostname);
byte[] ipAddr = addr.getAddress();
StringBuilder ipAddrStr = new StringBuilder(15);
for (int i = 0; i < ipAddr.length; i++) {
if (i > 0) {
ipAddrStr.append(".");
}
ipAddrStr.append(ipAddr[i] & 0xFF);
}
return ipAddrStr.toString();
} catch (UnknownHostException uhex) {
return null;
}
}
/**
* Resolves string ip address and returns host name as a string.
*/
public static String resolveIp(String ip) {
try {
InetAddress addr = InetAddress.getByName(ip);
return addr.getHostName();
} catch (UnknownHostException uhex) {
return null;
}
}
/**
* Resolves ip address and returns host name as a string.
*/
public static String resolveIp(byte[] ip) {
try {
InetAddress addr = InetAddress.getByAddress(ip);
return addr.getHostName();
} catch (UnknownHostException uhex) {
return null;
}
}
}
Resolves ip address and returns host name as a string
// Copyright (c) 2003-2009, Jodd Team (jodd.org). All Rights Reserved.
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
/**
* Network utilities.
*/
public class NetUtil {
/**
* Resolves hostname and returns ip address as a string.
*/
public static String resolveHost(String hostname) {
try {
InetAddress addr = Inet4Address.getByName(hostname);
byte[] ipAddr = addr.getAddress();
StringBuilder ipAddrStr = new StringBuilder(15);
for (int i = 0; i < ipAddr.length; i++) {
if (i > 0) {
ipAddrStr.append(".");
}
ipAddrStr.append(ipAddr[i] & 0xFF);
}
return ipAddrStr.toString();
} catch (UnknownHostException uhex) {
return null;
}
}
/**
* Resolves string ip address and returns host name as a string.
*/
public static String resolveIp(String ip) {
try {
InetAddress addr = InetAddress.getByName(ip);
return addr.getHostName();
} catch (UnknownHostException uhex) {
return null;
}
}
/**
* Resolves ip address and returns host name as a string.
*/
public static String resolveIp(byte[] ip) {
try {
InetAddress addr = InetAddress.getByAddress(ip);
return addr.getHostName();
} catch (UnknownHostException uhex) {
return null;
}
}
}
Resolves string ip address and returns host name as a string
// Copyright (c) 2003-2009, Jodd Team (jodd.org). All Rights Reserved.
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
/**
* Network utilities.
*/
public class NetUtil {
/**
* Resolves hostname and returns ip address as a string.
*/
public static String resolveHost(String hostname) {
try {
InetAddress addr = Inet4Address.getByName(hostname);
byte[] ipAddr = addr.getAddress();
StringBuilder ipAddrStr = new StringBuilder(15);
for (int i = 0; i < ipAddr.length; i++) {
if (i > 0) {
ipAddrStr.append(".");
}
ipAddrStr.append(ipAddr[i] & 0xFF);
}
return ipAddrStr.toString();
} catch (UnknownHostException uhex) {
return null;
}
}
/**
* Resolves string ip address and returns host name as a string.
*/
public static String resolveIp(String ip) {
try {
InetAddress addr = InetAddress.getByName(ip);
return addr.getHostName();
} catch (UnknownHostException uhex) {
return null;
}
}
/**
* Resolves ip address and returns host name as a string.
*/
public static String resolveIp(byte[] ip) {
try {
InetAddress addr = InetAddress.getByAddress(ip);
return addr.getHostName();
} catch (UnknownHostException uhex) {
return null;
}
}
}
Retrieve the hostname of an IP Address
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
InetAddress addr = InetAddress.getByName("127.0.0.1");
byte[] ipAddr = new byte[] { 127, 0, 0, 1 };
addr = InetAddress.getByAddress(ipAddr);
// Get the host name
String hostname = addr.getHostName();
// Get canonical host name
String canonicalhostname = addr.getCanonicalHostName();
}
}
Retrieve the IP address of a hostname
import java.net.InetAddress;
public class Main {
public static void main(String[] argv) throws Exception {
InetAddress addr = InetAddress.getByName("java-tips.org");
byte[] ipAddr = addr.getAddress();
// Convert to dot representation
String ipAddrStr = "";
for (int i = 0; i < ipAddr.length; i++) {
if (i > 0) {
ipAddrStr += ".";
}
ipAddrStr += ipAddr[i] & 0xFF;
}
}
}