JavaScript 语言 实时通信实现 WebSocket与Server Sent Events

JavaScript阿木 发布于 2025-06-25 10 次阅读


WebSocket与Server-Sent Events:实时通信的两种实现方式

在Web开发中,实时通信是一个非常重要的功能,它可以让用户在无需刷新页面的情况下接收服务器发送的数据。WebSocket和Server-Sent Events(SSE)是两种常用的实现实时通信的技术。本文将围绕这两种技术,通过代码示例来探讨它们的实现原理和应用场景。

实时通信在Web应用中扮演着至关重要的角色,尤其是在需要即时反馈的场景中,如在线聊天、股票交易、实时游戏等。WebSocket和Server-Sent Events是两种实现实时通信的常用技术,它们各有特点,适用于不同的场景。

WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许服务器和客户端之间进行双向通信,而不需要轮询或长轮询。

WebSocket的工作原理

1. 握手:客户端通过HTTP请求与服务器建立WebSocket连接,服务器响应后,双方通过一个特殊的握手协议确认连接。

2. 数据传输:建立连接后,客户端和服务器可以发送和接收数据,这些数据可以是文本或二进制格式。

3. 关闭连接:当通信完成或出现错误时,客户端或服务器可以关闭连接。

WebSocket的JavaScript实现

以下是一个简单的WebSocket客户端和服务器端代码示例:

javascript

// 服务器端(Node.js)


const WebSocket = require('ws');


const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {


ws.on('message', function incoming(message) {


console.log('received: %s', message);


});

ws.send('something from server');


});

// 客户端(HTML)


const ws = new WebSocket('ws://localhost:8080');

ws.onopen = function() {


console.log('Connection established');


ws.send('Hello, server!');


};

ws.onmessage = function(event) {


console.log('Message from server ', event.data);


};

ws.onclose = function() {


console.log('Connection closed');


};


Server-Sent Events

Server-Sent Events(SSE)是一种单向通信协议,允许服务器向客户端推送数据。与WebSocket不同,SSE只支持服务器向客户端发送数据。

SSE的工作原理

1. 连接:客户端通过HTTP请求与服务器建立SSE连接。

2. 数据推送:服务器将数据作为事件发送给客户端。

3. 关闭连接:当数据传输完成或出现错误时,服务器可以关闭连接。

SSE的JavaScript实现

以下是一个简单的SSE客户端和服务器端代码示例:

javascript

// 服务器端(Node.js)


const http = require('http');


const server = http.createServer((req, res) => {


if (req.url === '/events') {


res.writeHead(200, {


'Content-Type': 'text/event-stream',


'Cache-Control': 'no-cache',


'Connection': 'keep-alive'


});

const intervalId = setInterval(() => {


res.write(`data: ${new Date().toLocaleTimeString()}<km>`);


}, 1000);

req.on('close', () => {


clearInterval(intervalId);


});


}


});

server.listen(8080);

// 客户端(HTML)


const eventSource = new EventSource('http://localhost:8080/events');

eventSource.onmessage = function(event) {


console.log('Message from server ', event.data);


};

eventSource.onerror = function(event) {


console.error('EventSource failed:', event);


};


总结

WebSocket和Server-Sent Events是两种常用的实时通信技术,它们各有特点,适用于不同的场景。WebSocket支持双向通信,而SSE只支持单向通信。在实际应用中,可以根据需求选择合适的技术来实现实时通信功能。

本文通过代码示例介绍了WebSocket和SSE的实现原理,并提供了简单的客户端和服务器端代码。希望这些示例能够帮助读者更好地理解这两种技术,并在实际项目中应用它们。