WebSocket的简单认识

185 阅读3分钟

什么是WebSocket

WebSocket 是一种基于TCP的,在Web应用程序中实现双向通信的协议 ,它实现了浏览器与服务器的全双工通讯,允许服务器主动发起信息个客户端。 websocket是一种持久协议,http是非持久协议。在websocket出现之前,是通过ajax轮询来实现网站实时推送消息给浏览器客户端。轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端。轮询的效率低,非常浪费资源。

WebSocket 通信流程

前端使用 new WebSocket(socketUrl) 方法创建一个WebSocket对象。socketUrl 是后端提供的WebSocket路由地址,用于建立与后端的连接。
当 WebSocket 连接成功时,前端的 onopen 回调函数将被触发。在该回调函数内,前端可以执行一些初始化操作,例如发送认证信息、订阅频道等。
后端接收到来自前端的WebSocket连接请求后,执行相应的处理逻辑,包括验证身份、建立连接等。一旦后端建立了与前端的连接,后端的 onOpen 回调函数将被触发。
前后端建立了WebSocket连接之后,双方可以通过发送消息进行通信。前端可以使用 WebSocket 对象的 send 方法向后端发送消息,后端可以使用相应的WebSocket库或框架来处理接收到的消息。
当后端收到前端发送的消息时,后端的 onMessage 回调函数将被触发。在该回调函数内,后端可以处理接收到的消息,并根据需要发送响应消息给前端。
前端则通过监听 WebSocket 对象的 onmessage 回调函数来接收来自后端的消息。在该回调函数内,前端可以根据接收到的消息进行相应的处理,例如更新页面内容、显示通知等。
如果需要关闭WebSocket连接,前端可以调用 WebSocket 对象的 close 方法。后端则可以在收到前端的关闭请求时执行一些清理操作,并关闭连接。当连接关闭后,前端的 onclose 回调函数和后端的 onClose 回调函数将被触发。
前端和后端都需要处理潜在的错误情况。前端可以通过监听 WebSocket 对象的 onerror 回调函数来处理与WebSocket连接相关的错误。后端也可以处理可能发生的错误并发送错误消息给前端。
通过这样的流程,前后端可以实现实时的双向通信,从而构建出更加交互式和动态的网络应用程序。


前端vue中使用:

        const store = useStore();
        let socket = null;
        let socketUrl = `ws://127.0.0.1:3000/websocket/${store.state.user.token}`; // 假设传了个store中存储的用户 token 信息

        onMounted(() => {
            socket = new WebSocket(socketUrl);

            socket.onopen = () => {
                console.log("socket connected!");
            }

            socket.onmessage = (msg) => {
                
                let data = JSON.parse(msg.data);
                console.log(`从后端接收到了消息! ${data}`);
            }

            socket.onclose = () => {
                console.log("socket disconnected!");
            }
        });

        onUnmounted(() => {   // 断开连接后,关闭socket
            socket.close();
        })

后端SpringBoot中使用:

@Component
@ServerEndpoint("/websocket/{token}")  // 注意不要以'/'结尾
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session session, @PathParam("token") String token) {
        // 建立连接
        System.out.println("Connected!");
    }

    @OnClose
    public void onClose() {
        // 关闭链接
        System.out.println("Disconnected!");
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        // 从 Client(前端) 接收消息
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

    // 发送消息给前端
    public void sendMessage(String message) {   // 向前端发送消息

    }
}

小白第一次写文章,如有问题,欢迎各位佬佬指正!