关于如何获取项目所部署的本机IP和端口的问题
今天在写一个需求的时候碰到一个不常见的问题,在没有继承或者实现服务器提供的接口或者实现类的时候,比如说部署在tomacat上,某个类不去继承servelt接口或者继承Httpservelet抽象类的时候去或者项目所处的IP地址以及
项目所部署的端口号。
我们先说一下我们都知道的情况,继承或者实现上面两者的情况下如何获取
方法一:
req.getLocalAddr(); 获取本机的IP地址(客户端)
req.getLocalPort(); 获取项目部署的端口号(客户端)
那么在没有继承上面两者的情况下,通过何种方式获取呢?
方法二:
先上代码再解释:
获取本机的IP地址的代码
1 public static InetAddress getCurrentIp() { 2 try { 3 // 得到当前机器上在局域网内所有的网络接口 4 Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); 5 // 遍历所有的网络接口 6 while (networkInterfaces.hasMoreElements()) { 7 NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement(); 8 // 获取当前接口下绑定到该网卡的所有的 IP地址。 9 Enumeration<InetAddress> nias = ni.getInetAddresses(); 10 while (nias.hasMoreElements()) { 11 InetAddress ia = (InetAddress) nias.nextElement(); 12 // 获取网卡接口地址(ip) 13 String hostAddress = ia.getHostAddress(); 14 System.out.println(hostAddress); 15 // 只需要ipv4地址 排除ipv6地址和127.0.0.1 取ipv4地址 16 if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) { 17 return ia; 18 } 19 } 20 } 21 } catch (SocketException e) { 22 } 23 return null; 24 }
获取服务器的端口号
1 public static String getLocalPort() throws MalformedObjectNameException { 2 // 获取所有注册在jvm中的服务器 3 MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer(); 4 Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"), 5 Query.match(Query.attr("protocol"), Query.value("HTTP/1.1"))); 6 System.out.println(objectNames); 7 String port = objectNames.iterator().next().getKeyProperty("port"); 8 return port; 9 }
上面用到的包,都是java.net.*下的包,是jdk 中自带的包,已经提供在环境中,不需要额外的引入其他的包, Java 在 JDK1.4 之后引入了网络操作的相关包,所以需要JDK1.4或者1.4以上才行。
由于我用的Tomact服务器开发的,暂时没有测其他的服务器是否也同样可以,如果以后用到其他服务器再补充。