WebSocket 快速实操 这篇就够了

目录

目录

1.WebSocket概述

2.引入依赖

3.config

4.发送单条数据的server和html

4.1server

4.2html

5.发送Json类型数据的server和html

5.1server

5.2html

6.对于WebSocketServer的中无法直接使用@Autowired注解获取对象的方法和使用方式


1.WebSocket概述

        WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。它允许服务端主动发送信息给客户端,是实现推送(Push)技术的一种非常流行的解决方案。

WebSocket的特点:
(1)全双工通信:与传统的HTTP请求-响应不同,WebSocket支持服务器和客户端之间的全双工通信。
(2)单连接:WebSocket连接一旦建立,就可以送和接收无数个消息。
(3)服务器主动推送:服务器可以主动发送信息给客户端,不需要客户端不断地询问服务器是否有新信息。
(4)持久连接:与传统的基于轮询(Polling)的推送技术相比,WebSocket连接一旦建立,就可以持续开放,减少了因频繁建立和关闭连接而造成的开销。
(5)协议升级:WebSocket协议通过握手过程从HTTP协议升级而来,其初始的握手请求是一个升级请求。

2.引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

3.config

package com.example.springbootudp.config;

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.发送单条数据的server和html

4.1server

package com.example.springbootudp.server;

import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;

import java.io.IOException;

@ServerEndpoint(value = "/chat")
@Component
public class WebSocketServer {
    @OnOpen
    public void onOpen(Session session, EndpointConfig config){

    }

    @OnMessage
    public void onMessage(String message,Session session) throws IOException {
        System.out.println(message);
        // 发送响应给客户端
        TextMessage response = new TextMessage("Server response: " + message);
        System.out.println("response.getPayload():"+response.getPayload());
        session.getBasicRemote().sendText(response.getPayload());

    }

    @OnClose
    public void onClose(Session session){

    }
}

4.2html

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
    <script>

        const wsUri = "ws://localhost:8080/chat";
        const websocket = new WebSocket(wsUri);

        websocket.onopen = function() {
            console.log("WebSocket connection opened.");
            let message = document.getElementById('message').value;
            websocket.send(message);
        };

        websocket.onclose = function(evt) {
            console.log("WebSocket connection closed.");
        };

        websocket.onmessage = function(evt) {
            console.log("Received message:", event.data);
            // 可以在页面上显示接收到的消息
            var messages = document.getElementById('messages');
            var message = document.createElement('li');
            message.textContent = "Server: " + event.data;
            messages.appendChild(message);
        };

        websocket.onerror = function(evt) {
            console.log("WebSocket Error: " + evt.data);
        };

        // 修改后的 sendWebSocket 函数
        function sendWebSocketMessage() {
            // 确保在发送消息时连接已经打开
            if (websocket.readyState === WebSocket.OPEN) {
                let message = document.getElementById('message').value;
                websocket.send(message);

            } else {
                alert("WebSocket connection is not open.");
            }
        }

    </script>
</head>
<body>

    <ul id="messages"></ul>
    <input type="text" id="message" placeholder="请输入消息">
    <button onclick="sendWebSocketMessage()">发送消息</button>

</body>
</html>

5.发送Json类型数据的server和html

只需要将发送单条数据的server和html修改部分代码即可

5.1server

@ServerEndpoint(value = "/chat")
@Component
public class WebSocketServer {
    // ... 其他代码 ...

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        try {
            // 解析 JSON 字符串
            Object obj = JSON.parse(message);

            // 根据需要处理 obj,假设您需要处理的是一个带有 type 和 content 的消息
            String type = (String) obj.get("type");
            String content = (String) obj.get("content");

            System.out.println("Received message: " + message);
            // 可能的响应处理
            if ("message".equals(type)) {
                // 处理消息内容
                System.out.println("Content: " + content);
            }

            // 发送响应给客户端
            TextMessage response = new TextMessage(JSON.stringify({"type": "response", "content": "Server response to JSON"}));
            session.getBasicRemote().sendText(response.getPayload());

        } catch (JSONException e) {
            e.printStackTrace();
            // 处理解析错误
        }
    }

    // ... 其他代码 ...
}

5.2html

<script>
// ... 其他代码 ...

function sendWebSocketMessage() {
    // 创建要发送的数据对象
    var messageObject = {
        type: "message",
        content: document.getElementById('message').value
    };

    // 将对象转换为 JSON 字符串
    var messageJSON = JSON.stringify(messageObject);

    // 确保在发送消息时连接已经打开
    if (websocket.readyState === WebSocket.OPEN) {
        websocket.send(messageJSON); // 发送 JSON 字符串

    } else {
        alert("WebSocket connection is not open.");
    }
}

// ... 其他代码 ...
</script>

6.对于WebSocketServer的中无法直接使用@Autowired注解获取对象的方法和使用方式

package com.example.springbootudp.server;

import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;

import java.io.IOException;

@ServerEndpoint(value = "/chat")
@Component
public class WebSocketServer {

    private static MessageService messageService;

    @Autowired
    public void setWebSocketServer(MessageService messageService){
        WebSocketServer.messageService =messageService;
        
    }

    @OnOpen
    public void onOpen(Session session, EndpointConfig config){

    }

    @OnMessage
    public void onMessage(String message,Session session) throws IOException {
       WebSocketServer.messageService.getById();

    }

    @OnClose
    public void onClose(Session session){

    }
}

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值