WebSocket二

简介: WebSocket二

二、实现方式

1、客户端(浏览器)实现

1.1、websocket对象

实现websocket的web浏览器将通过websocket对象公开所有必须的客户端功能(主要支持HTML5的浏览器)。以下API用于创建websocket对象:

var ws = new WebSocket(url);

参数URL 格式说明:ws://ip地址:端口号/资源名

1.2、websocket 事件

websocket 对象的相关事件
在这里插入图片描述

1.3、websocket 方法

给服务端发送消息
在这里插入图片描述

1.4、总结:客户端的API

在这里插入图片描述
在这里插入图片描述

2、服务端实现

Tomcat 的7.0.5版本开始支持WebSocket,并且实现了 Java WebSocket规范(JSR356)。

Java WebSocket应用由一系列的webSocketEndpoint组成。Endpoint 是一个java对象,代表webSocket链接的一端,对于服务端,我们可以视为处理具体webSocket消息的接口,就像servlet之与http请求一样。
我们可以通过两种方式定义Endpoint:

  • 第一种是编程式,即继承类javax.websocket. Endpoint并实现其方法
  • 第二种是注解式,即定义一个POJO,并添加@serverEndpoint相关注解。【常用】

Endpoint实例在webSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:
在这里插入图片描述

2.1、服务端如何接收客户端发送的数据呢?

通过为session添加 MessageHandler 消息处理器来接收消息,当采用注解方式定义Endpoint时,我们还可以通过@onMessage 注解指定接收消息的方法。

2.2、服务端如何推送数据给客户端呢?

发送消息则由 RemoteEndpoint完成,其实例由session维护,根据使用情况,我们可以通过Session.getBasicRemote 获取同步消息发送的实例,然后调用其sendXxx ()【sendText()】方法就可以发送消息,可以通过session.getAsyncRemote`获取异步消息发送实例。

服务端代码

@serverEndpoint("/robin")  // @serverEndpoint("路径")
public class chatEndPoint {
   
   
    private static set<chatEndPoint > websocketset = new Hashset<>();
    private session session;
    @onMessage
    pub7ic void onMessage(string message,Session session) throws IOException {
   
   
        system.out.print1n("接收的消息是:" + message);
        system.out.print1n(session);
        //将消息发送给其他的用户
        for (chat chat : websocketset) {
   
   
            if(chat != this) {
   
   
                chat.session. getBasicRemote().sendText(message);
            }
        }
    }
    @onopen
    public void onopen(session session) {
   
   
        this.session = session;
        websocketset.add(this);
    }
    @onopen
    public void onopen(Session session) {
   
   
        this.session = session;
        websocketset.add(this);
    }
    @onclose
    pub1ic void onc1ose(session seesion) {
   
   
        system.out. print1n("连接关闭了。。。");
    }
    @onError
    public void onError(session session, Throwable error) {
   
   
        system. out.print1n("出错了。。。。" +error. getMessage());
    }
}

2.3、总结:服务端的实现

常用的Node实现有以下三种:
在这里插入图片描述

三、特点

  • 建立在TCP协议之上,服务端的实现比较容易
  • 与HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用HTTP协议,因此握手时不容易屏蔽,能通过各种HTTP代理服务器
  • 数据格式化比较轻量,性能开销小,通信高效。
  • 可以发送文本,也可以发送二进制数据
  • 没有同源限制,客户端可以与任意服务器通信
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是URL。

    四、基于WebSocket的网页聊天室

    1、实现流程

    在这里插入图片描述

    2、消息格式

    在这里插入图片描述
相关文章
|
网络协议 数据处理
WebSocket协议基础
WebSocket协议基础
367 0
|
存储 iOS开发
iOS 内购 payment.applicationUsername 的坑
iOS 内购 payment.applicationUsername 的坑
716 0
|
Java Linux 程序员
Linux 下 JNA 调用动态连接库文件 so
Linux 下 JNA 调用动态连接库文件 so
936 0
|
11月前
|
存储 数据安全/隐私保护 芯片
U盘突然读不出来?教你几招轻松解决问题
U盘不识别怎么办?可能是接口问题、系统异常或U盘损坏。先换接口或电脑尝试,再检查磁盘管理与设备管理器,确认是否识别。若提示格式化,勿急操作,先恢复数据再格式化。如无法格式化,可能是硬件故障,建议寻求专业帮助。教你一步步排查与修复,保障数据安全!
|
人工智能 搜索推荐 机器人
在Dify on DMS上搭建专属版Deep Research Agent
Deep Research Agent 不只是为了让你工作快一点那么简单。它更像一场知识工作的革命,彻底把我们从没完没了的“信息搬运”和“大海捞针”中解放出来。想想看,当那些繁琐的、重复性的搜集和整理工作都交给AI后,我们可以把宝贵的时间和脑力,真正用在刀刃上:去提出更一针见血的问题,去构思更有远见的战略,或者干脆去创造一个前所未有的新东西。本文将教你如何在Dify on DMS上,构建企业专属版Deep Research Agent。 
|
12月前
|
存储 设计模式 Java
Java 期末考试不挂科必背基础知识点复习笔记整理
这是一份全面的Java基础知识点复习笔记,涵盖核心特性、数据类型、流程控制、数组、异常处理、JVM原理、多线程、设计模式及Java 8+新特性等内容。结合买飞机票、验证码生成和评委打分等应用实例,助你掌握考试重点,轻松应对Java期末考试,避免挂科!附带代码资源,供深入学习使用。链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
567 0
|
存储 资源调度 云计算
什么是云计算平台?如何打造云平台核心要件?
云计算平台基于虚拟化和分布式计算技术,提供灵活、可扩展的计算资源与服务框架,支持跨地域的数据处理和应用运行。它通过集中管理资源、优化分配,提高系统可用性和响应速度,降低运营成本,增强用户体验。平台分为IaaS、PaaS和SaaS三层架构,具备动态资源调度、多租户隔离和服务可靠性等优势。构建要素包括基础框架设计、关键技术组件及运维支撑体系,确保高效、安全的云服务交付。
2540 3
|
SQL Java 程序员
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(1)
马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day1最快 最全(1)
605 1
|
jenkins Java 持续交付
jenkins学习笔记之十六:SonarSQube支持多分支
jenkins学习笔记之十六:SonarSQube支持多分支
1055 0
|
SQL 安全 Java
MyBatis LambdaQueryWrapper的概念以及具备那些写法
【4月更文挑战第2天】MyBatis是一个流行的Java持久层框架,它提供了与数据库交互的简化方法。而MyBatis Plus是一个在MyBatis基础上的增强工具,它引入了很多便利的特性,其中之一就是LambdaQueryWrapper。这个类是一个基于Java 8的Lambda表达式的查询构造器,使得构建查询语句变得更加简洁和类型安全。
854 3