【问题标题】:How to ping IP Address in Angular 7如何在 Angular 7 中 ping IP 地址
【发布时间】:2021-02-21 17:20:40
【问题描述】:

我想通过获取某种响应或 hack 来 ping IP 地址以获取响应,无论它是否存在。

ping() {
    return this.http.get('http://192.168.2.101')
}

this.deviceService.ping().subscribe(result => {
    console.log(result)
})

但我收到此错误。

【问题讨论】:

  • 使用服务器为您 ping 并以角度使用它的响应
  • 我正在构建的这个应用程序只是一个没有服务器端的 Angular 应用程序。角度不可能吗?
  • 您的 Angular 应用程序可以通过两种协议工作:HTTP 和 WebSocket。 Ping 通过浏览器不支持的 ICMP 协议工作。作为一个选项,您的 Angular 应用程序可能会询问服务器端发送 ping 并将结果返回给 Angular。
  • 这是一个跨域问题。对于本地开发,您可以使用 Allow CROS 插件。
  • 看到您的问题是您正在从浏览器 ping 并且大多数现代浏览器会阻止跨源请求,除非服务器或您的设备允许。我没有使用 Allow CROS Plugin 但我怀疑即使使用它也能正常工作。这更像是一个浏览器阻塞的问题。如果您可以选择更改路由器软件以允许使用 COR 标头,那就太好了。否则,您必须将请求发送到您的应用服务器,然后向路由器发出请求以满足特定需求。如果处理无法添加 CORS 标头的用例,这是正确的方法。

标签: angular ping angular7


【解决方案1】:

这是一个示例,如果任何人必须从客户端执行此操作,一个用例可能是您必须知道客户端是否在线,例如在 Ionic 应用中。

请在this StackBlitz 中查看完整的工作示例(您也可以检查控制台以查看每次 ping 尝试)。

import { HttpClient } from "@angular/common/http";
import { first } from "rxjs/operators";
import { Subscription } from 'rxjs';
...

private source = interval(3000);
...

this.source.subscribe(() => {
  this._http.get('https://www.google.com', { observe: 'response' })
  .pipe(first())
  .subscribe(resp => {
    if (resp.status === 200 ) {
      console.log(true)
    } else {
      console.log(false)
    }
  }, err => console.log(err));
});

first() 只取第一个值很重要,因为间隔会发出新请求,这是我们避免内存泄漏的方法。

{ observe: 'response' } 是我们告诉httpClient 返回完整的 http 对象而不是单独的主体的方式,这样我们就可以访问状态代码。

【讨论】:

  • 感谢您的回答,我会尽快测试:)
  • 谢谢希望对你有帮助!!
  • 谢谢。它也适用于我。但我收到状态为 200 的“HttpErrorResponse”。知道为什么吗?
  • 可能你的回复格式不对? stackoverflow.com/questions/47378340/…
  • @WasiF 嗨!只是好奇你最后的方法是什么。可以帮助特色读者,因为这个答案没有帮助。
猜你喜欢
  • 2013-09-08
  • 2012-07-15
  • 2018-01-14
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2013-06-14
  • 1970-01-01
相关资源
最近更新 更多