😀
WebSocket
http通信时单向的,先请求,后响应,而WebSocket时双向通信,没有请求也可以响应,双向通信,实时响应,适用于高实时的的场景,需要服务器主动给客户端推送数据
java使用Webocket:
导入坐标,注册服务器端对象到ioc容器
我们服务器需要用一个map存会话对象,比如存手机号码,以后没有给我们发消息,我们可以根据地址主动给会话发消息
1 2 3 4
| key value 对象1 交房租啦 对象2 交房租啦 对象3 交房租啦
|
比如我们可以通过定时任务,每隔一段时间发送一些数据,也可以群发,比如月底短信通知
也可以根据会话对象推送不同的数据,比如你是会员,我可以让你看所有电视,你是普通用户,只能看免费电视
或者弹幕,你输入数据存到后台后,后台实时通过WebSocket推送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
@Component @Slf4j @ServerEndpoint("/ws/{cid}") public class WebSocketServer {
private static Map<String, Session> sessionMap = new ConcurrentHashMap();
@OnOpen public void onOpen(Session session, @PathParam("cid") String cid) { System.out.println("客户端:" + cid + "建立连接"); sessionMap.put(cid, session); }
@OnClose public void onClose(@PathParam("cid") String cid) { System.out.println("连接断开:" + cid); sessionMap.remove(cid); }
@OnMessage public void onMessage(String message, @PathParam("cid") String cid) { System.out.println("收到来自客户端:" + cid + "的信息:" + 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(); } } } }
|
获取后发送:
1 2 3 4 5 6 7 8 9 10 11 12
| @Component public class WebSocketTask { @Autowired private WebSocketServer webSocketServer;
public void sendMessageToClient() { webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now())); }
|
应用:来单提醒,客户催单~
用户支付后,商户收到提醒,可以下单啦
在订单支付成功后,发送消息给客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @Autowired private WebSocketServer webSocketServer;
public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
Orders ordersDB = orderMapper.getByNumber(ordersPaymentDTO.getOrderNumber());
Orders orders = Orders.builder() .id(ordersDB.getId()) .status(Orders.TO_BE_CONFIRMED) .payStatus(Orders.PAID) .checkoutTime(LocalDateTime.now()) .build();
orderMapper.update(orders);
Map map = new HashMap(); map.put("type", 1); map.put("orderId", orders.getId()); map.put("content", "订单号:" + ordersPaymentDTO.getOrderNumber()); webSocketServer.sendToAllClient(JSON.toJSONString(map));
return new OrderPaymentVO(); }
|