Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在node js中构建可伸缩的tcp服务器_Node.js_Design Patterns_Tcp_Dependency Injection - Fatal编程技术网

Node.js 在node js中构建可伸缩的tcp服务器

Node.js 在node js中构建可伸缩的tcp服务器,node.js,design-patterns,tcp,dependency-injection,Node.js,Design Patterns,Tcp,Dependency Injection,所以我不确定我的标题是否最准确,但我尽力给出最好的解释 我最近在一次工作面试中被问到这个问题(或多或少,因为我不记得完整的问题。这是我脑子里想不出来的): 您需要创建一个简单的tcp服务器,可以通过puTTy(或任何其他客户机)访问该服务器 一旦你进入,你需要写: 登录(不管是什么用户名) 登录后,您可以执行3项操作: showDevices-将返回一个设备列表(目前我们有台灯和空调)-我们可以编写模拟对象。让我们假设他们有一个数字Id 开关-设置设备的开或关 设置值-设置设备的范围值(空

所以我不确定我的标题是否最准确,但我尽力给出最好的解释

我最近在一次工作面试中被问到这个问题(或多或少,因为我不记得完整的问题。这是我脑子里想不出来的):

您需要创建一个简单的tcp服务器,可以通过puTTy(或任何其他客户机)访问该服务器

一旦你进入,你需要写:

登录(不管是什么用户名)

登录后,您可以执行3项操作:

  • showDevices-将返回一个设备列表(目前我们有台灯和空调)-我们可以编写模拟对象。让我们假设他们有一个数字Id

  • 开关<设备ID><开|关>-设置设备的开或关

  • 设置值-设置设备的范围值(空调温度)

重要事项:

  • 分离-分离逻辑层和通信层。我们现在使用telenat服务器,但将来我们希望切换到http服务器。这个过程应该很容易

  • 可扩展性-我们目前有4个操作(登录、showDevices、Switch、SetValue)-编写服务器,以便其他程序员很容易添加另一个操作。代码应该是自解释的

作业可以用任何语言写。我试着用C#写,直到我卡住了,无法继续。最近我更喜欢Node js,并决定再尝试一次。。。所以我想请你们提供一些关于这个解决方案的有用指导

  • 如何最好地分离通信层和逻辑层

  • 我是否应该实现某种设计模式,以便更轻松地添加命令?(我查看了命令设计模式,我无法确定它是否适用于这种情况)

  • 任何能够指导我走上正确的道路(而不告诉我该做什么)的事情都将受到感激


谢谢

我真的很喜欢这个挑战,我可能不得不在自己的技术面试中偷取它。:)

我认为(在你要求我不要写代码时,我没有深入编写代码),我在Node中处理它的方式类似于
commander.js
模块

因此,一个处理套接字内容的模块,可能只是一个允许连接的server.js文件,然后需要一个公开可用命令的模块

可用的命令只是(取决于您希望如何允许升级)给定目录中的所有模块(如commander.js所做的)或以某个关键字为前缀的所有模块(如grunt所做的)

如果您不想自己执行,可以使用
require directory
模块要求目录中的所有文件,然后通过数组访问符号访问每个命令

如果级别太高,请告诉我,但这是我在Node中采用的一般方法


在C#中,这会有点困难,您需要依赖反射来允许在运行时添加新插件,或者使用DI容器在编译时查找它们

直到现在我才知道commander.js。看来它能轻而易举地解决我的问题!我会更深入地研究它(尽管我怀疑在我的解决方案中使用commander.js是否是招聘人员希望我做的事情,也许深入研究模块的实现可以帮助我完成我需要的一切),这取决于谁在招聘。我可以告诉你,当我采访一些人时,我会给那些选择使用第三方图书馆的人打最高分,他们也会解释图书馆的功能、使用图书馆的风险等。我会在一两天内尝试一下。如果你的答案太高,我可能需要进一步的帮助。在这种情况下,一些代码会很有用:)