JSP: 新套接字 ("www", 80);工作多年后停止工作

JSP: new Socket ("www", 80); stopped working after years of working OK

在 JSP 应用程序中,在 Tomcat 中,以下代码用于生成页面的完整地址(来自 this answer):

String myUrl = "no network";
try {
    Socket s = new Socket("www", 80);
    myUrl = "http://"+s.getLocalAddress().getHostAddress()+":"+request.getLocalPort()+request.getRequestURI();
    s.close();
} catch (Exception ex) {
} finally {
}

之后 miUrl 将具有以下值(不是真实 IP 地址):http://111.101.101.2:8080/mypage.jsp

已经工作好几年了

一周前 miUrl 开始有 "no network" 作为值,表明发生异常。

我发出了 ex.printStackTrace() 并说:java.net.UnknownHostException: www

用文字 "www" 创建一个 socked 曾经有效,现在突然停止了。

问题:

编辑:这是一个文件共享应用程序,运行在用户的工作站,我希望用户能够复制地址与他人共享链接,并且http://localhost:8080/downloadpage.jsp(如图浏览器的地址字段)不利于共享。如果你告诉我如何在没有套接字黑客的情况下获得相同的信息,那将会有所帮助。

正如 Beau G运行tham 在评论中所说,这很有可能是 DNS 问题。尝试

$ ping www

看看它是否解决了任何问题。如果你得到

$ ping www
ping: cannot resolve www: Unknown host
$ 

那就是你的问题了。

我在本地 运行 并得到:

~$ java TestResolve
java.net.UnknownHostException: www
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at TestResolve.main(TestResolve.java:7)

(我不希望这是一个主机文件,因为每个人都可以使用 URL。无论如何,'www' 是您使用 DNS 管理的那种东西。)

至于以编程方式生成 URLs,尝试

InetAddress.getLocalHost().getHostName()

如果您可以使用主机名。其他同行可能可以解决这个问题。否则

InetAddress localhost = InetAddress.getLocalHost();
InetAddress[] ips = InetAddress.getAllByName(localhost.getHostName());

在这里您将获得相关主机的 IP 列表,对应于不同的接口。您可能必须根据子网选择一个,大概您可以将其配置到应用程序中。

在不使用套接字的情况下解决了 IP 地址部分。

public String getIP(){
    String ip="no network";
    try {
        Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces();
        outmost:
        for (; n.hasMoreElements();)
        {
            NetworkInterface e = n.nextElement();
            Enumeration<InetAddress> a = e.getInetAddresses();
            for (; a.hasMoreElements();)
            {
                InetAddress addr = a.nextElement();             
                if (addr instanceof Inet4Address){ // return the first IPv4 addr (127.0.1.1 is always last)
                    if (addr.isSiteLocalAddress()){
                        ip=addr.getHostAddress();
                        break outmost;
                    }

                }
            }
        }           
    } catch (UnknownHostException e1) {
    } catch (SocketException e) {
    } 
    return ip;      
}

然后

String miUrl = "http://"+getIP()+":"+request.getLocalPort()+request.getRequestURI();