WebSocket 入门级教程

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受.

上一篇中已经对webSocket 介绍过了,但是还是想再啰嗦下(怕有些兄弟刚刚看过来),因为这个确实是棒极了、非常的好用,good nice !

 目录

一、WebSocket 是什么?

1.1 WebSocket 的工作原理

1.2 WebSocket 的优势

二、WebSocket 的使用场景

2.1 实时聊天应用

2.2 实时监控系统

2.3 游戏互动

2.4 即时通知

三、WebSocket 的注意事项

3.1 兼容性

3.2 安全性

3.3 性能优化

四、WebSocket 的实现示例

4.1 前端代码示例

4.2 后端代码示例(Spring Boot)

4.2.1 添加依赖

4.2.2 配置 WebSocket

4.2.3 创建 WebSocket 服务端类

五、总结


一、WebSocket 是什么?

WebSocket 是一种网络通信协议,它提供了一种在客户端和服务器之间建立持久连接的方式,允许双方进行全双工通信。与传统的 HTTP 协议相比,WebSocket 可以在连接建立后,让服务器主动向客户端发送数据,而无需客户端频繁发起请求。

1.1 WebSocket 的工作原理

  • 建立连接:客户端通过浏览器发起 WebSocket 请求,服务器接受请求后建立连接。

  • 数据传输:连接建立后,客户端和服务器可以通过 WebSocket 隧道双向传输数据。

  • 关闭连接:通信完成后,客户端或服务器可以关闭连接。

1.2 WebSocket 的优势

  • 实时性:数据传输无需等待客户端请求,服务器可以实时推送数据。

  • 高效性:减少了 HTTP 请求的开销,避免了频繁的连接和关闭。

  • 双向通信:客户端和服务器可以同时发送和接收数据。

二、WebSocket 的使用场景

WebSocket 适用于需要实时交互的场景,以下是一些典型的应用场景:

2.1 实时聊天应用

  • 场景描述:用户之间可以实时发送和接收消息,无需刷新页面。

  • 优势:服务器可以即时将消息推送给所有在线用户,减少延迟。

2.2 实时监控系统

  • 场景描述:如设备状态监控、股票行情监控等,服务器可以实时推送数据到客户端。

  • 优势:客户端无需频繁轮询服务器,减少服务器负担,提高响应速度。

2.3 游戏互动

  • 场景描述:在多人在线游戏中,玩家的动作和状态可以实时同步到其他玩家。

  • 优势:低延迟的数据传输,提升游戏体验。

2.4 即时通知

  • 场景描述:如社交网络中的好友请求、消息提醒等。

  • 优势:服务器可以主动推送通知,用户无需手动刷新页面。

三、WebSocket 的注意事项

3.1 兼容性

  • 浏览器支持:虽然现代浏览器普遍支持 WebSocket,但仍需考虑旧版本浏览器的兼容性。

  • 解决方案:可以使用轮询或长轮询作为备用方案。

3.2 安全性

  • 加密连接:建议使用 wss://(WebSocket Secure)来保证数据传输的安全。

  • 身份验证:在建立 WebSocket 连接时,可以通过参数或令牌验证客户端身份。

3.3 性能优化

  • 连接管理:合理管理 WebSocket 连接,避免过多的并发连接。

  • 数据压缩:对传输的数据进行压缩,减少带宽占用。

四、WebSocket 的实现示例

4.1 前端代码示例

以下是一个简单的前端 WebSocket 示例,使用 HTML 和 JavaScript 实现:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>WebSocket 示例</title>
</head>
<body>
    <h1>WebSocket 客户端</h1>
    <button onclick="connect()">连接服务器</button>
    <button onclick="sendMessage()">发送消息</button>
    <button onclick="closeConnection()">关闭连接</button>
    <p id="messages"></p>

    <script>
        var webSocket = null;

        function connect() {
            if ('WebSocket' in window) {
                webSocket = new WebSocket("ws://localhost:18801/webSocket");
                webSocket.onopen = function() {
                    console.log("已连接");
                };
                webSocket.onmessage = function(event) {
                    document.getElementById("messages").innerHTML += event.data + "<br>";
                };
                webSocket.onclose = function() {
                    console.log("连接已关闭");
                };
                webSocket.onerror = function() {
                    console.log("发生错误");
                };
            } else {
                alert("您的浏览器不支持 WebSocket!");
            }
        }

        function sendMessage() {
            if (webSocket) {
                webSocket.send("Hello, Server!");
            }
        }

        function closeConnection() {
            if (webSocket) {
                webSocket.close();
            }
        }
    </script>
</body>
</html>

4.2 后端代码示例(Spring Boot)

以下是一个简单的 Spring Boot WebSocket 服务端示例:

4.2.1 添加依赖

pom.xml 文件中添加 WebSocket 依赖:
 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
4.2.2 配置 WebSocket

创建一个配置类 WebSocketConfig
 

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
4.2.3 创建 WebSocket 服务端类

创建一个 WebSocket 服务端类 WebSocketServer

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/webSocket")
@Component
public class WebSocketServer {
    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
    private static final CopyOnWriteArraySet<Session> sessionPools = new CopyOnWriteArraySet<>();

    @OnOpen
    public void onOpen(Session session) {
        sessionPools.add(session);
        log.info("新连接加入:" + session.getId());
    }

    @OnClose
    public void onClose(Session session) {
        sessionPools.remove(session);
        log.info("连接关闭:" + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到来自客户端的消息:" + message);
        for (Session sess : sessionPools) {
            if (sess.isOpen()) {
                try {
                    sess.getBasicRemote().sendText("服务器收到消息:" + message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        log.error("发生错误:" + throwable.getMessage());
    }
}

五、总结

WebSocket 是一种强大的实时通信技术,适用于需要实时交互的场景。通过上述示例,你可以快速入门 WebSocket 的开发。WebSocket 的优势在于其高效性和实时性,能够显著提升用户体验,减少服务器负担。在实际开发中,需要注意兼容性、安全性和性能优化等问题,以确保系统的稳定运行。
 

关注我,带你了解更多IT知识
相知不迷路,来者皆是兄弟!
搜索微信公众号 :“codingba” or “码出精彩” 交朋友,有更多资源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值