在节点js中构build可伸缩的tcp服务器

所以我不确定我的头衔是否是最准确的,但我试图给我最好的补偿。

我最近在面试中被问到这个问题(或多或less,因为我不记得完整的问题,这是我的头顶):

你需要制作一个简单的tcp服务器,可以通过puTTy(或其他任何客户端)访问。

一旦你进入,你需要写:

login<用户名>(无所谓用户名)。

一旦你login,你可以做3个操作:

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

  • 切换<deviceId> <on | off> – 打开或closures设备。

  • SetValue <deviceId> <double> – 设置设备的范围值(空调温度)

重要的事:

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

  • 可扩展性 – 我们目前有4个操作(login,showDevices,Switch,SetValue) – 编写服务器,以便其他程序员可以很容易地添加另一个操作。 代码应该是不言自明的

任务可以用任何语言书写。 我试图用C#编写,直到我被卡住,无法继续。 最近我更多地进入Node js,并决定再给这个…所以我问你们这个解决scheme一些有用的直接。

  • 如何在通信和逻辑层之间最好地分离?

  • 有什么样的devise模式,我应该实现添加命令更容易? (我看了一下命令devise模式,我不能想象这是否意味着这种情况)

  • 任何能够让我走上正轨的东西(没有告诉我究竟该做什么)将不胜感激。

谢谢!

我真的很喜欢这个挑战,我可能不得不为了自己的技术采访而偷走它。 🙂

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

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

可用的命令只是(取决于你如何允许升级)给定目录中的所有模块(比如commander.js)或者是以某个关键字作为前缀的所有模块(就像grunt一样)。

如果您不想自己动手,可以使用require-directory模块来请求目录中的所有文件,然后通过数组访问表示法访问每个命令。

让我知道如果这是太高的水平,但这是我在节点采取的一般方法。

在C#中它会更难一点,你需要依靠reflection来允许在运行时添加新的插件,否则使用DI容器在编译时查找它们。