Websocket

文章目录

      • 项目中应用websocket
        • 项目案列:

WebSocket 是一种基于 TCP 协议的全双工通信协议,它允许客户端和服务器之间建立持久的、双向的通信连接。相比传统的 HTTP 请求 - 响应模式,WebSocket 提供了实时、低延迟的数据传输能力。通过 WebSocket,客户端和服务器可以在任意时间点互相发送消息,实现实时更新和即时通信的功能。WebSocket 协议经过了多个浏览器和服务器的支持,成为了现代 Web 应用中常用的通信协议之一。它广泛应用于聊天应用、实时数据更新、多人游戏等场景,为 Web 应用提供了更好的用户体验和更高效的数据传输方式。

项目的弹幕系统设计用WebSocket来实现,用户评论弹幕,然后将数据推送到前端去。

网站实时在线人数也可以,每次登录的时候和服务器建立socket连接,当关闭的时候socket连接退出。可以统计网站的实时在线人数。

浏览器和服务器可以实现双向的数据传输。

Websocket_第1张图片

http协议和websocket协议的区别

http 是短链接   webSocket是长连接
Http是单项的,基于请求响应模式  websocket支持双向通信
http和websocket底层都是基于TCP连接

应用

视频弹幕  网页聊天
体育实况更新,页面没有刷新,实时展示出来的。
股票基金报价实时更新

项目中应用websocket

项目中,导入maven坐标

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

创建配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置类,用于注册WebSocket的Bean。注册Bean
 */
@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}
这是一个Spring框架的注解,用于标识一个配置类。配置类通常用于定义和注册Spring容器中的bean。
换句话说,带有@Configuration注解的类就是Spring IoC容器的配置文件,它可以替代传统的XML配置文件。

@Bean注解用于告诉Spring框架,该方法将返回一个对象,这个对象应该被注册为Spring IoC容器中的一个bean。在这个例子中,serverEndpointExporter()方法返回了一个ServerEndpointExporter对象,该对象会被注册为Spring容器的一个bean。

配置WebSocket: 这个配置类的主要功能是配置WebSocket支持。ServerEndpointExporter会自动扫描应用中所有使用了@ServerEndpoint注解的类,并将它们注册为WebSocket端点。这样,WebSocket端点就可以处理来自客户端的WebSocket连接和消息。

接收请求和原来的http不一样。http用restController。
@ServerEndpoint(“/ws/{sid}”)

package com.njitzx.controller;

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);
    }

    /**
     * 收到客户端消息后调用的方法   类似于Controller的方法
     *
     * @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) {
        //将前端传过来的数据群发, 所有人都能拿到会话   values拿到map集合的所有属性值
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服务器向客户端发送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

定时任务处理消息。比如弹幕消息。每隔几秒钟就向前端进行推送。

package com.njitzx;

import com.njitzx.controller.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()));
    }
}

项目案列:

当用户点击催单的时候,要通知商家端。

@ApiOperation("提醒发货")
@GetMapping("/reminder/{orderId}")
public Result reminders(@PathVariable Integer orderId) {
    orderService.reminder(orderId);
    return Result.success();
}

@Override
public void reminder(Integer orderId) {
Order order = orderMapper.selectById(orderId);
SocketVO socketVO = new SocketVO();
socketVO.setType(1);
socketVO.setOrderId(orderId);
socketVO.setOrderNumber(order.getOrderNumber());
webSocketServer.sendToAllClient(JSON.toJSONString(socketVO)); //拿到消息推送给前端
}

前端可以有弹窗或者语言来提示用户催单。

你可能感兴趣的:(大二下暑期集训,websocket,网络协议,网络)