问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

WebSocket双向通信

创作时间:
作者:
@小白创作中心

WebSocket双向通信

引用
CSDN
1.
https://blog.csdn.net/m0_74963840/article/details/140407723

WebSocket基础使用

WebSocket小说明:

作用

浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

WebSocket与HTTP最大的区别

  • HTTP通信是单向的,基于请求响应模式
  • WebSocket支持双向通信。实现长连接

适用场景:

消息通信,视频弹幕,实时信息,等双向通信的使用需求

使用:

引入maven依赖

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

使用一个封装好的使用工具类:

package com.sky.websocket;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * WebSocket服务
 */
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {
    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端:" + sid + "建立连接");
        sessionMap.put(sid, session);
    }
    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }
    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }
    /**
     * 群发
     *
     * @param message
     */
    public void sendToAllClient(String message) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

小案例:实现客户端与服务器的双向通信

package com.sky.task;
import com.sky.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class WebSocketTask {
    @Autowired
    private WebSocketServer webSocketServer;
    /**
     * 通过WebSocket每隔5秒向客户端发送消息
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void sendMessageToClient() {
        webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
    }
}

实际使用:苍穹外卖客户催单,与来单提醒

第一步:服务端与客户端建立连接

第二步:在需要推送消息的类方法上。创建号消息对象后调用封装好的WebSocketServer即可推送

来单提醒:将提醒信息转换成json格式的数据后就可直接调用WebSocketServer完成向浏览器客户端推送消息

/**
 * 支付成功,修改订单状态
 *
 * @param outTradeNo
 */
public void paySuccess(String outTradeNo) {
    // 根据订单号查询订单
    Orders ordersDB = orderMapper.getByNumber(outTradeNo);
    // 根据订单id更新订单的状态、支付方式、支付状态、结账时间
    Orders orders = Orders.builder()
            .id(ordersDB.getId())
            .status(Orders.TO_BE_CONFIRMED)
            .payStatus(Orders.PAID)
            .checkoutTime(LocalDateTime.now())
            .build();
    orderMapper.update(orders);
    //通过websocket向客户端浏览器推送消息type orderId content
    Map map=new HashMap<>();
    map.put("type",1);
    map.put("orderId",ordersDB.getId());
    map.put("content,订单号",outTradeNo);
    String json=JSON.toJSONString(map);
    webSocketServer.sendToAllClient(json);
}

客户催单:将催单信息转换成json格式的数据后就可直接调用WebSocketServer完成向浏览器客户端推送消息

/**
 * 客户催单
 * @param id
 */
@Override
public void reminder(Long id) {
    // 根据id查询订单
    Orders ordersDB = orderMapper.getById(id);
    // 校验订单是否存在
    if (ordersDB == null) {
        throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
    }
    Map map=new HashMap<>();
    map.put("type",2);
    map.put("order",id);
    map.put("content","订单号:" + ordersDB.getNumber());
    //通过webSocket向客户端浏览器推送消息
    webSocketServer.sendToAllClient(JSON.toJSONString(map));
}

效果:在用户下单或者催单后商家服务端就会出现提醒

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号