美文网首页
websokect 笔记 (SpringBoot 多人聊天室练习

websokect 笔记 (SpringBoot 多人聊天室练习

作者: AlexLJS | 来源:发表于2020-02-29 19:39 被阅读0次

一、简介

参考 : https://www.runoob.com/html/html5-websocket.html


二、原理

简言之 , ws即通过 “tcp一次握手” 建立连接 , 连接升级连接为websocket, 后续不再需要复杂的请求头 和 三次握手四次分手。建立连接后数据以帧数值传递,并携带base64密钥双向验证,不匹配的话 立即断开连接。


三、原生语法

1、创建对象
var Socket = new WebSocket(url, [protocol] );

2、属性

Socket.readyState
Socket.bufferedAmount

3、事件

Socket.onopen
Socket.onmessage
Socket.onerror
Socket.onclose

4、方法

Socket.send()
Socket.close()

注:ws虽然语法简单清晰, 但是目前有些浏览器不支持websocket,为了解决兼容性问题需要回退为ajax轮询方式, 这时需要使用 sockjshttps://github.com/sockjs/sockjs-client

即使连接建立后,传递消息格式也需要协议规范 ,我们需要引入 stomp 协议。保证服务器和客户端的双端协议建立在tcp协议之上。

可以使用的方法 :

     SEND 发送
     SUBSCRIBE 订阅
     UNSUBSCRIBE 退订
     BEGIN 开始
     COMMIT 提交
     ABORT 取消
     ACK 确认
     DISCONNECT 断开

四、demo : 多人聊天室

思路 : 由前端建立连接,后台收到消息send给代理,由代理广播到一个接口,client 订阅这个代理接口,接收消息。

1 、创建项目、添加依赖:

创建项目时,添加web 、 websocket ,再利用https://mvnrepository.com 添加 webjars 中其他依赖。

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>sockjs-client</artifactId>
            <version>1.1.2</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>stomp-websocket</artifactId>
            <version>2.3.3-1</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>webjars-locator-core</artifactId>
        </dependency>

注 :由于没引入数据库,“群组区分”仅仅在前端展示, 后台消息广播就不做处理了。

2、前端代码 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>聊天室</title>
    <script src="/webjars/jquery/jquery.min.js"></script>
    <script src="/webjars/sockjs-client/sockjs.min.js"></script>
    <script src="/webjars/stomp-websocket/stomp.min.js "></script>
    <!--<script src="js/chat.js"></script>-->
</head>
<body>
<table>
    <tr>
        <td>请输入用户名</td>
        <td><input type="text" id="name"></td>
        <td>请输入房间号</td>
        <td><input type="text" id="group"></td>
    </tr>
    <tr>
        <td>连接</td>
        <td><input type="button" id="connect" value="connect"></td>
        <td>登出</td>
        <td><input type="button" id="disconnect" disabled="disabled" value="disconnect"></td>
    </tr>
</table>

<div id="chat" style="display: none">
    <table>
        <tr>
            <td>
                <input type="text" id="content" placeholder="请输入聊天内容">
            </td>
            <td>
                <input type="button" id="send" value="发送">
            </td>
        </tr>
    </table>
</div>

<div id="conversation">群聊进行中</div>

<script>
    var stompClient = null;
    var chatRoom = "";
    $(function(){
        $("#connect").click(function () {
            connect();
            chatRoom = $("#group").val();
        });
        $("#disconnect").click(function () {
            if (stompClient != null){
                stompClient.disconnect();
            }
            setConnected(false);
        });
        $("#send").click(function () {
            stompClient.send("/app/chat",{},JSON.stringify({ // 接口 , 权限  , 数据
                "name": $("#name").val(),
                "content":$("#content").val(),
                "group":$("#group").val()
            }));
        });
    })

    function connect() {
        if (!$("#name").val() || !$("#group").val()){
            return;
        }

        let ws = new SockJS('/chat'); //连接点
        stompClient = Stomp.over(ws);
        stompClient.connect({},function (success) {//权限 , success 回调 , fail 回调
            setConnected(true);
            stompClient.subscribe('/topic/greetings',function (msg) {
                if (JSON.parse(msg.body).group == chatRoom) {
                    showGreeting(JSON.parse(msg.body));
                }
            })
        });

    }
    function showGreeting(msg) {
        $("#conversation").append('<div>' + msg.group + ':' + msg.name + ':' + msg.content + '</div>');
    }
    function setConnected(flag) {
// set buttons status
        $("#connect").prop("disabled",flag);
        $("#disconnect").prop("disabled",!flag);

        if (flag) {
            $("#chat").show()
        }
    }
</script>

</body>
</html>

3、后台代码 :
config :

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic"); //广播代理 , subscribe
        registry.setApplicationDestinationPrefixes("/app"); // 代理拦截的消息 mapping 前缀
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").withSockJS();//连接点
    }
}

controller :

@Controller
public class ChatController {
    @MessageMapping("/chat")
    @SendTo("/topic/greetings")
    public Message chatting(Message message){
        return message;
    }
}

参考 : www.javaboy.org

相关文章

网友评论

      本文标题:websokect 笔记 (SpringBoot 多人聊天室练习

      本文链接:https://www.haomeiwen.com/subject/rkcqhhtx.html