OSI层
|
功能
|
TCP/IP协议
|
应用层 |
文件传输,电子邮件,文件服务,虚拟终端
|
TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
|
表示层
|
数据格式化,代码转换,数据加密
|
-
|
会话层
|
数据格式化,代码转换,数据加密
|
-
|
传输层
|
提供端对端的接口
|
TCP,UDP
|
网络层
|
为数据包选择路由
|
IP,ICMP,RIP,OSPF,BGP,IGMP
|
数据链路层
|
传输有地址的帧以及错误检测功能
|
SLIP,CSLIP,PPP,ARP,RARP,MTU
|
物理层
|
以二进制数据形式在物理媒体上传输数据
|
ISO2110,IEEE802,IEEE802.2
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var
net = require(
'net'
);
var
server = net.createServer(
function
(socket) {
//新的连接
socket.on(
'data'
,
function
(data) {
console.log(
'服务端接收到客户端的消息:'
+ data.toString());
socket.write(
'服务端回应:你好'
);
});
socket.on(
'end'
,
function
() {
console.log(
'服务端断开连接'
);
});
});
server.listen(8124,
function
() {
console.log(
'TCP服务创建'
);
});
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
var
net = require(
'net'
);
var
client = net.connect({port:8124},
function
() {
console.log(
'客户端连接成功'
);
client.write(
'客户端发起问候:你好'
);
});
client.on(
'data'
,
function
(data) {
console.log(
'客户端接收服务端消息:'
+ data.toString());
client.end();
});
client.on(
'end'
,
function
() {
console.log(
'客户端断开连接'
);
});
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var
dgram = require(
'dgram'
);
var
server = dgram.createSocket(
'udp4'
);
server.on(
'message'
,
function
(msg, rinfo) {
console.log(
'服务端获取信息:'
+msg+
'来自:'
+rinfo.address+
':'
+rinfo.port);
});
server.on(
'listening'
,
function
() {
var
address = server.address();
console.log(
'服务端正在监听:'
+address.address+
':'
+address.port);
});
server.bind(41234);
|
1
2
3
4
5
6
7
8
9
|
var
dgram = require(
'dgram'
);
var
client = dgram.createSocket(
'udp4'
);
var
message =
new
Buffer(
'我是客户端的消息'
);
client.send(message, 0, message.length, 41234,
'127.0.0.1'
,
function
(err, bytes) {
console.log(
'客户端发送完成,关闭客户端'
);
client.close();
});
|
1
2
3
4
5
6
7
8
9
|
创建服务端:
var
http = require(
'http'
);
http.createServer(
function
(req, res) {
res.writeHead(200, {
'Content-type'
:
'text/plain'
});
res.end(
'Hello world!\n'
);
}).listen(8000);
console.log(
'服务器已开启'
);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
var
http = require(
'http'
);
var
options = {
hostname:
'127.0.0.1'
,
port: 8000,
method:
'GET'
,
path:
'/'
};
var
req = http.request(options,
function
(res) {
console.log(
'Status:'
+res.statusCode);
console.log(
'Headers:'
+JSON.stringify(res.headers));
res.setEncoding(
'utf-8'
);
res.on(
'data'
,
function
(chunk) {
console.log(chunk);
});
});
req.end();
|
net模块提供了一个异步网络包装器,用于TCP网络编程,它包含了创建服务器和客户端的方法。dgram模块用于UDP网络编程。
参考链接:https://nodejs.org/api/net.html, https://nodejs.org/api/dgram.html
net模块通过net.createServer方法创建TCP服务器,通过net.connect方法创建客户端去连接服务器。
// server.js var net = require('net'); // 创建TCP服务器 var server = net.createServer(function(socket) { console.log('client connected'); // 监听客户端的数据 socket.on('data', function(data) { console.log('server got data from client: ', data.toString()); }); // 监听客户端断开连接事件 socket.on('end', function(data) { console.log('connection closed'); }); // 发送数据给客户端 socket.write('Hello\r\n'); }); // 启动服务 server.listen(8080, function() { console.log('server bound'); });
// client.js var net = require('net'); // 连接服务器 var client = net.connect({port: 8080}, function() { console.log('connected to server'); client.write('World!\r\n'); }); // 接收服务端的数据 client.on('data', function(data) { console.log('client got data from server: ', data.toString()); // 断开连接 client.end(); }); // 断开连接 client.on('end', function() { console.log('disconnected from server'); });
在一个终端运行TCP服务器代码,另一个终端运行TCP客户端代码,结果如下:
首先创建TCP服务器;然后是接收客户端连接请求;获取客户端发送过来的数据;允许多个客户端同时连接,所以需要接收所有的用户连接;服务器广播数据,把来自客户端的数据转发送给其他所有客户端;最后把关闭连接的客户端从服务器广播列表中给删除掉。
// chatServer.js var net = require('net'); //第一步 创建TCP服务器 var server = net.createServer(); // 存储所有客户端socket //第四步,服务器接收所有的用户连接
var sockets = [];
//第二步 接收客户端请求 server.on('connection', function(socket) { console.log('Got a new connection'); //第五步,服务器广播数据 sockets.push(socket); //第三步,获取客户端发送过来的数据 socket.on('data', function(data) { console.log('Got data: ', data); sockets.forEach(function(otherSocket) { if (otherSoecket !== socket) { otherSocket.write(data); } }); ]); // 第六步,关闭连接客户端从服务器广播列表删除 socket.on('close', function() { console.log('A client connection closed'); var index = sockets.indexOf(socket); sockets.splice(index, 1); }); }); server.on('error', function(err) { console.log('Server error: ', err.message); }); server.on('close', function() { console.log('Server closed'); }); server.listen(8080);
process模块是Node.js的一个全局模块,可以在任何地方直接使用而无需通过require方法引入。process模块允许获得或修改当前Node.js进程的设置。
process.stdin用于获取来自标准输入的可读流(Readable Stream)。
// chatClient.js var net = require('net'); process.stdin.resume(); process.stdin.setEncoding('utf8'); var client = net.connect({ port: 8080 }, function() { console.log('Connected to server'); // 获取输入的字符串 console.log('input: '); process.stdin.on('data', function(data) { // 发送输入的字符串到服务器 console.log('input: '); client.write(data); // 输入 'close' 字符串时关闭连接 if (data === 'close\n') { client.end(); } }); }); // 获取服务端发送过来的数据 client.on('data', function(data) { console.log('Other user\'s input', data.toString()); }); client.on('end', function() { console.log('Disconnected from server'); // 退出客户端程序 process.exit(); });
一个终端窗口执行$ node chatServer.js运行服务器代码。
另外两个终端窗口执行$ node chatClient.js运行客户端代码。
结果如下:
UDP通过dgram.createSocket创建服务。
// udpServer.js var dgram = require("dgram"); var server = dgram.createSocket("udp4"); server.on("error", function(err) { console.log("server error:\n" + err.stack); server.close(); }); // 接收来自客户端的消息 server.on("message", function(msg, rinfo) { console.log("server got: " + msg.toString() + " from " + rinfo.address + ":" + rinfo.port); }); // 监听服务 server.on("listening", function() { var address = server.address(); console.log("server listening on " + address.address + ":" + address.port); }); server.bind(41234); // server listening 0.0.0.0:41234
发送消息必须通过Buffer创建。
// udpClient.js var dgram = require('dgram'); var client = dgram.createSocket('udp4'); var message = new Buffer('hello shiyanlou'); client.send(message, 0, message.length, 41234, 'localhost', function(err, bytes) { client.close(); });
运行结果如下
1、Error: connect ECONNREFUSED 127.0.0.1:8080
服务器端口没开。
本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/5056519.html有问题欢迎与我讨论,共同进步。