Skip to content

Commit c6a3f39

Browse files
committed
完善net文档
1 parent 56e7ba0 commit c6a3f39

File tree

1 file changed

+239
-0
lines changed

1 file changed

+239
-0
lines changed

模块/net.md

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
## 模块概览
2+
3+
net模块是同样是nodejs的核心模块。在http模块概览里提到,http.Server继承了net.Server,此外,http客户端与http服务端的通信均依赖于socket(net.Socket)。也就是说,做node服务端编程,net基本是绕不开的一个模块。
4+
5+
从组成来看,net模块主要包含两部分,了解socket编程的同学应该比较熟悉了:
6+
7+
* net.Server:TCP server,内部通过socket来实现与客户端的通信。
8+
* net.Socket:tcp/本地 socket的node版实现,它实现了全双工的stream接口。
9+
10+
## 简单的 server+client 例子
11+
12+
tcp服务端程序如下:
13+
14+
```js
15+
var net = require('net');
16+
17+
var PORT = 8989;
18+
var HOST = '127.0.0.1';
19+
20+
// tcp服务端
21+
var server = net.createServer(function(socket){
22+
console.log('服务端:收到来自客户端的请求');
23+
24+
socket.on('data', function(data){
25+
console.log('服务端:收到客户端数据,内容为{'+ data +'}');
26+
27+
// 给客户端返回数据
28+
socket.write('你好,我是服务端');
29+
});
30+
31+
socket.on('close', function(){
32+
console.log('服务端:客户端连接断开');
33+
});
34+
});
35+
server.listen(PORT, HOST, function(){
36+
console.log('服务端:开始监听来自客户端的请求');
37+
});
38+
```
39+
40+
tcp客户端如下:
41+
42+
```js
43+
var net = require('net');
44+
45+
var PORT = 8989;
46+
var HOST = '127.0.0.1';
47+
48+
// tcp客户端
49+
var client = net.createConnection(PORT, HOST);
50+
51+
client.on('connect', function(){
52+
console.log('客户端:已经与服务端建立连接');
53+
});
54+
55+
client.on('data', function(data){
56+
console.log('客户端:收到服务端数据,内容为{'+ data +'}');
57+
});
58+
59+
client.on('close', function(data){
60+
console.log('客户端:连接断开');
61+
});
62+
63+
client.end('你好,我是客户端');
64+
```
65+
66+
运行服务端、客户端代码,控制台分别输出如下:
67+
68+
服务端:
69+
70+
```bash
71+
服务端:开始监听来自客户端的请求
72+
服务端:收到来自客户端的请求
73+
服务端:收到客户端数据,内容为{你好,我是客户端}
74+
服务端:客户端连接断开
75+
```
76+
77+
客户端:
78+
79+
```bash
80+
客户端:已经与服务端建立连接
81+
客户端:收到服务端数据,内容为{你好,我是服务端}
82+
客户端:连接断开
83+
```
84+
85+
## 服务端
86+
87+
### server.address()
88+
89+
返回服务端的地址信息,比如绑定的ip地址、端口等。
90+
91+
```js
92+
console.log( server.address() );
93+
// 输出如下 { port: 3000, family: 'IPv4', address: '127.0.0.1' }
94+
```
95+
96+
### server.close(callback])
97+
98+
关闭服务器,停止接收新的客户端请求。有几点注意事项:
99+
100+
* 对正在处理中的客户端请求,服务器会等待它们处理完(或超时),然后再正式关闭。
101+
* 正常关闭的同时,callback 会被执行,同时会触发 close 事件。
102+
* 异常关闭的同时,callback 也会执行,同时将对应的 error 作为参数传入。(比如还没调用 server.listen(port) 之前,就调用了server.close())
103+
104+
下面会通过两个具体的例子进行对比,先把结论列出来
105+
106+
* 已调用server.listen():正常关闭,close事件触发,然后callback执行,error参数为undefined
107+
* 未调用server.listen():异常关闭,close事件触发,然后callback执行,error为具体的错误信息。(注意,error 事件没有触发)
108+
109+
例子1:服务端正常关闭
110+
111+
```js
112+
var net = require('net');
113+
var PORT = 3000;
114+
var HOST = '127.0.0.1';
115+
var noop = function(){};
116+
117+
// tcp服务端
118+
var server = net.createServer(noop);
119+
120+
server.listen(PORT, HOST, function(){
121+
122+
server.close(function(error){
123+
if(error){
124+
console.log( 'close回调:服务端异常:' + error.message );
125+
}else{
126+
console.log( 'close回调:服务端正常关闭' );
127+
}
128+
});
129+
});
130+
131+
server.on('close', function(){
132+
console.log( 'close事件:服务端关闭' );
133+
});
134+
135+
server.on('error', function(error){
136+
console.log( 'error事件:服务端异常:' + error.message );
137+
});
138+
```
139+
140+
输出为:
141+
142+
```bash
143+
close事件:服务端关闭
144+
close回调:服务端正常关闭
145+
```
146+
147+
例子2:服务端异常关闭
148+
149+
代码如下
150+
151+
```js
152+
var net = require('net');
153+
var PORT = 3000;
154+
var HOST = '127.0.0.1';
155+
var noop = function(){};
156+
157+
// tcp服务端
158+
var server = net.createServer(noop);
159+
160+
// 没有正式启动请求监听
161+
// server.listen(PORT, HOST);
162+
163+
server.on('close', function(){
164+
console.log( 'close事件:服务端关闭' );
165+
});
166+
167+
server.on('error', function(error){
168+
console.log( 'error事件:服务端异常:' + error.message );
169+
});
170+
171+
server.close(function(error){
172+
if(error){
173+
console.log( 'close回调:服务端异常:' + error.message );
174+
}else{
175+
console.log( 'close回调:服务端正常关闭' );
176+
}
177+
});
178+
```
179+
180+
输出为:
181+
182+
```bash
183+
close事件:服务端关闭
184+
close回调:服务端异常:Not running
185+
```
186+
187+
### server.ref()/server.unref()
188+
189+
了解node事件循环的同学对这两个API应该不陌生,主要用于将server 加入事件循环/从事件循环里面剔除,影响就在于会不会影响进程的退出。
190+
191+
对出学习net的同学来说,并不需要特别关注,感兴趣的自己做下实验就好。
192+
193+
### 事件 listening/connection/close/error
194+
195+
* listening:调用 server.listen(),正式开始监听请求的时候触发。
196+
* connection:当有新的请求进来时触发,参数为请求相关的 socket。
197+
* close:服务端关闭的时候触发。
198+
* error:服务出错的时候触发,比如监听了已经被占用的端口。
199+
200+
几个事件都比较简单,这里仅举个 connection 的例子。
201+
202+
从测试结果可以看出,有新的客户端连接产生时,net.createServer(callback) 中的callback回调 会被调用,同时 connection 事件注册的回调函数也会被调用。
203+
204+
事实上,net.createServer(callback) 中的 callback 在node内部实现中 也是加入了做为 connection事件 的监听函数。感兴趣的可以看下node的源码。
205+
206+
```js
207+
var net = require('net');
208+
var PORT = 3000;
209+
var HOST = '127.0.0.1';
210+
var noop = function(){};
211+
212+
// tcp服务端
213+
var server = net.createServer(function(socket){
214+
socket.write('1. connection 触发\n');
215+
});
216+
217+
server.on('connection', function(socket){
218+
socket.end('2. connection 触发\n');
219+
});
220+
221+
server.listen(PORT, HOST);
222+
```
223+
224+
通过下面命令测试下效果
225+
226+
```bash
227+
curl http://127.0.0.1:3000
228+
```
229+
230+
输出:
231+
232+
```bash
233+
1. connection 触发
234+
2. connection 触发
235+
```
236+
237+
## 客户端
238+
239+
## 相关链接

0 commit comments

Comments
 (0)