Node.js:使用套接字连接到服务器

我今天刚刚开始使用Node.js,并认为我会从我认为的简单脚本开始:通过套接字连接到服务器,并发送一些数据,然后再接收它。 我正在创build一个命令行实用程序。 浏览器中没有东西。

一个服务器的例子可能是memcached,beanstalkd等等。看来net模块是这个工作的正确工具,但是我仍然对Node.js的处理方式有些模糊。 一些帮助,将不胜感激。

更新#1

让我看看我是否可以把这个问题分解成几个小问题。 我甚至不喜欢问这样的问题,但Node.js文档非常稀less,大部分6个月前编写的文档已经过时。

1)所以我可以使用net.stream.write()发送数据到远程服务器,但我不知道如何得到回应。 我什至不知道如何testingwrite()完成时,因为它不需要callback。

2)关于整个event.emit事情如何运作的一些线索将是很好的。 我认为这是我在这些事情上失踪的关键石头。

更新#2

在这里,我仍然对执行客户端程序感到困惑。 让我给出一个典型的发送请求=>获取响应系统:

1)我将callback绑定到net模块以获取响应和其他事件,包括必要的绑定以从服务器获取响应。

2)我使用stream.write()发送请求到服务器。

3)我什么都不做,因为我绑定的“数据”事件将得到服务器的响应。

这是事情变得棘手的地方。 假设我在调用绑定的“data”事件之前调用了stream.write() 两次 。 现在我有一个问题。 当“数据”事件发生时,我怎么知道这2个请求中的哪一个是响应? 我保证答复会按照要求的顺序进行? 如果响应以不同的顺序返回呢?

首先,让我们清楚EventEmitter是什么。 JavaScript,因此Node.js是asynchronous 。 这意味着,不必等待服务器对象上的传入连接,而是向对象添加一个listener并向其传递一个callback function ,然后在事件发生时“尽快”执行。

这里和那里仍然在等待着,但是已经被抽离了。

我们来看看这个简单的例子:

 // #1) create a new server object, and pass it a function as the callback var server = net.createServer(function (stream) { // #2) register a callback for the 'connect' event stream.on('connect', function () { stream.write('hello\r\n'); // as }); // #3) register a callback for the 'data' event stream.on('data', function (data) { stream.write(data); }); // #4) register a callback for the 'end' event stream.on('end', function () { stream.write('goodbye\r\n'); stream.end(); }); }); // #5) make the server listen on localhost:8124 server.listen(8124, 'localhost'); 

所以我们创build服务器并把它传递给callback function ,这个函数还没有执行。 在这里传递函数基本上是为服务器对象的connection事件添加侦听器的快捷方式。 之后,我们在#5启动服务器。

现在在传入连接的情况下会发生什么?

  1. 由于我们传递给createServer的函数绑定到connection事件,现在它被执行。

  2. 它通过钩住事件的callback,将connectdataend事件监听器添加到stream object (代表单个连接)。

  3. 之后, stream触发connect事件,因此在#2传递的函数被执行并将hello\r\n写入stream。 函数如何知道应该写入哪个stream? 闭包是答案,函数inheritance了它创build的范围,因此在函数stream内仍然引用单独的连接,触发了我们现在正在进行的callback。

  4. 现在客户端通过连接发送一些数据,这使得stream对象调用它的data事件,因为我们在#3绑定了一个函数给这个事件,我们现在把传入的数据回送给客户端。

  5. 在客户端closures连接的情况下,我们在#4绑定的函数被调用,写入goodbye\r\n ,之后closures我们的连接。

这是否使事情更清楚一点? 那肯定会让整件事情变得容易多了。 Node和JavaScript在Browsers中一样,是single threaded 。 在给定的时间点只有一件事发生。

简单地说,所有这些callbacks最终都在一个全局队列中,然后被一个接一个地调用,所以这个队列可能(抽象)如下所示:

  | connection event for a new stream | data event for stream #12 | callback set via setTimeout v close event of yet another stream 

这些现在是从上到下执行的,在它们之间什么都不会发生。 没有机会,当你在绑定data事件的callback做某些事情时,会发生其他事情,并奇迹般地改变系统的状态。 即使服务器上有一个新的传入连接,它的事件也会排队等待,直到它所有的事件(包括当前所在的data事件)结束。