我正在尝试使用ServerSocket在PC上运行服务器应用程序,因为我试图获取系统的IP地址来启动服务器并等待客户端连接,为此我写了
InetAddress inetAddress = InetAddress.getLocalHost();
ServerSocket serverSocket;
if (serverSocket == null)
serverSocket = new ServerSocket(1000, 0, inetAddress);
Socket socket=serverSocket.accept();
它在Window OS中正常工作,当我在Unix OS中尝试这个应用程序时它对我不起作用,我尝试使用打印IP地址,
System.out.println(inetAddress.getHostAddress);
在Windows操作系统中打印正确的IP地址,但在Unix操作系统中,我得到的是
127.0.0.1
所以服务器无法正常工作,我还没有在Mac OS上试过这个,所以有没有办法在任何操作系统中使用系统的默认IP地址启动服务器。
感谢。
答案 0 :(得分:1)
这似乎是一个非常常见的问题。有关可能的解决方案,请参阅以下链接: java InetAddress.getLocalHost(); returns 127.0.0.1 ... how to get REAL IP?
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4665037
具体来说,sun bug链接中的工作和评估解释了该函数如何在linux上运行,以及如何确保你的linux盒正确设置为从java查询时返回正确的ip。
答案 1 :(得分:1)
InetAddress localhost = InetAddress.getLocalHost();
// this code assumes IPv4 is used
byte[] ip = localhost.getAddress();
for (int i = 1; i <= 254; i++) {
ip[3] = (byte)i;
InetAddress address = InetAddress.getByAddress(ip);
if (address.isReachable(1000))
{
// machine is turned on and can be pinged
}
else if (!address.getHostAddress().equals(address.getHostName()))
{
// machine is known in a DNS lookup
}
else
{
// the host address and host name are equal, meaning the host name could not be resolved
}
}
答案 2 :(得分:1)
只需为InetAddress传递null。另请注意,您的指定积压可能会被系统调高或调低。如果您没有充分的理由指定它,只需使用新的ServerSocket(0)。
答案 3 :(得分:1)
试试这个例子:
import java.net.*;
import java.util.*;
import java.util.regex.Pattern;
public class GetPublicHostname
{
public static void main(String[] args) throws Throwable {
System.out.println("The IP : " + tellMyIP());
}
public static String tellMyIP()
{
NetworkInterface iface = null;
String ethr;
String myip = "";
String regex = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
try
{
for(Enumeration ifaces = NetworkInterface.getNetworkInterfaces();ifaces.hasMoreElements();)
{
iface = (NetworkInterface)ifaces.nextElement();
ethr = iface.getDisplayName();
if (Pattern.matches("eth[0-9]", ethr))
{
System.out.println("Interface:" + ethr);
InetAddress ia = null;
for(Enumeration ips = iface.getInetAddresses();ips.hasMoreElements();)
{
ia = (InetAddress)ips.nextElement();
if (Pattern.matches(regex, ia.getCanonicalHostName()))
{
myip = ia.getCanonicalHostName();
return myip;
}
}
}
}
}
catch (SocketException e){}
return myip;
} }