WebSocket详解、WebSocket入门案例

目录

[1.1 WebSocket介绍](#1.1 WebSocket介绍)

http协议:

webSocket协议:

1.2WebSocket协议:

1.3客户端(浏览器)实现

[1.3.2 WebSocket对象的相关事宜:](#1.3.2 WebSocket对象的相关事宜:)

[1.3.3 WebSOcket方法](#1.3.3 WebSOcket方法)

[1.4 服务端实现](#1.4 服务端实现)

服务端如何接收客户端发送的请求呢?

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


1.1 WebSocket介绍

WebSocket 是一种网络通信协议。

WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通信的协议。

HTTP 协议是一种无状态、无连接、单向的应用层协议。它采用了 请求/响应 模型。通信请求只能由客户端发起,服务端对请求做出应答处理。(单向的:采用的是请求+响应的模式)

这种通信模型有一个弊端:HTTP协议无法实现服务器主动向客户端发起消息。

这种单项请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数Web应用程序将通过频繁的异步ajax请求实现长轮询。轮询效率低,非常浪费资源(必须不停的连接,或者HTTP连接始终打开)

http协议:

webSocket协议:

1.2WebSocket协议:

WebSocket协议有两个部分,握手和数据传输

握手时基于http协议,在数据传输阶段基于WebSocket协议

1.3客户端(浏览器)实现

java 复制代码
var ws = new WebSocket(url);
//参数url格式说明: ws://ip地址:端口号/资源名称

1.3.2 WebSocket对象的相关事宜:

|---------|-----------------------|---------------|
| 事件 | 事件处理程序 | 描述 |
| open | websocket对象.onopen | 连接建立时触发 |
| message | websocket对象.onmessage | 客户端接收服务端数据时触发 |
| error | websocket对象.onerror | 通信发生错误时触发 |
| close | websocket对象.onclose | 连接关闭时触发 |

1.3.3 WebSOcket方法

WebSocket对象的相关方法:

|--------|----------|
| 方法 | 描述 |
| send() | 使用连接发送数据 |

1.4 服务端实现

Java WebSocket应用一系列的WebSocketEndpoint组成。Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体WebSocket消息的接口。【一个EndPoint对象和一个客户端产生一一对应的关系】

我们可以通过两种方式定义Endpoint:

  • 编程式:继承类 javax.websocket.Endpoint并实现其方法。
  • 注解式:即定义一个POJO,并添加@ServerEndpoint相关注解

Endpoint实例在WebSocket握手时创建,并在客户端与服务端连接过程中有效,最后在链接关闭时结束。在Endpoint接口中明确了定义与其生命周期相关的方法,生命周期方法如下:

|---------|--------------------------------------|----------|
| 方法 | 含义描述 | 注解 |
| onClose | 当会话关闭时调用。 | @OnClose |
| onOpen | 当开启一个新的会话时调用, 该方法是客户端与服务端握手成功后调用的方法。 | @OnOpen |
| onError | 当连接过程中异常时调用。 | @OnError |

服务端如何接收客户端发送的请求呢?

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

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

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

下面是一个简单的案例:

java 复制代码
@ServerEndpoint("/robin")
public class ChatEndPoint {

    private static Set<ChatEndPoint> webSocketSet = new HashSet<>();

    private Session session;

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("接收的消息是:" + message);
        System.out.println(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);
    }

    @OnClose
    public void onClose(Session seesion) {
        System.out.println("连接关闭了。。。");
    }

    @OnError
    public void onError(Session session,Throwable error) {
        System.out.println("出错了。。。。" + error.getMessage());
    }
}
相关推荐
技术不好的崎鸣同学18 分钟前
Windows 命令提示符(CMD)恶意脚本分析篇
网络·windows·安全·系统安全
m0_7156744324 分钟前
2026年医疗行业数据库风险监测产品综合能力排名分析
网络·数据库
宠友信息1 小时前
多端即时通讯源码技术实践,Redis路由、MySQL持久化与Socket接入
spring boot·websocket·mysql·uni-app
阿米亚波2 小时前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发
零意@2 小时前
海光平台debian11的系统,打开pstore功能和验证功能
网络
blueman88882 小时前
qt5-serialbus详细解析
开发语言·网络·qt
学究天人3 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷6)
网络·算法·数学建模·动态规划·几何学·图论·拓扑学
tiantianuser3 小时前
NVME-oF IP 设计2 :设计之前的调研!
网络·网络协议·rdma·roce v2·nvme of
星恒讯工业路由器4 小时前
工业无线通信选型常见问题解答
网络·信息与通信·无线ap·设备选型·工业无线通信·防爆无线设备·4g/5g路由器
智慧光迅AINOPOL4 小时前
校园全光网建设成本对比:全光网取代传统校园网建设成本分析
网络·全光网解决方案·全光网·校园全光网·校园全光网解决方案