HTML5 Websocket 仅适用于本地主机

Posted

技术标签:

【中文标题】HTML5 Websocket 仅适用于本地主机【英文标题】:HTML5 Websocket only works on localhost 【发布时间】:2011-03-30 04:06:57 【问题描述】:

我按照以下网站的html5 Websocket教程进行操作:

http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

效果很好,然后我在客户端页面将主机值从“localhost:8080”更改为“218.175.192.160:8080”(我的ip),服务器端仍然保留“localhost:8080”。

原来我可以使用http协议在浏览器(apache)中查看页面,例如“http://218.175.192.160:8080/client.html”,但是客户端的套接字无法连接到“ws://218.175.192.160: 8080/daemon.php”。(编辑错字)

我的问题是: 1. 在客户端,为什么 websocket 只适用于“ws://localhost:8080/daemon.php”,而不适用于“ws://218.175.192.160:8080/daemon.php”?

2。 为什么 socket_bind( $socket, "127.0.0.1", 8080 ) 有效, 但是 socket_bind( $socket, "218.175.192.160", 8080 ) 发生错误? 系统提示“无法绑定地址[0]:请求的地址在其上下文中无效”。我确定IP地址属于我的服务器。

请帮忙,谢谢。

我找到了错误原因:绑定错误的地址,因为我使用了路由器,即使我在路由器上设置了NAT服务,但我忘记了“218.175.192.160”的地址属于路由器接口,不是我的服务器机器。

服务器机器的地址应该是本地地址类型,例如:“192.168.1.2”,确实是在网卡接口上。

对不起,我忘记了基本的网络设置:(,希望这篇文章能帮助像我这样的网络新手,谢谢~:)

【问题讨论】:

这可能是由于您的路由器的设置方式,而不是 websockets 本身。 谢谢你的回复,但是我的服务器可以正常运行http协议,我的意思是其他客户端可以读取我的网站,是不是我的路由器没有问题?至少在 NAT 设置上... 请自行关闭。 如果您已经解决了问题,请回答您自己的问题,或者删除问题。 回答或标记摩西的答案而不是编辑您的问题会更有帮助,IMO。 【参考方案1】:

而不是告诉它只允许来自localhost 的请求的socket_bind( $socket, "127.0.0.1", 8080 ),而是绑定到允许来自任何 IP 的请求的“0.0.0.0”。

所以让它socket_bind( $socket, "0.0.0.0", 8080 ),它会工作。

【讨论】:

【参考方案2】:

我也遇到过这个问题。

问题是您很可能指的是您的路由器的 IP 地址。您需要做的是参考您计算机的 IP 地址。

它适用于 localhost,因为 localhost 指向您的个人计算机,而不是您的路由器。

【讨论】:

【参考方案3】:

你还在用'localhost'这样初始化你的PHP服务器吗?:

public function __construct($host='localhost',$port=8000,$max=100)  

如果你这样做,那么服务器将只绑定到 localhost 接口。即使您从 Apache 正确地提供文件,似乎仍然需要为外部 IP 配置 phpwebsockets 代码。

【讨论】:

这样绑定接口会报错...这样有什么问题吗? 【参考方案4】:

我相信相同的源策略适用于 websocket 和服务器端口,因此客户端和服务器必须匹配,否则连接将失败。

在您的示例中,您使用了:

http://218.175.192.160:8080/client.html
ws://218.175.192.160/daemon.php

我不确定这是否只是一个错字,但这应该是

http://218.175.192.160:8080/client.html
ws://218.175.192.160:8080/daemon.php

【讨论】:

谢谢你的回复,是的,我打错了,我的配置和后者一样,但是没有用... 这不是真的。客户端和服务器不需要在同一个端口上运行。

以上是关于HTML5 Websocket 仅适用于本地主机的主要内容,如果未能解决你的问题,请参考以下文章

http.ListenAndServe 仅适用于本地主机?

地理位置仅适用于本地主机

Firebase 云消息传递仅适用于本地主机

适用于 Android 的 phonegap 中的 WebSocket HTML5

测试表单仅适用于来自本地机器的请求

websocket 是不是仅适用于浏览器