什么是 WebSocket?Java 中如何实现 WebSocket?

news2025/2/5 11:55:28

什么是 WebSocket?Java 中如何实现 WebSocket?

WebSocket 简介

WebSocket 是一种新型的网络协议,它允许客户端和服务器之间进行双向通信,可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的,使用标准的 TCP 连接,可以在客户端和服务器之间建立一条持久化的连接,而不需要像 HTTP 协议那样每次请求都需要重新建立连接。

WebSocket 协议的优点包括:

  • 实时性:WebSocket 协议可以在客户端和服务器之间实现实时数据交互。
  • 性能:WebSocket 协议使用标准的 TCP 连接,可以在客户端和服务器之间建立一条持久化的连接,不需要像 HTTP 协议那样每次请求都需要重新建立连接。这可以提高网络性能,并减少网络带宽的消耗。
  • 跨域支持:WebSocket 协议支持跨域请求,可以在不同的域名之间进行数据交互。
    在这里插入图片描述

Java 中的 WebSocket 实现

Java 中的 WebSocket 实现主要是通过 JSR 356 规范来实现的,该规范定义了 Java 中的 WebSocket API,包括客户端和服务端两部分。

WebSocket 客户端

Java 中的 WebSocket 客户端可以通过 javax.websocket 包中的 Session 类来实现。以下是一个简单的 WebSocket 客户端示例代码:

@ClientEndpoint
public class MyClient {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("连接成功");
    }

    @OnMessage
    public void onMessage(String message) {
        System.out.println("收到消息:" + message);
    }

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

    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        Session session = container.connectToServer(MyClient.class, URI.create("ws://localhost:8080/websocket"));
        session.getBasicRemote().sendText("Hello, WebSocket");
    }
}

上面的代码实现了一个简单的 WebSocket 客户端,使用 @ClientEndpoint 注解来标识该类是一个 WebSocket 客户端,使用 @OnOpen@OnMessage@OnClose 注解来定义客户端的行为。可以使用 WebSocketContainer 类来创建一个 WebSocket 客户端,并使用 Session 类来操作连接。

WebSocket 服务端

Java 中的 WebSocket 服务端可以通过 javax.websocket 包中的 Endpoint 类来实现。以下是一个简单的 WebSocket 服务端示例代码:

@ServerEndpoint("/websocket")
public class MyServer {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("连接成功");
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("收到消息:" + message);
        session.getBasicRemote().sendText("你好,客户端");
    }

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

    public static void main(String[] args) throws Exception {
        ServerEndpointConfig config = ServerEndpointConfig.Builder.create(MyServer.class, "/websocket").build();
        WebSocketServerContainer container = (WebSocketServerContainer) ContainerProvider.getWebSocketContainer();
        container.addEndpoint(config);
        System.out.println("服务端启动成功");
        Thread.currentThread().join();
    }
}

上面的代码实现了一个简单的 WebSocket 服务端,使用 @ServerEndpoint 注解来标识该类是一个 WebSocket 服务端,使用 @OnOpen@OnMessage@OnClose 注解来定义服务端的行为。可以使用 WebSocketServerContainer 类来创建一个 WebSocket 服务端,并使用 ServerEndpointConfig 类来配置服务端的连接。

WebSocket 实现示例

下面是一个完整的 WebSocket 实现示例,包括客户端和服务端。该示例实现了一个简单的聊天室,客户端可以向服务端发送消息,并将消息广播给所有在线用户。

服务端```java

@ServerEndpoint(“/chat”)
public class ChatServer {
private static final Set sessions = Collections.synchronizedSet(new HashSet<>());

@OnOpen
public void onOpen(Session session) {
    System.out.println("新用户加入");
    sessions.add(session);
}

@OnMessage
public void onMessage(String message, Session session) throws IOException {
    System.out.println("收到消息:" + message);
    broadcast(message);
}

@OnClose
public void onClose(Session session) {
    System.out.println("用户离开");
    sessions.remove(session);
}

private void broadcast(String message) throws IOException {
    for (Session session : sessions) {
        session.getBasicRemote().sendText(message);
    }
}

public static void main(String[] args) throws Exception {
    ServerEndpointConfig config = ServerEndpointConfig.Builder.create(ChatServer.class, "/chat").build();
    WebSocketServerContainer container = (WebSocketServerContainer) ContainerProvider.getWebSocketContainer();
    container.addEndpoint(config);
    System.out.println("聊天室已启动");
    Thread.currentThread().join();
}

}


上面的代码实现了一个简单的聊天室,使用 `@ServerEndpoint` 注解来标识该类是一个 WebSocket 服务端,使用 `@OnOpen`、`@OnMessage` 和 `@OnClose` 注解来定义服务端的行为。在 `onOpen` 方法中,将新用户加入到 `sessions` 集合中,表示该用户已经加入聊天室。在 `onMessage` 方法中,将收到的消息广播给所有在线用户。在 `onClose` 方法中,将离开的用户从 `sessions` 集合中移除,表示该用户已经离开聊天室。在 `broadcast` 方法中,将消息广播给所有在线用户。

### 客户端

```java
@ClientEndpoint
public class ChatClient {
    private static final String SERVER_URL = "ws://localhost:8080/chat";
    private static final Scanner scanner = new Scanner(System.in);

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("连接成功");
    }

    @OnMessage
    public void onMessage(String message) {
        System.out.println("收到消息:" + message);
    }

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

    public static void main(String[] args) throws Exception {
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        Session session = container.connectToServer(ChatClient.class, URI.create(SERVER_URL));
        System.out.print("请输入您的昵称:");
        String nickname = scanner.nextLine();
        while (true) {
            System.out.print("[" + nickname + "]: ");
            String message = scanner.nextLine();
            session.getBasicRemote().sendText("[" + nickname + "]: " + message);
        }
    }
}

上面的代码实现了一个简单的聊天室客户端,使用 @ClientEndpoint 注解来标识该类是一个 WebSocket 客户端,使用 @OnOpen@OnMessage@OnClose 注解来定义客户端的行为。在 onOpen 方法中,表示连接成功。在 onMessage 方法中,将收到的消息打印到控制台。在 onClose 方法中,表示连接关闭。在 main 方法中,使用 WebSocketContainer 类来创建一个 WebSocket 客户端,并使用 Session 类来操作连接。用户需要输入昵称,并通过控制台输入消息发送给服务端。

总结

本文介绍了 WebSocket 协议的基本概念和 Java 中的 WebSocket 实现方式。通过示例代码,演示了如何在 Java 中实现一个简单的聊天室,包括服务端和客户端。WebSocket 协议具有实时性、性能和跨域支持等优势,在实时数据交互的场景中得到广泛应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目之(超市管理系统ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的超市管理系统。技术交流和部署相关看文章末尾&#xff01; 目录 开发环境&#xff1a; 后端&#xff1a; 前端&#xff1a; 数据库&…

【MySQL系列】深入学习数据类型

「前言」文章内容大致是数据库的数据类型。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、数据类型分类二、数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float类型2.3.2 decimal类型 2.4 字符串类型2.4.1 char类型2.4.2 varchar类型2.4.3 …

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

如何快速又高质量的输出PDF实验报告?

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 PDF文档的打印在很多应用场景中都会被使用到&#xff0c;最为常见的就是实验室信息管理…

rockchip linux Vendor storage 及SN添加

前言 在产品开发过程中,最后都会为产品编辑一个产品编号方便于管理和维护,而SN(Series Number)就是用于产品的生产编号。但是在linux中,并没有专门管理串码的驱动。 Vendor storage 是rockchip 被设计用来存储 SN,MAC,LAN,BT 等 vendor data。特征如下: 唯一的访问…

一些有意思的SCI

Gardner J K, Knopoff L. Is the sequence of earthquakes in Southern California, with aftershocks removed, Poissonian?[J]. Bulletin of the seismological society of America, 1974, 64(5): 1363-1367. [原文] 该论文的abstract只有一个单词&#xff1a;Yes。 目前该论…

MySQL索引使用原则,什么是覆盖索引、索引下堆、离散度……这些概念你弄明白了吗

文章目录 一、索引失效的场景二、列的离散度三、联合索引最左匹配1、什么时候用联合索引2、什么是覆盖索引 四、索引条件下推&#xff08;ICP&#xff09; 一、索引失效的场景 MySQL索引失效的场景&#xff0c;什么情况下会造成MySQL索引失效 二、列的离散度 什么是列的离散…

【Nacos】实战之配置中心加载多个配置文件

目录 复习未拆分前的yaml文件拆分配置文件dataSource.yamlmybatis.yamlother.yaml 微服务同时加载多个远程配置文件修改配置文件 复习 导入依赖在子模块里面创建 bootstrap.yaml 文件bootstrap.yaml 文件 添加需要的远程配置信息开始拆分以前的配置信息 未拆分前的yaml文件 拆…

服务器数据库被360后缀勒索病毒攻击怎么解决,勒索病毒解密

随着网络攻击日益猖獗&#xff0c;数据库遭遇勒索病毒的攻击已成为常见现象。而360后缀勒索病毒是一种恶意软件&#xff0c;它将加密数据库中的文件&#xff0c;并要求受害者支付赎金才能获得解密密钥。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器被360后…

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

文章目录 前言1. 电路原理图理解1.1 LED与KEY原理图理解1.2 BEEP蜂鸣器 2. 外部中断配置阐述3. STM32CubeMX配置4. 代码编写4.1 代码编写思路4.2 重写回调函数 TIPS总结 前言 这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关&#xff1b;本文从原理图开始到最后实…

工作日记20230714

1、报文id定义对&#xff0c;类库中和tracking中的报文长度定义一致&#xff0c;但是和一级那边的报文长度定义不一致&#xff0c;对方有可能会收到报文&#xff0c;但是发送方在发出数据后程序会自动中止。 2、结构体 如果定义结构体List的话&#xff0c;不用在()加初始值&a…

分享一下使用finalshell连接虚拟机失败的经历

今天在使用finalshell连接安装的Ubuntu的时候遇到了一点问题&#xff0c;通过root用户连接的时候一直连接失败。 然后照着网上的解决方式一个个试 一、安装oppenssh -server sudo apt-get install openssh-server 然后重启ssh sudo service ssh restart 二、设置密码 最后发…

【架构设计】谈谈防腐层的妙用

文章目录 前言一、一个简单的例子二、防腐层介绍总结 前言 最近在学习了解领域驱动模型DDD相关的内容&#xff0c;但是由于没有实际的项目支撑&#xff0c;所以大都是停留在一些理论层面。我发现这里面的一些设计思想还是非常有实用价值的&#xff0c;可以直接应用于你目前的项…

基于ssm+mybatis+mysql+jsp机票预定系统

基于ssmmybatismysqljsp机票预定系统 一、系统介绍二、功能展示1.主页2.个人中心3.用户管理(管理员)4.客机管理&#xff08;管理员&#xff09;5.航班管理&#xff08;管理员&#xff09;6.机票管理&#xff08;管理员&#xff09; 三、其它系统四、获取源码 一、系统介绍 系统…

nacos设置服务权重

nacos设置服务权重

飞行动力学 - 第8节-着陆性能 之 基础点摘要

飞行动力学 - 第8节-着陆性能 之 基础点摘要 1. 着陆性能1.1 空中直线段S11.2 拉平段S21.3 地面滑跑段S3 2. 着陆性能改善方法3. 起飞性能列举4. 参考资料 1. 着陆性能 总体距离S S1 S2 S3&#xff0c;越短性能越佳。 1.1 空中直线段S1 1.2 拉平段S2 1.3 地面滑跑段S3 2. 着…

三分钟了解Redis HyperLogLog 数据结构

文章目录 0. 前言1. 原理1.2 原理解析 2.实战案例3. Redis从入门到精通系列文章4. 常见问题4.1. 什么是Redis HyperLogLog&#xff1f;4.2. HyperLogLog算法的核心思想是什么&#xff1f;4.3. HyperLogLog算法的误差率如何控制&#xff1f;4.4. HyperLogLog算法的存储空间大小与…

超图数据集概念学习1

以前写过一些数据源数据集有关的博文&#xff1b;从头学习一下&#xff1b; 数据集是同种类型数据的集合&#xff0c;比如&#xff1a;点数据集、线数据集。根据数据类型的不同&#xff0c;分为矢量数据集、格网数据集和影像数据集&#xff0c;以及为了处理特定问题而设计的如路…

​CentOS防火墙操作命令 ​

CentOS防火墙操作命令 1、查看防火墙服务状态 systemctl status firewalld.service 或者查看防火墙的状态&#xff1a; 1 firewall-cmd --state 2、开启、重启防火墙 启动firewall&#xff1a; 1 systemctl start firewalld.service 设置开机自启或禁用&#xff1a; …

【Ceph】基于ceph-deploy部署Ceph集群详解

基于ceph-deploy部署Ceph集群详解 1. 存储基础1.1 单机存储设备1.1.1 单机存储的问题1.1.2 商业存储解决方案 1.2 分布式存储&#xff08;软件定义的存储SDS&#xff09;1.2.1 分布式存储的类型 2. Ceph简介2.1 Ceph优势2.2 Ceph架构2.2.1 高层应用接口 2.3 Ceph核心组件2.3.1 …