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 曾经有效,现在突然停止了。
问题:
- 它多年来一直有效的技术原因是什么?
- 它突然停止工作的技术原因是什么?
- 以编程方式生成任何 JSP 页面的完整地址且不易出错的最佳方法是什么?
编辑:这是一个文件共享应用程序,运行在用户的工作站,我希望用户能够复制地址与他人共享链接,并且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();
在 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 曾经有效,现在突然停止了。
问题:
- 它多年来一直有效的技术原因是什么?
- 它突然停止工作的技术原因是什么?
- 以编程方式生成任何 JSP 页面的完整地址且不易出错的最佳方法是什么?
编辑:这是一个文件共享应用程序,运行在用户的工作站,我希望用户能够复制地址与他人共享链接,并且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();