我正在编写一个简单的网络应用程序...我需要知道我的机器在网络上的真实IP,如192.168.1.3。 getLocalHost返回127.0.0.1(在Linux上,dunno,如果它在Windows上是相同的)怎么做?;
答案 0 :(得分:33)
如果您确实想要使用计算机上的所有IP地址,您可以使用NetworkInterface类。当然,那么你需要使用你真正想要使用的那个,但这取决于你使用它的方式会有所不同,或者你可能需要扩展你使用它来计算多个地址的方式。
import java.net.*;
import java.util.*;
public class ShowInterfaces
{
public static void main(String[] args) throws Exception
{
System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1"
Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
for (; n.hasMoreElements();)
{
NetworkInterface e = n.nextElement();
System.out.println("Interface: " + e.getName());
Enumeration<InetAddress> a = e.getInetAddresses();
for (; a.hasMoreElements();)
{
InetAddress addr = a.nextElement();
System.out.println(" " + addr.getHostAddress());
}
}
}
}
答案 1 :(得分:21)
由于机器可能有多个地址,因此很难确定哪一个适合您。通常,您希望系统根据其路由表分配IP。结果取决于您要连接的IP,有一个简单的诀窍:只需创建连接并查看您从操作系统获得的地址:
// output on my machine: "192.168.1.102"
Socket s = new Socket("192.168.1.1", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
// output on my machine: "127.0.1.1"
System.out.println(InetAddress.getLocalHost().getHostAddress());
我不确定在没有建立连接的情况下是否可以这样做。我想我曾经设法用Perl(或C?)来做,但不要问我关于Java的问题。我认为有可能在没有实际连接的情况下创建UDP套接字(DatagramSocket)。
如果路上有NAT路由器,您将无法获得远程主机将看到的IP。但是,正如你给192. *作为一个例子,我认为你不在乎。
答案 2 :(得分:18)
修复它:
找到您的主机名。输入:hostname
。例如,您发现主机名为mycomputer.xzy.com
将您的主机名放在hosts文件中。 /etc/hosts
。如
10.50.16.136 mycomputer.xzy.com
答案 3 :(得分:11)
这是一种避免IPv6和Loopback结果的方法。
public InetAddress getCurrentIp() {
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) networkInterfaces
.nextElement();
Enumeration<InetAddress> nias = ni.getInetAddresses();
while(nias.hasMoreElements()) {
InetAddress ia= (InetAddress) nias.nextElement();
if (!ia.isLinkLocalAddress()
&& !ia.isLoopbackAddress()
&& ia instanceof Inet4Address) {
return ia;
}
}
}
} catch (SocketException e) {
LOG.error("unable to get current IP " + e.getMessage(), e);
}
return null;
}
答案 4 :(得分:3)
您的计算机可能有多个IP。你怎么知道哪一个?我这样做的方法是在另一台机器上运行一个非常简单的CGI,报告它所看到的IP,当我需要知道我的IP对外界的看法时,我会点击它。
答案 5 :(得分:2)
我没有使用InetAddress.getHostAddress(),而是调用我编写的getHost4Address例程来获取第一个非环回地址...
python2.7
答案 6 :(得分:2)
我写了这段代码:
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
private String[] getHostAddresses() {
Set<String> HostAddresses = new HashSet<>();
try {
for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) {
if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) {
for (InterfaceAddress ia : ni.getInterfaceAddresses()) {
if (ia.getBroadcast() != null) { //If limited to IPV4
HostAddresses.add(ia.getAddress().getHostAddress());
}
}
}
}
} catch (SocketException e) { }
return HostAddresses.toArray(new String[0]);
}
检查一下!
对我来说:
答案 7 :(得分:1)
从当前实例获取当前请求
HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
然后从请求中获取地址
ip = httpServletRequest.getRemoteAddr();
答案 8 :(得分:1)
获取与模式匹配的当前框的IP地址:
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;
String ipPattern = "(192.1.200.)(\\d){1,3}"; //your organization pattern
try{
Enumeration en = NetworkInterface.getNetworkInterfaces();
while (en.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) en.nextElement();
Enumeration ee = ni.getInetAddresses();
while (ee.hasMoreElements()) {
InetAddress ia = (InetAddress) ee.nextElement();
String ip = ia.getHostAddress();
System.out.println("ip: '" + ip + "'\n");
boolean matched = Pattern.matches(ipPattern, ip);
if (matched) {
System.out.println("matched\n");
}
}
}
}
catch(Exception e){ }
结果:
ip: 'fe80:0:0:0:510a:528b:7204:39d0%enp0s25'
ip: '192.1.200.3'
matched
ip: '0:0:0:0:0:0:0:1%lo'
ip: '127.0.0.1'
答案 9 :(得分:-1)
我遇到相同问题的最短解决方案
搜索后,我发现PCHsotName在文件“ / etc / hosts”
中获得了IP地址127.0.1.1。1)因此,使用任何编辑器
打开文件 / etc / hosts我用过纳米
$ sudo nano /etc/hosts
2)并在行首添加“#”
127.0.1.1 HostName
赞
#127.0.1.1 HostName
3)Ctrl + o保存
4)ctrl + x退出Nano编辑器
注意::“主机名”取决于您的计算机或服务器的名称。
答案 10 :(得分:-5)
如果您想获取PC的IP地址,则必须使用“InetAddress”对象,该对象存在于“java.net.InetAddress”库中。
以下方法返回您的IP:
public String getIp() {
String myIp = "";
InetAddress ip;
try {
ip = InetAddress.getLocalHost();
myIp = ip.getHostAddress(); // This method returns the IP.
} catch (UnknownHostException e) {
e.printStackTrace();
}
return myIp;
}