如何使用JavaScript獲取本機IP地址

在我們進行網絡編程過程中,獲取本機IP地址是經常用到的一個功能,而JavaScript作為一門在瀏覽器中廣泛應用的腳本語言,也可以藉助其提供的API來獲取本機IP地址。以下將從多個方面介紹如何使用JavaScript獲取本機IP地址。

一、使用WebRTC技術

WebRTC是Web Real-Time Communication的縮寫,是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術。通過使用WebRTC技術,我們可以很方便地獲取到當前機器的IP地址。使用WebRTC獲取IP地址需要幾個步驟:

// 打開瀏覽器控制台
// 創建一個RTCPeerConfiguration對象,設置ICE Server
const config = {iceServers: [{urls: 'stun:stun.l.google.com:19302'}]};
// 創建一個RTCPeerConnection對象,並傳遞configuration選項
const pc = new RTCPeerConnection(config);
// 創建一個自定義的RTCPeerConnection對象的candidate,同時查詢ICE candidates列表
pc.createDataChannel('');
pc.createOffer()
  .then(pc.setLocalDescription.bind(pc))
  .catch((error) => {
      console.log(error);
  });
pc.onicecandidate = (iceEvent) => {
  console.log(iceEvent)
    if (iceEvent.candidate) {
        const url = 'https://api.ipify.org?format=jsonp&callback=findIP';
        // 發送GET請求獲取本機外網IP地址
        fetch(url).then(res => res.text()).then(res => {
            eval(res);
        });
    }
};
function findIP(json) {
  console.log(json.ip);
}

上述代碼中,我們通過創建一個RTCPeerConnection對象,並設置名為stun:stun.l.google.com:19302的ICE Server來獲取本機IP地址。在根據ICE Server創建好RTCPeerConnection對象後,我們創建了一個data channel,之後調用createOffer()方法,該方法用來創建一個SDP描述文件,並返回一個Promise對象,我們將其resolved後,調用setLocalDescription()方法將其設置為該RTCPeerConnection對象的本地SDP描述,然後通過監聽onicecandidate事件獲取candidate,並發送GET請求訪問https://api.ipify.org獲取IP地址。

二、使用第三方API

除了使用WebRTC技術之外,我們還可以藉助一些第三方API來獲取本機IP地址。比較常用的API有ipify、ip-api.com和api.ipify.org等,這裡以ipify為例:

fetch('https://api.ipify.org?format=json')
  .then(res => res.json())
  .then(data => console.log(data.ip))

我們通過fetch方法請求https://api.ipify.org並獲取格式為JSON的響應結果,之後通過訪問data.ip屬性來獲得本機IP地址。

三、使用DNS查詢

DNS(Domain Name System)域名系統是互聯網中最重要的非核心協議之一,它將一個域名映射為IP地址。因此,我們可以通過使用DNS查詢的方式來獲得本機IP地址,方法如下:

function getIP(onNewIP) {
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
  var pc = new myPeerConnection({
      iceServers: []
  }),
  noop = function() {},
  localIPs = {},
  count = 0,
  matchIps = ["192", "172", "10", "169.254", "127"];
  pc.createDataChannel("");
  pc.createOffer(function(sdp) {
      sdp.sdp.split("\n").forEach(function(line) {
          if (line.indexOf("candidate") < 0) {
              return;
          }
          line.match(/((udp|tcp) .*) /i).map(function(expr) {
              if (expr.match(matchIps.join('|'))) {
                  count++;
                  return;
              }
              expr = expr.replace(/ udp /i, ' ').replace(/ tcp /i, ' ');
              var lineArr = expr.split(" "),
              ipVersion = "";
              lineArr[0].indexOf(":") != -1 ? ipVersion = "v6" : ipVersion = "v4"
              var ipAddress = lineArr[0];
              if (ipAddress.indexOf(ipVersion) != -1) {
                  ipAddress = ipAddress.split(ipVersion)[1];
              }
              if (localIPs[ipAddress] === undefined) {
                  count++;
                  localIPs[ipAddress] = ipAddress;
              }
          });
      });
      onNewIP(localIPs);
      pc.setLocalDescription(sdp, noop, noop);
  }, noop);
}

在上述代碼中,我們通過創建RTCPeerConnection對象,並通過使用createDataChannel()和createOffer()方法來獲取本機IP地址。因為RTCPeerConnection對象需要和其他設備通訊才能獲取到IP地址,所以需要createDataChannel方法創建一個通道,調用createOffer方法獲取Session描述信息。

四、總結

通過以上三種方式,我們可以在JavaScript中獲取到當前機器的IP地址。在實際開發過程中,我們可以結合具體情況選取合適的獲取方式。

原創文章,作者:FLNDA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/361509.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FLNDA的頭像FLNDA
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

  • cmd看地址

    本文將從多個方面詳細闡述cmd看地址,包括如何查看本機IP地址、如何查看路由器IP、如何查看DNS服務器IP等等。 一、查看本機IP地址 要查看本機IP地址,首先需要打開cmd窗口…

    編程 2025-04-29
  • 如何使用Python獲取某一行

    您可能經常會遇到需要處理文本文件數據的情況,在這種情況下,我們需要從文本文件中獲取特定一行的數據並對其進行處理。Python提供了許多方法來讀取和處理文本文件中的數據,而在本文中,…

    編程 2025-04-29
  • 如何使用jumpserver調用遠程桌面

    本文將介紹如何使用jumpserver實現遠程桌面功能 一、安裝jumpserver 首先我們需要安裝並配置jumpserver。 $ wget -O /etc/yum.repos…

    編程 2025-04-29
  • 尚硅谷官網地址用法介紹

    尚硅谷是國內一家領先的技術培訓機構,提供了眾多IT職業的培訓,包括Java、Python、大數據、前端、人工智能等方向。其官網地址為http://www.atguigu.com/。…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • Hibernate註解聯合主鍵 如何使用

    解答:Hibernate的註解方式可以用來定義聯合主鍵,使用@Embeddable和@EmbeddedId註解。 一、@Embeddable和@EmbeddedId註解 在Hibe…

    編程 2025-04-29
  • 如何使用random生成不重複的隨機數

    在編程開發中,我們經常需要使用隨機數來模擬一些場景或生成一些數據。但是如果隨機數重複,就會造成數據的不準確性。這時我們就需要使用random庫來生成不重複且隨機的數值。下面將從幾個…

    編程 2025-04-29
  • 如何使用HTML修改layui內部樣式影響全局

    如果您想要使用layui來構建一個美觀的網站或應用,您可能需要使用一些自定義CSS來修改layui內部組件的樣式。然而,修改layui組件的樣式可能會對整個頁面產生影響,甚至可能破…

    編程 2025-04-29
  • 如何使用GPU加速運行Python程序——以CSDN為中心

    GPU的強大性能是眾所周知的。而隨着深度學習和機器學習的發展,越來越多的Python開發者將GPU應用於深度學習模型的訓練過程中,提高了模型訓練效率。在本文中,我們將介紹如何使用G…

    編程 2025-04-29
  • 如何使用Python導入Random庫

    Python是一門優秀的編程語言,它擁有豐富的第三方庫和模塊。其中,Random庫可謂是最常用的庫之一,它提供了用於生成隨機數的功能。對於開發人員而言,使用Random庫能夠提高開…

    編程 2025-04-29

發表回復

登錄後才能評論