网络编程
构建 TCP 服务
- 创建 TCP 服务器端
var net = require('net');
var server = net.createServer(function (socket) {
// 新的连接
socket.on('data', function (data) {
socket.write('Hello');
});
socket.on('end', function () {
console.log('连接断开');
});
socket.write('Hello world \n');
});
server.listen(8124, function () {
console.log('server bound');
});
- net 模块构造客户端
var net = require('net');
var client = net.connect({ port: 8124 }, function () {
console.log('client connected');
client.write('world \r\n');
});
client.on('data', function (data) {
console.log(data.toString());
client.end();
});
client.on('end', function () {
console.log('client disconnected');
});
TCP 服务的事件
服务器事件
- listening
- connection
- close
- error
连接事件
服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可读可写 Stream 对象
- data
- end
- connect
- drain
- error
- close
- timeout
// 由于 TCP 套接字是可读可写的 Stream 对象,可以利用 pipe() 方法巧妙实现管道操作 // 实现 echo 服务器 var net = require('net'); var server = net.createServer(function (socket) { socket.write('Echo server \r\n'); socket.pipe(socket); }); server.listen(1337, '127.0.0.1');
构建 UDP 服务
- 创建 UDP 服务器端
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
server.on('message', function (msg, rinfo) {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
server.on('listening', function () {
var address = server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
server.bind(41234);
- 创建 UDP 客户端
var dgram = require('dgram');
var message = new Buffer('Hello world');
var client = dgram.createSocket('udp4');
client.send(message, 0, message.length, 41234, 'localhost', function (err, bytes) {
client.close();
});
UDP 套接字事件
UDP 套接字相对 TCP 套接字使用起来更简单,它只是一个 EventEmitter 的实例,而非 Stream 的实例
- message
- listening
- close
- error
构建 HTTP 服务
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello world\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://localhost:1337');
HTTP 服务事件
- connection
- request
- close
- checkContinue
- connect
- upgrade
- clientError
- HTTP 客户端
var options = {
hostname: '127.0.0.1',
port: 1334,
path: '/',
method: 'GET'
};
var req = http.request(options, function (res) {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log(chunk);
});
});
req.end();
HTTP 客户端事件
- response
- socket
- connect
- upgrade
- continue
构建 WebSocket 服务
WebSocket 较 传统 HTTP 的好处
- 客户端与服务端只建立一个 TCP 连接,可以使用更少的连接
- WebSocket 服务器端可以推送数据到客户端,比 HTTP 请求响应模式更灵活、更高效
- 有更轻量级的协议头,减少数据传送量
WebSocket 握手
- 客户端建立连接时,通过 HTTP 发起请求报文
- 一旦 WebSocket 握手成功,服务器端与客户端会呈现对等的效果,都能接收和发送消息
WebSocket 数据传输
- 在握手完成后,当前连接不再进行 HTTP 交互,而是开始 WebSocket 的数据帧协议,实现客户端与服务器端的数据交换