为什么JavaScript用于网络编程?
曾经,JavaScript只是用于按钮动画和表单验证的语言。而今天,它已成为创建网络应用程序的强大工具。JavaScript网络编程打开了通往实时世界的大门:聊天室、在线游戏、数据流传输、监控系统,甚至是你自己的Web服务器。
在本文中,我们不会枯燥地重写文档。我们将从简单的HTTP请求一路走到完整的WebSocket连接。你将看到Node.js如何将浏览器语言转变为强大的网络引擎。准备好了吗?出发!
基础:HTTP与Node.js模块
任何JavaScript网络编程都从理解协议开始。最流行的是HTTP。在浏览器中,你使用fetch()或XMLHttpRequest,但服务器端需要不同的方法。
创建一个简单的HTTP服务器
Node.js提供了内置的http模块。以下是一个最小示例,它对任何请求都响应"你好,世界!":
const http = require('http');
const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('你好,世界!JavaScript网络编程正在运行!');});
server.listen(3000, '127.0.0.1', () => { console.log('服务器已启动,地址为 http://127.0.0.1:3000/');});通过node server.js运行这段代码,然后打开浏览器。你会看到我们的消息。很简单,对吧?但这只是开始。真正的魔法在我们处理套接字时才会显现。
在JavaScript中处理TCP套接字
HTTP是构建在TCP之上的应用层协议。如果你需要完全控制数据传输,请使用JavaScript套接字。在Node.js中,这由net模块负责。
TCP服务器:接收数据
想象你在编写一个简单的回声服务器。客户端连接,发送消息,服务器将其返回。如下所示:
const net = require('net');
const server = net.createServer((socket) => { console.log('客户端已连接');
socket.on('data', (data) => {现在为这个服务器编写一个客户端。JavaScript客户端-服务器是双向通信:
const net = require('net');
const client = net.createConnection({ port: 8080 }, () => { console.log('已连接到服务器'); client.write('你好,服务器!');});
client.on('data', (data) => { console.log('服务器响应:', data.toString()); client.end();});
client.on('end', () => { console.log('已从服务器断开连接');});先运行服务器,再运行客户端。你会看到数据来回传输。这是所有JavaScript网络协议的基础。
WebSocket:无延迟的实时通信
HTTP和TCP很好,但它们有一个问题:要获取新数据,客户端必须不断发送请求(轮询)。这效率不高。JavaScript中的WebSocket解决了这个问题——一旦建立连接,服务器可以随时发送数据。
Node.js上的WebSocket(ws库)
安装库:npm install ws
服务器:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8081 });
wss.on('connection', (ws) => { console.log('WebSocket客户端已连接');
ws.on('message', (message) => { console.log('收到:',