websocket入门(代码片段)

coderzpw coderzpw     2023-01-01     639

关键词:

前言基础

TCP/IP五层模型与OSI七层模型的协议

更多计网相关的知识可以看这篇文章【计算机网络-五层和七层模型】

1.什么是webSocket

WebSocket协议是基于TCP的一种新的网络协议,他是应用层的一个协议,与http协议同级别。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。


2.websocket与其他协议的区别

WebSocket和Http的异同点

相同点:

  • 建立在TCP之上,通过TCP协议来传输数据。
  • 都是可靠性传输协议。
  • 都是应用层协议。

不同点:

  • WebSocket是HTML5中的协议,支持持久连接,HTTP不支持持久连接。
  • HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。

WebSocket和Socket

Socket本身并不是一个协议,它工作在OSI模型会话层,是一个套接字,TCP/IP网络的API,是为了方便大家直接使用更底层协议而存在的一个抽象层。Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
WebSocket则是一个典型的应用层协议
总结: 说白了它俩并没有直接关系

WebSocket HTTP和TCP/IP

WebSocket和HTTP一样,都是建立在TCP之上,通过TCP来传输数据


3.使用websocket简单代码实现

常量类:(可要可不要)

public class WebsocketConst 
    /**
     * 消息json key:cmd
     */
    public static final String MSG_CMD = "cmd";

    /**
     * 消息json key:msgId
     */
    public static final String MSG_ID = "msgId";

    /**
     * 消息json key:msgTxt
     */
    public static final String MSG_TXT = "msgTxt";

    /**
     * 消息json key:userId
     */
    public static final String MSG_USER_ID = "userId";

    /**
     * 消息类型 heartcheck
     */
    public static final String CMD_CHECK = "heartcheck";

    /**
     * 消息类型 user 用户消息
     */
    public static final String CMD_USER = "user";

    /**
     * 消息类型 topic 系统通知
     */
    public static final String CMD_TOPIC = "topic";

    /**
     * 消息类型 email
     */
    public static final String CMD_EMAIL = "email";

    /**
     * 消息类型 meetingsign 会议签到
     */
    public static final String CMD_SIGN = "sign";

    /**
     * 消息类型 新闻发布/取消
     */
    public static final String NEWS_PUBLISH = "publish";

主要业务实现类:

@Component
@ServerEndpoint("/websocket/userId") //此注解相当于设置访问URL
public class WebSocket 
    private static final Logger log = LoggerFactory.getLogger(WebSocket.class);

    private Session session;

    private String userId;



    /**
     * 缓存 webSocket连接到单机服务class中(整体方案支持集群)
     */
    private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();
    private static Map<String, Session> sessionPool = new HashMap<String, Session>();


    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) 
        try 
            this.session = session;
            this.userId = userId;
            webSockets.add(this);
            sessionPool.put(userId, session);
            log.info("【websocket消息】有新的连接,总数为:" + webSockets.size());
         catch (Exception e) 
            log.error(e.getMessage());
        
    

    @OnClose
    public void onClose() 
        try 
            webSockets.remove(this);
            sessionPool.remove(this.userId);
            log.info("【websocket消息】连接断开,总数为:" + webSockets.size());
         catch (Exception e) 
            log.error(e.getMessage());
        
    


    /**
     * 服务端推送消息
     *
     * @param userId
     * @param message
     */
    public void pushMessage(String userId, String message) 
        Session session = sessionPool.get(userId);
        if (session != null && session.isOpen()) 
            try 
                log.info("【websocket消息】 单点消息:" + message);
                session.getAsyncRemote().sendText(message);
             catch (Exception e) 
                log.error(e.getMessage());
            
        
    

    /**
     * 服务端推送消息
     * @param ids
     * @param message
     */
    public void pushMessage(String[] ids, String message) 
        for (String uid:ids) 
            // 如果ids的格式有问题 导致某个id为"" 直接跳出本次循环
            if ("".equals(uid)) continue;
            Session session = sessionPool.get(uid);
            if (session != null && session.isOpen()) 
                try 
                    log.info("【websocket消息】 单点消息:" + message);
                    session.getAsyncRemote().sendText(message);
                 catch (Exception e) 
                    log.error(e.getMessage());
                
            
        

    

    /**
     * 服务器端推送消息
     */
    public void pushMessage(String message) 
        try 
            webSockets.forEach(ws -> ws.session.getAsyncRemote().sendText(message));
         catch (Exception e) 
            log.error(e.getMessage());
        
    


    @OnMessage
    public void onMessage(String message) 
        //todo 现在有个定时任务刷,应该去掉
        log.debug("【websocket消息】收到客户端消息:" + message);
        JSONObject obj = new JSONObject();
        //业务类型
        obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
        //消息内容
        obj.put(WebsocketConst.MSG_TXT, "心跳响应");
        for (WebSocket webSocket : webSockets) 
            webSocket.pushMessage(message);
        
    

上面的WebSocket 类 ,你可以作为一个service看待,然后根据自己的业务需求调用里面的业务方法, 例如:可以调用里面重载的三个pushMessage方法来实现 服务层向客户端发送消息
pushMessage(String message): 向所有上线的客户端发送消息
pushMessage(String userId, String message): 指定向单个客户端发送消息
pushMessage(String[] ids, String message): 指定向多个客户端发送消息

websocket的简单入门使用(代码片段)

WebSocketWebSocket介绍Java整合WebSocketSpringBoot整合WebSocketWebSocket介绍1)什么是WebSocket?WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。WebSocket是真正实现了全双工... 查看详情

websocket入门一条龙,基础封装与使用(代码开箱即用)(代码片段)

文章目录前言WebSocket相关1.构造函数2.常用属性websocket封装使用方式补充前言Websocket是一种用于在服务器和客户端之间实现高效的双向通信的机制,通过WebSocket,其目的是在应用和服务器进行频繁双向通信时,可以使... 查看详情

esp32入门基础之espwebsocketclient(代码片段)

文章目录1WebSocket简介2WebSocket测试工具3ESP32的WebSocket测试1WebSocket简介参考资料:菜鸟教程HTML5WebSocketWebSocket协议:5分钟从入门到精通WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。使得客户端和服务... 查看详情

性能工具之jmeter微信小程序websocket脚本入门(代码片段)

...了写小程序聊天页面中的信息底层是怎么实现的,而WebSocket协议,客户端和服务端都可以主动的推送消息,只要建立链接就能推送消息。准备demo前置条件,需要安装小程序编译器。页面效果如下图:后端代码&... 查看详情

性能工具之jmeter微信小程序websocket脚本入门(代码片段)

...了写小程序聊天页面中的信息底层是怎么实现的,而WebSocket协议,客户端和服务端都可以主动的推送消息,只要建立链接就能推送消息。准备demo前置条件,需要安装小程序编译器。页面效果如下图:后端代码&... 查看详情

springboot整合websocket(看完即入门)(代码片段)

webSocket1、什么是webSocket?2、webSocket可以用来做什么?3、webSocket协议4、服务端WebSocket操作类5、客户端1、什么是webSocket?WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变... 查看详情

十.netty入门到超神系列-基于websocket开发聊天室(代码片段)

...的网站中都嵌入有聊天功能,最理想的方式就是使用WebSocket来开发,屏幕面前的你如果不清楚WebSocket的作用可以自己去百度一下,Netty提供了WebSocket支持,这篇文章将使用Netty作为服务器,使用WebSocket开发一个... 查看详情

websocket的简单入门使用(代码片段)

WebSocketWebSocket介绍Java整合WebSocketSpringBoot整合WebSocketWebSocket介绍1)什么是WebSocket?WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。WebSocket是真正实现了全双工... 查看详情

websocket的简单入门使用(代码片段)

WebSocketWebSocket介绍Java整合WebSocketSpringBoot整合WebSocketWebSocket介绍1)什么是WebSocket?WebSocket是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。WebSocket是真正实现了全双工... 查看详情

性能工具之jmeter微信小程序websocket脚本入门(代码片段)

...了写小程序聊天页面中的信息底层是怎么实现的,而WebSocket协议,客户端和服务端都可以主动的推送消息,只要建立链接就能推送消息。准备demo前置条件,需要安装小程序编译器。页面效果如下图:后端代码&... 查看详情

.net进程内队列channel的入门与应用(代码片段)

...容Channel入门Channel应用本文小结最近,博主为FakeRPC增加了WebSocket协议的支持。这意味着,我们可以借助其全双工通信的特性,在一个连接请求内发送多条数据。FakeRPC目前最大的遗憾是,建立在HTTP协议上而不是TCP/IP协议上。因此... 查看详情

.net进程内队列channel的入门与应用(代码片段)

...容Channel入门Channel应用本文小结最近,博主为FakeRPC增加了WebSocket协议的支持。这意味着,我们可以借助其全双工通信的特性,在一个连接请求内发送多条数据。FakeRPC目前最大的遗憾是,建立在HTTP协议上而不是TCP/IP协议上。因此... 查看详情

微服务入门(代码片段)

...法。每个服务都在自己的进程中运行,并使用HTTP/HTTPS、WebSocket或AMQP等协议与其他进程进行通信。每个微服务在特定的上下文边界内实现特定的端到端域或业务功能,每个微服务都必须自主开发,并且可以独立部署。最后,每个... 查看详情

kmm入门处理http网络请求(代码片段)

...的一个重要部分,常用的方式即HTTP(S),当然也有WebSocket、TCP、UDP等等在KMM模块中,为保证双端逻辑一致,且对JVM、Native进行统一兼容,可以使用官方推荐的Ktor进行网络通信,Kotlinx.Serialization来进行数据解... 查看详情

websocket使用实践代码指南(代码片段)

文章目录[websocket]([WebSocket-WebAPI接口参考|MDN(mozilla.org)](https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket))前端后端socket.io前端后端[websocket](WebSocket-WebAPI接口参考|MDN(mozilla.org))简单的来说,webs 查看详情

websocket使用实践代码指南(代码片段)

文章目录[websocket]([WebSocket-WebAPI接口参考|MDN(mozilla.org)](https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket))前端后端socket.io前端后端[websocket](WebSocket-WebAPI接口参考|MDN(mozilla.org))简单的来说,webs 查看详情

websocket心跳机制(代码片段)

目录1WebSocket简介2WebSocket事件与方法2.1创建WebSocket实例2.2WebSocket事件2.3WebSocket方法3WebSocket的心跳重连机制3.1问题3.2心跳重连机制4实际使用1WebSocket简介WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,... 查看详情

springboot+websocket学习(代码片段)

Springboot+WebSocket聊天室项目WebSocket介绍WebSocket的特点webSocket协议客户端(浏览器)实现websocket对象websocket事件WebSocket方法服务端实现服务端如何接受客户端发送过来的数据呢?服务端如何推送数据给客户端呢?基于WebSocket的网页聊... 查看详情