锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 网站前端开发中级 / 使用Node.JS、TypeScript和WebSockets开发聊天服务器
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

使用Node.JS、TypeScript和WebSockets开发聊天服务器

本文原文来自:https://www.codeproject.com/Articles/871622/Writing-a-Chat-Server-using-Node-js-TypeScript-and。源代码请到上面链接上自行下载。本文对链接里的英文关键位置进行了翻译,禁止转载,祝大家学习愉快,有更多问题请找锐英源孙老师,QQ396806883,微信ryysoft。


介绍

JavaScript正确使用时,开发人员可以编写干净、模块化的代码。也就是说,该语言包含一些怪癖,可以让更多的新手JavaScripters混淆,比如函数调用模式 ; 开发人员最终会习惯于运作,但会遇到挫折。
TypeScript语言由C#的首席架构师Anders Hejlsberg开发,它是一个JavaScript的超集,它引入了静态类型和泛型等功能,以及ECMAScript 6和7提案(如lambda表达式)。编译器自然提供类型检查,这增强了开发人员对其代码的信心。

该项目

在本教程中,我们将使用Node.js和WebSockets编写一个非常简单的聊天服务器,它可以通过TCP进行实时双向通信。当客户端向服务器发送消息时,它将被验证并广播到所有连接的客户端:

您可以在GitHub中查看我们将要完成的源代码。
虽然您可以使用Visual Studio开发TypeScript项目,但我已经以独立于平台的方式编写了本教程,因此您可以在Windows,Linux和OS X之间构建和运行服务器。

配置

如果你还没有准备好安装Node.js。要先安装npm,我们将使用的软件包管理器来安装我们服务器的依赖项,以及TypeScript编译器。准备好后,通过npm install -g typescript在命令行运行来安装所述编译器(请注意,在Windows上,可以使用已配置的Node.js命令提示符。)您可能需要root或管理用户才能在全局环境下安装Node模块。
接下来,为项目创建一个目录。从命令行输入并运行npm init :

            cd <your_project_directory>
            npm init 

这将开始一个提示,最终将创建一个可以包含依赖关系信息和其他各种元数据的package.json文件。
在我们的项目中唯一的依赖是ws包。运行安装npm install --save ws。这将把它添加到package.json文件中,以便随后可以通过简单的调用来解析依赖关系npm install。
注意:要构建ws所需的依赖项之一,您需要安装Python 2。Python 不是我们项目的产品依赖。
在编写任何代码之前,最好把我们项目的目录结构体现出来。在项目的根目录中,创建以下文件夹:

  • Build - 包含我们编译的JavaScript
  • declarations  - 包含任何所需的TypeScript 声明文件(实际比你看到的或许更多)
  • src - 包含我们的TypeScript源代码

声明文件

“我们现在可以编码吗?”
还没。
当使用第三方框架或库时,TypeScript编译器需要了解它们的publicAPI的结构; 否则我们的构建将失败。TypeScript通过声明文件提供机制
写这些文件可以证明是一个单调的任务,在我看来是语言的缺点之一。幸运的是,绝佳的DefinitelyTyped项目承载了大量流行的JavaScript技术的声明文件。
在我们的例子中,我们需要两个声明文件; 一个用于Node.js和ws。他们可以在这里这里找到。将它们保存到声明文件夹中。
我们几乎准备好编码,但只是一个快速的警告; ws的声明文件依赖于Node的声明,但指向的路径不正确。打开ws.d.ts文件并找到以下行:

            /// <reference path =“../ node / node.d.ts”/> 

替换为:

            /// <reference path =“node.d.ts”/> 

编译器使用这些引用注释来根据预期的公共合同来验证第三方代码。

现在我们可以写代码!

在编写我们的服务器代码之前,我们来写我们的数据模型。在名为models.tssrc目录中创建一个文件,并写入以下代码行:

            'use strict';
            interface Message {
              name: string;
              message: string;
              }
          

如果你想知道关于看似随意的文字字符串“'use strict';”的参考,请阅读
现在在同一个文件中写下面的类,实现这个接口:

            export class UserMessage implements Message {
            private data: { name: string; message: string };  

          constructor(payload: string) { var data = JSON.parse(payload);

                   if (!data.name || !data.message) { throw new Error('Invalid message payload received: ' + payload); }

                   this.data = data;
}

          get name(): string { return this.data.name;
}

          get message(): string { return this.data.message; }
}

在这段代码中可能会突出的一些事情:

  • export关键字-公开暴露一个对象到其他TypeScript模块。这背后的潜在机制取决于所使用的基础技术。在Node.js的上下文中,它为其全局exports对象附加一个适当的属性
  • private data: { [...] } - 这是利用TypeScript的类型检查机制来确定数据字段是一个包含两个属性的对象; name和message。虽然由于WebSocket数据的动态性质,在构造函数中发生了一些手动验证,但这仍然提供了一些关于预期契约的清晰度
  • get name(): string { ... - 就像在C#中一样,我们可以编写访问器来实现数据的封装!

现在到了令人兴奋的时刻,开始写我们的WebSocket服务器!在src文件夹中,创建一个名为server.ts的文件并写下如下代码:

            /// <reference path='../declarations/node.d.ts' /> 
/// <reference path='../declarations/ws.d.ts' />
'use strict';

import WebSocket = require('ws'); import models = require('./models');

var port: number = process.env.PORT || 3000; var WebSocketServer = WebSocket.Server; var server = new WebSocketServer({ port: port });

server.on('connection', ws => { ws.on('message', message => { try { var userMessage: models.UserMessage = new models.UserMessage(message); broadcast(JSON.stringify(userMessage)); } catch (e) { console.error(e.message);
} }); });

function broadcast(data: string): void { server.clients.forEach(client => { client.send(data); });       };

console.log('Server is running on port', port);

关于这段代码的一些兴趣点:

  • import关键字-我们可以在简朴的Node.js服务器中声明一个变量,但此关键字的美妙之处在于,编译器会自动建立相应的依赖关系(SANS节点模块)。在我们的例子中,编译server.ts也将编译models.ts
  • var port: number - 另外演示了TypeScript的静态类型
  • lambda表达式 有趣的是,这些已经在ECMAScript 6中提出

现在我们可以编译我们的代码。在命令行中,确保您位于项目的根目录中并运行编译器:


tsc --removeComments --module commonjs --target ES5 --outDir build src / server.ts

我们来解构tsc的论点:

  • --removeComments - 在编译的生产代码中确实不需要注释
  • --module commonjs - 这可以通过Node的CommonJS模块系统加载依赖关系。没有这个,编译器就无法建立我们的模型脚本
  • --target ES5 - 编译符合ECMAScript 5标准的JavaScript。在我们的例子中,我们需要它使用属性访问器,它们使用JavaScript实现Object.defineProperty; 这在ECMAScript 5.1中是标准化的
  • --outDir build - 指定我们的构建目录
  • src/server.ts - 我们要编译的脚本。请记住,这也将编译我们的模型脚本

当代码编译时,可以使用它来运行node build/server。
试试看!
在现实生活中,前端团队会写一个客户端应用程序来消费连接。为了简单起见,我们可以通过WebSocket在浏览器中创建实例来演示我们的服务器。它们在Chrome,Firefox和IE10 +中都支持。
打开您的浏览器的开发人员控制台并写下列内容以创建多个WebSocket连接:

            var  socket = new WebSocket('ws://localhost:3000');            

socket.onmessage = function (message) { console.log('Connection 1', message.data); };

var socket2 = new WebSocket('ws://localhost:3000');

socket2.onmessage = function (message) { console.log('Connection 2', message.data); };

var socket3 = new WebSocket('ws://localhost:3000');

socket3.onmessage = function (message) { console.log('Connection 3', message.data); };

发送消息,调用socket.send(JSON.stringify({ name: 'Bob', message: 'Hello' }));。您应该看到所有三个连接都接收到数据:

我对TypeScript的想法
作为一个JavaScript开发人员,我对这种语言的大部分怪癖和特质都很熟悉,所以在我所有的项目中都没有一个基本的动机。不过,作为C#开发人员,我喜欢TypeScript带来的功能。静态类型,接口,泛型,lambdas,以及其他所有优点。就个人而言,我觉得有必要在需要在对数据进行细致验证的浏览器或Node.js项目中使用它。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内