關於如何獲取項目所部署的本機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服務器開發的,暫時沒有測其他的服務器是否也同樣可以,如果以后用到其他服務器再補充。