如何在 Angular 应用程序中使用 Node.js“Net”类(或其他 TCP 后端)

Posted

技术标签:

【中文标题】如何在 Angular 应用程序中使用 Node.js“Net”类(或其他 TCP 后端)【英文标题】:How to use Node.js "Net" class (or other TCP back-end) in an Angular application 【发布时间】:2017-10-24 17:32:38 【问题描述】:

我是 Node.js 和 Angular 的新手,我将用我的问题来证明这一点。

在我使用的 Angular 教程中,我看到了使用 Angular“服务”实现的“后端”部分,通过例如创建。 “ng c s myservice”,其中 myservice 成为添加到应用程序提供程序列表中的可注入项。我见过的大多数示例要么使用本地测试数据存根实现此服务,要么通过对 Mongo 数据库之类的 http 请求实现此服务。

但是,我的 (Angular) 应用程序需要连接到后端的 TCP 服务器。不能使用 http 协议。

我尝试的第一件事是socket.io-client,只是发现它只是http。然后我尝试了 node.js 的 Net 类,就像这样(在给定端口上侦听一个简单的 TCP 服务):

import  Injectable  from '@angular/core';

@Injectable()
export class RemoteService 
  net = require('net');
  client;
  serverStatus: string = 'Unknown';
  PORT: number = 51101;
  IP = '127.0.0.1';

  constructor()  
    console.log('Initializing remote client. Calling ' + this.IP + ':' + this.PORT + ' ...');

    this.client = this.net.createConnection( port: this.PORT ,  host : this.IP , () => 
      console.log('Connected to server!!!');
    );
  

...但这会导致浏览器控制台出现此错误:

ERROR TypeError: this.net.createConnection is not a function

当我研究该特定错误时,常见的解释(简短版本)是“您无法通过浏览器执行此操作”。 (一个例子here。)

我知道为什么不能从“浏览器”执行 TCP 或 UDP 或类似操作。我没有得到的是我的后端部分如何被称为“浏览器”。任何人都可以为我澄清这一点吗? (我是否误解了 Angular 的能力?)

是否可以在 Angular 服务中使用 Node.js's Net class,如果可以,如何使用?

【问题讨论】:

Nodejs 在后端(服务器)运行,Angular 在前端运行。你可能应该使用 Angular 的 HttpClient:angular.io/guide/http 您的 Angular 应用没有“后端”。一切都在浏览器中运行。您的应用程序可能会“连接”到后端,但这将是在服务器上运行的不同应用程序。也许这已经发生了,但是您没有在问题中解释后端运行的是什么以及如何连接到它。 所以你有一个使用节点本机网络模块的 TCP 服务器。你说你不能使用http协议?所有 Websocket 交互都需要 http 握手。从 Socket.io 切换到 net 模块并不能解决您的问题,这是完全相同的事情。您能否详细说明一下您的后端情况? @ChristianBenseler:你的回答总结了:我想做的事是做不到的。我对 Angular 所说的“后端”的含义有一个基本的误解(这是它说“前端的 HTTP 请求”的方式)。我必须创建与 HTTP 服务器通信所需的 (C++) 服务(痛苦,但可行),并在我的 Angular 应用程序中使用 HttpClient。 我还需要弄清楚(C++)HTTP 服务器如何异步向我的 Angular 应用程序提供数据;有少量数据必须以精确的 (1Hz) 间隔推送。任何关于我如何实现这一点的建议将不胜感激! (我知道另一种方法是在 1Hz 下使用计时器和 http.get(),但我真的想避免这样的设计。) 【参考方案1】:

如果您像这样设置后端,您可以使用 ng2-socket-io 模块客户端与服务器通信。 https://www.npmjs.com/package/ng2-socket-io

var net = require("net");
var tcpServer = net.createServer();
var datas = [];
var sockets = [];

tcpServer.on('connection', function(socket)
    console.log('connection established');
    sockets.push(socket);
    socket.setEncoding('utf8');
    socket.on('data', function(data)
        console.log(data);
    );
);

tcpServer.listen(3333, '127.0.0.1');

【讨论】:

以上是关于如何在 Angular 应用程序中使用 Node.js“Net”类(或其他 TCP 后端)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Angular 4 添加到现有的 node.js 应用程序

如何使用 Node.js 从 Angular 将日期插入 MySQL DATETIME 列?

如何将 express 和 node 设置到现有的仅前端 Angular 2 项目中?

在 node.js/angular 应用程序中查询来自不同主机的数据时,如何遵守访问控制起源异常? [复制]

如何从 Angular 6 向 node.js 发送 https 请求

用于后端和前端的Angular 2 + Node JS