WebSocket无法访问本地网络客户端服务。

3

在本地网络中使用websocket-连接时遇到了一些问题。

场景:

我为我的笔记本电脑(Win7)编写了一个服务,该服务在端口2014上打开websocket-server。因为windows 7默认未启用websocket,所以我使用了supersocket库(http://www.supersocket.net/)。

对于客户端,我编写了一个基于sencha touch和Phonegap的android应用程序。为了使低于4.4版本的android设备支持websocket,我集成了phonegap websocket插件。

目的是在android设备和笔记本电脑之间打开websocket连接以通过android应用程序控制笔记本电脑。两个设备都是同一局域网的成员。

问题:

在安装了两个应用程序(windows服务和android应用程序)后,我试图从笔记本电脑上的服务连接android设备。第一步是在客户端上打开连接:

var connection = new WebSocket('ws://192.168.178.21:2014');

但是,在我的Windows服务的事件日志中,没有记录任何成功的连接。

之后,我打开了我的笔记本电脑的浏览器并测试了相同的代码-成功了。客户端和服务器可以互相通信。

所以我测试了我的Android设备上的WebSocket支持:将WebSocket URL更改为

var connection = new WebSocket('ws://echo.websocket.org');

并且可以连接到服务器 -> 安卓Websockets没有问题。

第三步是禁用我的防火墙并使用Wireshark检查连接:

截图:http://www.directupload.net/file/d/3710/y9t79npy_png.htm

192.168.178.21 -> 笔记本电脑IP

192.168.178.23 -> 安卓设备IP

因此,数据包似乎到达了我的笔记本电脑,但服务却没有收到。还尝试使用安全的wss:// 协议,但没有成功。

不知道有什么其他想法了。很高兴能得到一些帮助:)


你是如何设置服务器的?展示一下代码。 - vtortola
嘿,vtortola。感谢您的回复。下面是发布的服务器类。 - sinnixx
2个回答

2
似乎数据包能够到达我的笔记本电脑,但无法到达服务。可能是服务器绑定了特定的IP地址或主机名?通常服务器会隐式地绑定到所有接口,例如0.0.0.0,但有时它们会绑定到一个特定的接口。如果发生这种情况,则需要连接到同一接口。你说你的客户端正在连接到ws://192.168.178.21:2014,但是服务器是否绑定到127.0.0.1或localhost或你的主机名,因此无法看到请求?这可能解释了为什么笔记本电脑收到了请求,但你的服务没有收到。另一方面,你说你从本地浏览器尝试过,并且它可以工作。你使用了相同的IP地址,还是使用了127.0.0.1或localhost?假设你使用了相同的IP地址192.168.178.21,则说明这不是我所描述的绑定问题。抱歉,这就是我目前能想到的全部内容。

嗨,罗宾,我用netstat命令在cmd中检查了TCP连接。也许找到了解决方案:命令行显示如下内容:Protocol:TCP,本地地址:0.0.0.0:2014,远程地址:sinnixpc:0,状态:正在侦听。因此,服务器绑定到所有接口。但是远程地址不应该是“*”吗? - sinnixx
添加了服务器设置:this.serverConfig.Ip = "Any"; 但是netstat命令仍然显示相同的内容...我做错了什么? - sinnixx
如果您在服务器上执行了netstat命令,则远程地址是客户端,因此无论该地址是否显示“*”都无所谓。但由于本地地址为0.0.0.0,看起来似乎服务器正在绑定到所有接口。所以我不确定为什么它没有连接。绑定到正确的接口是要检查的好事情,但看起来已经排除了这个问题。另一个尝试的方法是使用Apache或其他一些服务器,并从同一客户端创建HTTP连接。如果失败,则与WebSocket无关,而是网络问题。也要使用相同的端口。 - Robin Zimmermann

0

经过一段时间的探索,我找到了解决方案:

必须将防火墙规则添加到公共防火墙选项中。

感谢您的帮助:)


5
这个回答过于含糊不清。 - Zheng Qu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接