3

我处于希望我的 websocket 客户端连接到服务器但服务器 ip 或 dns 名称未知的情况。客户端和服务器都在本地网络中(连接到同一路由器)。我尝试过这样的事情......

var socket;
for(var i=1; i<255; i++) {
  socket = new WebSocket('ws://192.168.1.'+i+':8080/service');

  socket.onopen = function () {   
    console.log('WebSocket Connected!!');   
  };

  socket.onclose = function (event) {
    console.log('WebSocket Disconnected!!');
    socket.close();
  };

  socket.onmessage = function (event) {
    console.log('WebSocket receive msg: ' + event.data);
  }
}

这可行,但我不确定我是否做得对,或者是否有更好的方法来做到这一点。任何帮助表示赞赏。

4

2 回答 2

0

您是否尝试过连接一个onerror监听器以查看抛出了哪些错误?您可能正在找到服务器,但服务器中的一些错误配置导致它在打开连接之前出错。

WebSockets 仍然是一个非常积极发展的标准。那里有多个草稿,一些浏览器支持一些草稿,但不支持其他草稿。旧草稿通常被认为是不安全的,因此某些浏览器不支持它们,而其他浏览器仅支持旧草稿,因为它们尚未针对较新的草稿进行更新。此外,服务器可能在同一条船上。这有点像狂野的西部。

我建议进行强大的错误处理,并在事情不正常时进行回退。像 Socket.io 这样的包提供了这种透明的后备支持。如果您正在寻找快速解决方案,我建议您检查一下。但是,如果您只是将此作为一种学习体验(我鼓励这种行为!),您将需要连接一个onerror处理程序以查看发生了什么以及每个连接失败的原因。

于 2012-09-10T04:02:46.243 回答
0

当您在比 A 类更大的网络上部署时,此解决方案当然会扩展得非常可怕。当网络上有多个 websocket 服务器时,您将不知道要访问哪一个。

但只要您的网络上没有 DNS 和静态 IP 地址,端口扫描整个 IP 范围是找到服务器的唯一方法。

您确定无法为服务器计算机分配静态 IP 地址吗?大多数消费级路由器并不严格强制使用 DHCP,通常只有一些机器配置了静态 IP 地址时,这不是问题。一些路由器固件还允许将 DHCP 服务器配置为始终将相同的 IP 地址分配给特定的 MAC 地址。

于 2012-09-10T11:04:50.387 回答