node提供了net, dgram, http, https 4个模块,分别用于处理TCP, UDP, HTTP, HTTP,适用于服务端和客户端。
TCP服务
// 服务端 serve.js
const net = require('net');
const serve = net.createServer((socket) => {
socket.on('data', (data) => {
socket.write('你好')
})
socket.on('end', () => {
console.log('----连接断开----')
})
socket.write('欢迎来到node世界\n')
})
serve.listen(9000, () => {
console.log('服务连接成功')
})
//客户端 client.js
const net = require('net')
const client = net.connect({port: 9000}, () => {
console.log('客户端连接')
client.write('hello node')
})
client.on('data', data => {
console.log(data.toString())
client.end()
})
client.on('end', () => {
console.log('客户端断开了连接')
})
//运行客户端: node client.js
TCP服务的事件
1. 服务器事件
- listening: 在调用server.listen()绑定端口或Domain Scoket后触发,简洁写法为server.listen(port, listeningListener)
- connection: 每个客户端套接字连接到服务器端时触发
- close: 当服务器关闭时触发
error: 当服务器发生异常时触发,若侦听一个使用中的端口,将会触发一个异常,如果不侦听error事件,服务器将会抛出异常。
2. 连接事件
服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可读可写Stream对象。Stream对象可以用于服务器端和客户端之间的通信,既可以通过data事件从一端读取另一端发来的数据,也可以通过write()方法从一端向另一端发送数据。
data: 当一端调用write() 发送数据时,另一端会触发data事件,事件传递的参数即是write发送的数据。
- end: 当连接中的任意一端发送了FIN数据时,将会触发该事件。
- connect: 该事件用于客户端,当套接字与服务器端连接成功会触发。
- drain: 当任意一端调用write发送数据时,当前这段会触发该事件
- error: 当异常发生时,触发该事件。
- timeout: 当一定时间后连接不在活跃时,该事件将会被触发,通知用户当前该链接被闲置了
UDP服务
UDP又称为用户数据包协议,与TCP一样同属于网络传输层。UDP与TCP最大的不同是UDP不是面向连接的。
TCP中连接一旦建立,所有的会话都是基于连接完成,客户段如果要与另一个TCP服务通信,需要创建一个套接字来完成连接。但是在UDP中,一个套接字可以与多个UDP服务通信,它虽然提供面向事务的简单不可靠信息传输服务,在网络差的情况下存在丢包严重的问题,但是由于它无需连接,资源消耗低,处理快速灵活,所以常常应用在那种偶尔丢一两个数据包也不会产生重大影响的场景下,比如音频,视频等。
// 服务端
const dgram = require('dgram')
const server = dgram.createSocket('udp4')
server.on('message', (msg, rinfo) => {
console.log('server got:'+msg+'from'+rinfo.address+':'+rinfo.port)
})
server.on('listening', () => {
const address = server.address()
console.log('server listening'+address.address+':'+address.port)
})
server.bind(43214)
改套接字将接受所有网卡上的43214端口上的消息,绑定完成后,将触发listening事件。
// 客户端
const dgram = require('dgram')
const message = new Buffer('hello node server')
const client = dgram.createSocket('udp4')
client.send(message, 0, message.length, 43214, 'localhost', (err, bytes) => {
client.close()
})