Rumah > Java > javaTutorial > teks badan

Bagaimanakah SpringBoot menyepadukan WebSocket untuk membolehkan bahagian belakang menghantar mesej ke bahagian hadapan?

WBOY
Lepaskan: 2023-05-11 14:07:12
ke hadapan
4214 orang telah melayarinya

1. Apakah antara muka websocket? kepada klien.

WebSocket menjadikan pertukaran data antara klien dan pelayan lebih mudah, membolehkan pelayan menolak data secara aktif kepada klien. Dalam API WebSocket, penyemak imbas dan pelayan hanya perlu melengkapkan jabat tangan, dan sambungan berterusan boleh dibuat terus antara kedua-duanya untuk penghantaran data dua hala.

Dalam API WebSocket, penyemak imbas dan pelayan hanya perlu melakukan tindakan berjabat tangan, dan kemudian saluran pantas dibentuk antara penyemak imbas dan pelayan. Data boleh dihantar terus antara keduanya.


2. Senario yang berkenaan

Dalam proses pembangunan perniagaan, anda menghadapi beberapa pemprosesan tak segerak (pemberitahuan pembayaran untuk pembayaran WeChat dan pembayaran Alipay) dan pemesejan silang aplikasi.

Selepas pelaksanaan perniagaan selesai, maklumat kejayaan perlu dihantar ke bahagian hadapan. Dalam keadaan biasa, hujung hadapan memanggil antara muka http/https hujung belakang untuk mendapatkan data Jika hujung belakang mahu menolak mesej secara aktif ke hujung hadapan, ia perlu menggunakan WebSocket untuk komunikasi antara hujung hadapan dan belakang.

3. Contoh kod

3.1. Tambah kebergantungan pom.xml

<!-- websocket-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Salin selepas log masuk

3.2 Buat kelas konfigurasi WebSokcet

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
3.3、创建WebSokcet工具类
 
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
    private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
 
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;
    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
 
    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;
 
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //加入set中
        webSocketSet.add(this);
        //在线数加1
        addOnlineCount();
        log.info("有新连接加入!当前在线人数为" + getOnlineCount());
        try {
            MsgResponseVo userMsgResponseVo = new MsgResponseVo();
            userMsgResponseVo.setMsg("SUCCESS");
            WebSocketServer.sendInfo(JSON.toJSONString(userMsgResponseVo));
        } catch (IOException e) {
            log.error("websocket IO异常");
        }
    }
 
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        //从set中删除
        webSocketSet.remove(this);
        //在线数减1
        subOnlineCount();
        log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
    }
 
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("来自客户端的消息:" + message);
 
        //群发消息
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
 
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
 
    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message) throws IOException {
        log.info(message);
        for (WebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
    }
 
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }
 
    public static synchronized void addOnlineCount() {
        WebSocketServer.onlineCount++;
    }
 
    public static synchronized void subOnlineCount() {
        WebSocketServer.onlineCount--;
    }
}
Salin selepas log masuk

3.3

 @GetMapping("/testWebSocket")
    public ApiRestResponse testWebSocket() throws IOException {
        //消息体
        MsgResponseVo technicianMsgResponseVo = new MsgResponseVo();
        technicianMsgResponseVo.setRole("Technician");
        technicianMsgResponseVo.setRoleId(1);
        technicianMsgResponseVo.setMsg("您的订单已取消");
        technicianMsgResponseVo.setMsgStatus("CANCEL_ORDER");
        technicianMsgResponseVo.setOrderNo("test");
        //发送消息
        WebSocketServer.sendInfo(JSON.toJSONString(technicianMsgResponseVo));
        return ApiRestResponse.success();
    }
}
Salin selepas log masuk

3.4. Uji webSocket

Masukkan awalan ws://ip:port/webSocket kelas alat dalam tapak web (ws://127.0.0.1:8080/websocket)

Bagaimanakah SpringBoot menyepadukan WebSocket untuk membolehkan bahagian belakang menghantar mesej ke bahagian hadapan?3.5 Bahagian hadapan menggunakan WebSocket untuk memantau alamat WebSocket bahagian belakang dan melakukan pemprosesan perniagaan seterusnya selepas menerima mesej.

Atas ialah kandungan terperinci Bagaimanakah SpringBoot menyepadukan WebSocket untuk membolehkan bahagian belakang menghantar mesej ke bahagian hadapan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!