8. 网络编程与 WebSockets
8.1 创建 TCP 服务器
Node.js 提供了 net
模块,可以用来创建 TCP 服务器和客户端。
-
创建 TCP 服务器
const net = require('net'); const server = net.createServer((socket) => { console.log('Client connected'); socket.on('data', (data) => { console.log('Received data:', data.toString()); socket.write('Hello from server'); }); socket.on('end', () => { console.log('Client disconnected'); }); }); server.listen(8080, () => { console.log('TCP server listening on port 8080'); });
-
创建 TCP 客户端
const net = require('net'); const client = net.createConnection({ port: 8080 }, () => { console.log('Connected to server'); client.write('Hello from client'); }); client.on('data', (data) => { console.log('Received from server:', data.toString()); client.end(); // 结束连接 }); client.on('end', () => { console.log('Disconnected from server'); });
8.2 创建 HTTP 服务器与客户端
Node.js 的 http
模块可以用来创建 HTTP 服务器和客户端。
-
创建 HTTP 服务器
const http = require('http'); const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello, world!\n'); }); server.listen(3000, () => { console.log('HTTP server listening on port 3000'); });
-
创建 HTTP 客户端
const http = require('http'); const options = { hostname: 'localhost', port: 3000, path: '/', method: 'GET' }; const req = http.request(options, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { console.log('Response:', data); }); }); req.on('error', (err) => { console.error('Request error:', err); }); req.end();
8.3 使用 WebSocket 实现实时通信
WebSocket 允许在客户端和服务器之间建立持久的双向通信连接。ws
模块是 Node.js 中处理 WebSocket 的常用库。
-
安装
ws
模块npm install ws
-
创建 WebSocket 服务器
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { console.log('Client connected'); ws.on('message', (message) => { console.log('Received message:', message); ws.send('Hello from server'); }); ws.on('close', () => { console.log('Client disconnected'); }); }); console.log('WebSocket server listening on port 8080');
-
创建 WebSocket 客户端
const WebSocket = require('ws'); const ws = new WebSocket('ws://localhost:8080'); ws.on('open', () => { console.log('Connected to server'); ws.send('Hello from client'); }); ws.on('message', (message) => { console.log('Received message:', message); ws.close(); // 结束连接 }); ws.on('close', () => { console.log('Disconnected from server'); });
8.4 使用 HTTP/2 实现更高效的网络通信
HTTP/2 是 HTTP 的更新版本,具有更好的性能和效率。Node.js 支持 HTTP/2。
-
创建 HTTP/2 服务器
const http2 = require('http2'); const fs = require('fs'); const path = require('path'); const server = http2.createSecureServer({ key: fs.readFileSync(path.join(__dirname, 'server.key')), cert: fs.readFileSync(path.join(__dirname, 'server.crt')) }); server.on('stream', (stream, headers) => { stream.respond({ 'content-type': 'text/plain', 'status': 200 }); stream.end('Hello, HTTP/2 world!\n'); }); server.listen(8443, () => { console.log('HTTP/2 server listening on port 8443'); });
-
创建 HTTP/2 客户端
const http2 = require('http2'); const client = http2.connect('https://localhost:8443'); const req = client.request({ ':path': '/' }); req.on('response', (headers, flags) => { console.log('Response headers:', headers); }); req.on('data', (chunk) => { console.log('Received data:', chunk.toString()); }); req.on('end', () => { client.close(); });
总结
网络编程和 WebSockets 是构建网络应用程序和实现实时通信的关键技术。Node.js 提供了处理 TCP、HTTP 和 WebSocket 的强大功能,使得创建高效的网络服务和客户端变得更加容易。掌握这些技能将使你能够构建复杂的网络应用程序,并实现实时数据交换和通信。