【直播开发】后端实现 WebSocket 服务器

1,143 阅读4分钟

前言

WebSocket 是一种全双工通信协议,可以在后端应用程序中实现 WebSocket 服务器,与前端应用程序进行双向通信。本文将介绍如何在不同编程语言和框架中实现 WebSocket 服务器,包括 WebSocket 的握手过程、消息的发送和接收等操作。

WebSocket 握手过程

在使用 WebSocket 协议进行通信之前,需要进行一次握手过程。在握手过程中,前端应用程序向后端应用程序发送一个 HTTP 请求,请求升级协议到 WebSocket 协议。后端应用程序接收到该请求后,将发送一个 HTTP 响应,告知前端应用程序协议已升级成功,并建立起 WebSocket 连接。

下面是一个 WebSocket 握手的示例:

makefileCopy code
GET /websocket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

在上面的示例中,我们向 example.com 的 /websocket 路径发送了一个 HTTP GET 请求,并携带了 Upgrade、Connection、Sec-WebSocket-Key 和 Sec-WebSocket-Version 等头信息。后端应用程序接收到该请求后,需要验证 Sec-WebSocket-Key 的值,并使用 SHA-1 算法生成一个 Sec-WebSocket-Accept 的值,作为响应头信息返回给前端应用程序。

下面是一个 WebSocket 握手响应的示例:

makefileCopy code
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

在上面的示例中,我们返回了一个 HTTP 101 状态码,告知前端应用程序协议已升级成功,并携带了 Upgrade、Connection 和 Sec-WebSocket-Accept 等头信息。前端应用程序接收到该响应后,即可开始使用 WebSocket 协议进行通信。

实现 WebSocket 服务器

下面将介绍如何在不同编程语言和框架中实现 WebSocket 服务器。

Go

在 Go 中,我们可以使用 gorilla/websocket 模块来实现 WebSocket 服务器。安装 gorilla/websocket 模块的方法如下:

arduinoCopy code
go get github.com/gorilla/websocket

使用 gorilla/websocket 模块创建 WebSocket 服务器的示例代码如下:

goCopy code
package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

func main() {
	upgrader := websocket.Upgrader{}

	http.HandleFunc("/websocket", func(w http.ResponseWriter, r *http.Request) {
		conn, err := upgrader.Upgrade(w, r, nil)
		if err != nil {
			log.Println("Upgrade error:", err)
			return
		}

		log.Println("WebSocket connected")

		for {
			_, message, err := conn.ReadMessage()
			if err != nil {
				log.Println("Read error:", err)
				break
			}

			log.Println("Received message:", string(message))

			err = conn.WriteMessage(websocket.TextMessage, []byte("Received message: "+string(message)))
			if err != nil {
				log.Println("Write error:", err)
				break
			}
		}

		log.Println("WebSocket disconnected")
	})

	log.Fatal(http.ListenAndServe(":8080", nil))
}

在上面的示例中,我们创建了一个 WebSocket 服务器,并使用 upgrader.Upgrade() 方法来升级协议到 WebSocket。在连接事件中,我们使用 conn.ReadMessage() 方法来监听消息,使用 conn.WriteMessage() 方法向客户端发送消息。

Node.js

在 Node.js 中,我们可以使用 ws 模块来实现 WebSocket 服务器。安装 ws 模块的方法如下:

Copy code
npm install ws

使用 ws 模块创建 WebSocket 服务器的示例代码如下:

javascriptCopy code
const WebSocket = require('ws');

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

wss.on('connection', (ws) => {
  console.log('WebSocket connected');

  ws.on('message', (message) => {
    console.log(`Received message: ${message}`);

    ws.send(`Received message: ${message}`);
  });

  ws.on('close', () => {
    console.log('WebSocket disconnected');
  });
});

在上面的示例中,我们创建了一个 WebSocket 服务器,并使用 wss.on() 方法来监听连接事件。在连接事件中,我们可以使用 ws.on() 方法来监听消息和关闭事件,并在事件处理函数中实现相应的逻辑。在收到消息时,我们可以使用 ws.send() 方法向客户端发送消息。

Java

在 Java 中,我们可以使用 Java WebSocket API 来实现 WebSocket 服务器。在 Maven 项目中,我们可以添加以下依赖:

xmlCopy code
<dependency>
  <groupId>javax.websocket</groupId>
  <artifactId>javax.websocket-api</artifactId>
  <version>1.1</version>
</dependency>

<dependency>
  <groupId>org.glassfish.tyrus</groupId>
  <artifactId>tyrus-server</artifactId>
  <version>1.14</version>
</dependency>

使用 Java WebSocket API 创建 WebSocket 服务器的示例代码如下:

javaCopy code
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/websocket")
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket connected");
    }

    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        System.out.println("Received message: " + message);

        session.getBasicRemote().sendText("Received message: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("WebSocket disconnected");
    }
}

在上面的示例中,我们使用 @ServerEndpoint 注解来指定 WebSocket 服务器的路径。在连接、收到消息和关闭事件中,我们分别使用 @OnOpen、@OnMessage 和 @OnClose 注解来实现相应的逻辑。在收到消息时,我们可以使用 Session 对象的 getBasicRemote().sendText() 方法向客户端发送消息。

Python

在 Python 中,我们可以使用 websocket 模块来实现 WebSocket 服务器。安装 websocket 模块的方法如下:

Copy code
pip install websocket

使用 websocket 模块创建 WebSocket 服务器的示例代码如下:

pythonCopy code
import websocket

def on_open(ws):
    print('WebSocket connected')

def on_message(ws, message):
    print('Received message: ' + message)

    ws.send('Received message: ' + message)

def on_close(ws):
    print('WebSocket disconnected')

if __name__ == '__main__':
    ws = websocket.WebSocketApp('ws://localhost:8080/websocket',
        on_open=on_open,
        on_message=on_message,
        on_close=on_close)

    ws.run_forever()

在上面的示例中,我们创建了一个 WebSocket 服务器,并使用 websocket.WebSocketApp() 方法来创建 WebSocket 客户端对象。在连接、收到消息和关闭事件中,我们分别使用 on_open、on_message 和 on_close 回调函数来实现相应的逻辑。在收到消息时,我们可以使用 ws.send() 方法向客户端发送消息。

总结

WebSocket 是一种全双工通信协议,可以在后端应用程序中实现 WebSocket 服务器,与前端应用程序进行双向通信。不同编程语言和框架中,我们可以使用不同的库和工具来实现 WebSocket 服务器。无论使用哪种方式,我们都需要实现 WebSocket 的握手过程、消息的发送和接收等操作。在实际应用中,我们可以使用 WebSocket 协议来实现实时交互、即时通信等功能>