使用系统IP地址的服务器的套接字程序

时间:2011-07-04 05:35:16

标签: java unix

我正在尝试使用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地址启动服务器。

感谢。

4 个答案:

答案 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;
} }