📅  最后修改于: 2023-12-03 15:38:02.908000             🧑  作者: Mango
在 Web 应用程序中,通常需要获取客户端的 IP 地址,以便识别用户或提供一些基于位置的服务。本文将介绍如何使用 JavaScript 获取客户端的 IP 地址。
如果你想获取客户端的公网 IP 地址,可以使用一些第三方服务,比如 https://api.ipify.org 。这里是一个使用 jQuery 获取客户端 IP 地址的示例代码:
$.getJSON("https://api.ipify.org?format=json", function(data) {
console.log(data.ip);
});
这个代码使用 jQuery 发送一个 GET 请求到 https://api.ipify.org ,该请求会返回一个 JSON 格式的响应:
{"ip":"123.45.67.89"}
可以通过响应中的 ip
字段获取客户端的 IP 地址。
WebRTC 是一个实时通信的技术,它可以在浏览器之间传输视频、音频和数据。WebRTC 也可以用来获取客户端的 IP 地址。我们可以使用 RTCPeerConnection
对象获取本地的 IP 地址。
function getLocalIPs(callback) {
var ips = [];
var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var pc = new RTCPeerConnection({iceServers:[]});
pc.createDataChannel('');
pc.onicecandidate = function(e) {
if (!e.candidate) {
pc.close();
callback(ips);
return;
}
var ip = /^\s*([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\s*$/.exec(e.candidate.candidate)[1];
if (ips.indexOf(ip) == -1)
ips.push(ip);
};
pc.createOffer(function(sdp) {
pc.setLocalDescription(sdp);
}, function onerror() {});
}
getLocalIPs(function(ips) {
console.log(ips);
});
这段代码使用 RTCPeerConnection
对象创建了一个数据通道,并通过 onicecandidate
事件监听 ICE Candidate (ICE 是 Internet Connectivity Establishment 的缩写,用于实现对等通讯)。当 ICE Candidate 被触发时,会从 candidate 的属性中获取本地的 IP 地址。最终会将所有 IP 地址添加到 ips
这个数组中并传递给回调函数 callback
。
使用 WebSocket 或 HTTP 请求都能够实现获取客户端的 IP 地址。这里以获取客户端的公网 IP 地址为例子,使用 WebSocket 获取:
var WebSocketServer = require("ws").Server;
var http = require("http");
var server = http.createServer();
server.listen(8080);
var ws = new WebSocketServer({server: server});
ws.on("connection", function(socket) {
var ip = socket._socket.remoteAddress;
console.log(ip);
});
这段代码创建了一个 HTTP 服务器和一个 WebSocket 服务器,当有客户端连接到 WebSocket 服务器时,会通过 socket._socket.remoteAddress
获取客户端的 IP 地址。
以上是使用 JavaScript 获取客户端 IP 地址的一些方式,根据实际的需求进行选择。