Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 覆盆子&x2B;socket.io在本地网络上工作,但不能从外部工作_Node.js_Sockets_Websocket_Socket.io_Raspberry Pi - Fatal编程技术网

Node.js 覆盆子&x2B;socket.io在本地网络上工作,但不能从外部工作

Node.js 覆盆子&x2B;socket.io在本地网络上工作,但不能从外部工作,node.js,sockets,websocket,socket.io,raspberry-pi,Node.js,Sockets,Websocket,Socket.io,Raspberry Pi,我有一个Raspberry Pi,通过server.js文件提供html页面。主线(并非所有代码)为: 在index.html上: <head> ... <script src="/socket.io/socket.io.js"></script> ... </head> <body> <div id="info"></div> --- <script> var socket = io.connect

我有一个Raspberry Pi,通过server.js文件提供html页面。主线(并非所有代码)为:

在index.html上:

<head>
...
<script src="/socket.io/socket.io.js"></script>
...
</head>
<body>
<div id="info"></div>
---
<script>
var socket = io.connect('http://192.168.1.6:8000');

socket.on('tempUpd', function(date, temp){
   document.getElementById("info").textContent = temp;
});
...
</script>
</body>
</html>

...
...
---
var socket=io.connect('http://192.168.1.6:8000');
socket.on('tempUpd',函数(日期,温度){
document.getElementById(“info”).textContent=temp;
});
...
如您所见,我们的想法是每2秒更新一次温度测量值

当我通过本地网络(使用无线)从智能手机连接到Raspberry PI时,一切正常,我可以访问网页,看到温度值每2秒变化一次

当我关闭智能手机上的无线连接并通过移动网络连接到Raspberry时(已将路由器配置为允许连接到Raspberry pi),我可以看到网页,但通过插座传递的所有信息都不会显示

考虑到由于某种原因,我无法在该页面上看到动态元素,我添加了另一个,并添加了一些代码,以便它以setInterval每隔2秒显示一次当前时间。我看到时间在变化,但是没有任何东西通过插座显示出来。再次,我切换到本地网络,所有内容都可见,包括通过套接字传递的信息

知道会发生什么吗?
非常感谢

192.168.1.6
是一个本地网络地址。您无法从本地网络外部访问该地址。移动网络位于本地网络之外。从手机使用WiFi时,您正在连接到本地网络内的接入点,然后可以路由到
192.168.1.6

要从公共移动网络(从您自己的本地网络外部)访问它,您必须拥有从本地网络外部路由到服务器的公共IP地址


解决此问题的常用方法是为internet连接获取公共IP地址(或对DHCP分配的地址使用动态DNS),然后在internet路由器上配置“端口转发”。这将接收发送到公共IP地址上特定端口的传入数据包,并将其转发到内部网络上的特定设备(例如Raspberry Pi)。

您需要根据节点服务器的IP地址更新index.html页面以动态打开套接字。正如其他人所指出的,当您从internet连接到服务器时,Pi不是192.168.1.6。(这是您的本地网络)

如果你能够点击网页,那么你就知道你的路由器正在正确地转发东西

在index.html页面上,将行更改为:

var socket = io.connect('http://192.168.1.6:8000');
致:

还要确保您正在将路由器上的端口8000转发给Pi

祝你好运


--Ed

谢谢您的回答,但是192.168.1.6地址不是只用于server.js和index.html之间的通信吗?而且两者都在同一台机器上,难道它不应该工作吗?@FilipeSim-该地址用于从浏览器到服务器的通信,需要从浏览器所在的任何网络上解析。192.168.x.x地址被称为专用地址(不用于公共网络)。有关更多信息,请参阅。@FilipeSim-这可能会有所帮助。
index.html
文件可能托管在服务器上,但它由浏览器下载,然后在浏览器中实际执行。因此,当它尝试连接到服务器时,它必须能够从浏览器所在的网络连接到服务器。@FilipeSim-因为看起来您可能是新来的,您知道吗,如果您的问题得到了回答,那么您可以通过单击该答案左侧的绿色复选标记来选择最佳答案。这将向社区表明您的问题已经得到了回答,并将为您和提供答案的人在网站上按照正确的程序赢得一些声誉点数。我(真的)是新来的!:)不仅在stackoverflow,还可以使用网络技术进行编程。非常感谢你的回答。现在我想起来了,我觉得自己很笨。有很多代码示例,但很少解释幕后发生的机制。再次感谢你的帮助!
var socket = io.connect('http://192.168.1.6:8000');
var socket = io.connect('http://' + location.host + ':8000');