js获取本地地址

最近从python转学JavaScript,发现JavaScript其实更贴近html,运用起来更加灵活自如。

JavaScript里面有一个最大的对象--window,通常通过window.XXX来调用相应的属性,例如window.onload=XXX可以使XXX函数在html加载完后定义。

其中window里面有一个属性navigator,它可以获得用户浏览器的各种信息,其中就包括地址。

首先,我写好了一个用来显示结果的html文档。 

<!DOCTYPE HTML>
<html>
	<head>
		<meta charset="UTF-8"/>
		<title></title>
		<script src="http://api.map.baidu.com/api?v=1.2"></script>
		<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
		<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
		<script src="geolocation.js"></script>
	</head>
	<body>
		<button id="getPositonbt">获取当前位置</button> <wbr> <wbr> <wbr> <wbr>
		<button id="showmapbt">在百度地图上打开当前位置</button><br/><br/>
		<p id="myLocation"></p><br/><br/>
		<div style="width:720px;height:540px;border:1px solid gray" id="baiduMap"></div>
	</body>
</html>  
其中引用了jQuery

<script type="text/javascript" src="http://code.jquery.com/jquery-1.11.1.min.js"></script>

还应用了位置纠偏的函数库,为什么要引用后面会稍作解释~。~

<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>


可以看到html使用了本地geolocation.js文档,给出源码:

//geolocation.js
var mylatitud = null;
var mylongitude = null;
var map = null;
window.onload = initfunction;
function initfunction() {
    $("#getPositonbt").click(getPosition);
    $("#showmapbt").click(showBaiduMap);
}
function getPosition() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(
            displayPositon,
            displayError,
            {timeout:30000, maximumage:0}
        );
    } else {
        alert("Your browser seems not support Geolocation API");
    }
}
function displayPositon(position) {
    $("#myLocation").text("Your position is: " + position.coords.latitude +"   " + position.coords.longitude + "   (Accurary:" + position.coords.accuracy + ")");
    mylatitud = position.coords.latitude;
    mylongitude = position.coords.longitude;
}
function displayError() {
    alert("Error occurs when calling getCurrentPostion function");
}
function showBaiduMap() {
    if ((mylatitud == null)||(mylongitude == null)) {
        alert("Please get your position first");
    } else {
        if (map == null){
            var map = new BMap.Map("baiduMap");
            var centerPoint = new BMap.Point(mylongitude, mylatitud);
            // 转换接口
			BMap.Convertor.translate(centerPoint, 0, function(point) {
			      var marker = new BMap.Marker(point);
			      map.addOverlay(marker);
			      map.centerAndZoom(point, 15);
			});
            map.addControl(new BMap.NavigationControl());
            map.addControl(new BMap.ScaleControl());
            map.addControl(new BMap.OverviewMapControl());
        }
    }
}

在initfunction里面初始化了两个按钮的点击事件,分别对应获取经纬度函数、显示地图函数。

在getPosition里通过navigator.geolocation的返回值判断浏览器是否支持跟踪地址。然后调用navigator.geolocation.getCurrentPosition(getPos,error,timeout),getPos为回调函数,这里定义为displayPositon(position),其中position是回调的结果,获取其经纬度分别赋值给mylatitud和mylongitude。error为出错时调用的函数,timeout是浏览器等待回应的最大延时。

再来看showBaiduMap,调用百度地图API,获取一个Map类对象:

var map = new BMap.Map("baiduMap");


位置纠偏:(如果不经过此函数纠偏,我出来的结果距离真实位置有近1公里的误差!= =)

BMap.Convertor.translate(centerPoint, 0, function(point) {
			      var marker = new BMap.Marker(point);
			      map.addOverlay(marker);
			      map.centerAndZoom(point, 15);
			});
其中marker是标签,用来标注位置的,通过addOverlay覆盖在地图上。centerAndZoom顾名思义就是地图显示中心和缩放比例。


剩下的就是添加一些地图显示的工具栏

map.addControl(new BMap.NavigationControl());
map.addControl(new BMap.ScaleControl());
map.addControl(new BMap.OverviewMapControl());

然后结果就出来了:(这里注意,Chorme和Firefox这类浏览器似乎安全起见都默认浏览器不能跟踪用户位置,若不更改设置是看不到结果的。你可以通过使用IE解决此问题。)



可以看到没纠偏的准确度只有71%。我上网查了一下关于定位误差如此之大的原因,结果呵呵,貌似发现了不得了的东西!这个位置偏差原来是人为造成的,我们国家处于安全考虑使用了“火星坐标”。“火星坐标”是国家保密插件,也叫做加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。所有的GPS公司,只要需要汽车导航的,需要用到导航电子地图的,都需要在软件中加入国家保密算法,将COM口读出来的真实坐标信号,加密转换成国家要求的保密坐标。

呵呵,这难道是为了导弹打偏么。。


<think>好的,我现在需要帮助用户解决如何通过运行`node server.js`获取本地IP或主机地址的问题。首先,我得仔细分析用户的需求。用户希望运行Node.js服务器时,能够获取本地的IP地址或主机地址。这可能涉及到在代码中动态获取网络接口的信息,而不是硬编码`127.0.0.1`这样的地址。 首先,我需要回想一下Node.js中相关的模块和方法。我记得`os`模块可以用来获取系统信息,包括网络接口。具体来说,`os.networkInterfaces()`会返回所有网络接口的详细信息。然后,我需要遍历这些接口,找到非内部(IPv4或IPv6)且不在回环地址(比如127.0.0.1)的地址。这通常对应于本地局域网或公共IP。 接下来,用户可能希望服务器在启动时自动获取这些地址,并显示在控制台中。例如,当运行`node server.js`时,除了默认的`127.0.0.1`,还能列出其他可用的本地IP,如`192.168.1.100`,这样用户可以在同一网络下的其他设备访问该服务。 我还需要考虑不同操作系统之间的兼容性。比如,某些系统可能有多个网络接口(如以太网、Wi-Fi、虚拟适配器等),需要正确筛选出活跃的接口。此外,IPv6地址的处理也可能需要注意,不过用户可能更关心IPv4地址。 然后,我需要参考用户提供的引用内容。引用[1]中的示例代码使用了硬编码的`hostname`为`127.0.0.1`,但用户希望动态获取。引用[2]提到了使用内网穿透工具,这可能涉及获取本地IP以便配置。引用[3]和[4]涉及代理和请求头处理,可能与当前问题关联不大,但引用[5]提到本地服务器的HMR,可能与开发环境相关。 接下来,我需要编写示例代码,展示如何动态获取本地IP。可能需要使用`os`模块,并过滤出合适的地址。例如: ```javascript const os = require('os'); function getLocalIP() { const interfaces = os.networkInterfaces(); for (const iface of Object.values(interfaces)) { for (const config of iface) { if (config.family === 'IPv4' && !config.internal) { return config.address; } } } return '127.0.0.1'; // 默认回退 } ``` 然后在创建服务器时使用这个IP地址,或者在控制台输出所有可用IP。可能还需要修改服务器监听的hostname,从`127.0.0.1`改为`0.0.0.0`,以允许外部访问,同时获取本地IP供用户访问。 此外,用户可能不知道如何让服务器监听所有接口,所以需要解释`0.0.0.0`的作用,以及如何在代码中设置。例如,在`server.listen`中设置host为`0.0.0.0`,然后获取本地IP列表,这样用户可以通过多个地址访问服务。 还需要注意,在某些环境中(如Docker容器或某些云服务),获取IP的方式可能不同,但用户的问题集中在本地开发环境,所以重点放在常规方法上。 最后,用户可能需要知道如何在代码中集成这些IP地址的显示,例如在服务器启动时打印所有可用IP,方便用户选择。例如: ```javascript const http = require('http'); const os = require('os'); const port = 3000; const server = http.createServer((req, res) => { res.end('Hello World'); }); server.listen(port, '0.0.0.0', () => { const interfaces = os.networkInterfaces(); console.log(`服务器运行在端口 ${port}`); console.log('可通过以下本地地址访问:'); Object.values(interfaces).forEach(iface => { iface.forEach(config => { if (config.family === 'IPv4' && !config.internal) { console.log(`http://${config.address}:${port}`); } }); }); }); ``` 这样,当用户运行`node server.js`时,会看到所有可用的本地IP地址,方便在不同设备上访问。 总结步骤: 1. 使用`os.networkInterfaces()`获取网络接口信息。 2. 过滤出非内部、IPv4的地址。 3. 在服务器启动时输出这些地址。 4. 设置服务器监听`0.0.0.0`以允许外部访问。 同时,需要提醒用户关于网络安全的问题,比如开放端口可能带来的风险,特别是在生产环境中。</think>### 通过Node.js获取本地IP地址的方法 #### 1. 使用`os`模块动态获取本地IP地址 在Node.js中,可通过`os`模块的`networkInterfaces()`方法获取本机所有网络接口信息,再筛选出有效IP地址。以下是实现代码: ```javascript const os = require('os'); // 获取所有非回环地址的IPv4地址 function getLocalIPs() { const interfaces = os.networkInterfaces(); const ips = []; Object.values(interfaces).forEach(iface => { iface.forEach(config => { if (config.family === 'IPv4' && !config.internal) { ips.push(config.address); } }); }); return ips; } // 示例输出: ['192.168.1.100', '10.0.0.2'] ``` #### 2. 服务器启动时显示可用地址 修改服务器代码以监听`0.0.0.0`(所有网络接口),并在控制台打印所有可用本地地址: ```javascript const http = require('http'); const port = 3000; const server = http.createServer((req, res) => { res.end('Hello World'); }); server.listen(port, '0.0.0.0', () => { const ips = getLocalIPs(); console.log(`服务器运行中,可通过以下地址访问:`); ips.forEach(ip => console.log(`http://${ip}:${port}`)); console.log(`本地回环地址:http://127.0.0.1:${port}`); }); ``` #### 3. 实现效果 运行`node server.js`后将显示: ``` 服务器运行中,可通过以下地址访问: http://192.168.1.100:3000 http://10.0.0.2:3000 本地回环地址:http://127.0.0.1:3000 ``` #### 4. 关键原理说明 - `0.0.0.0`监听:使服务器接收所有网络接口的请求[^3] - 网络接口筛选:过滤`internal: false`排除虚拟网卡和回环地址 - 多IP场景处理:自动适配有线和无线网络同时连接的情况 #### 5. 安全注意事项 - 开发环境可开放访问,生产环境需配置防火墙规则[^2] - 避免在公网直接暴露未加密的服务端口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值