Java websocket 使用

简介

WebSocket 是一种基于 TCP 协议的全双工通信协议,可以在浏览器和服务器之间建立实时、双向的数据通信。在 Java 中,我们可以使用 Java API for WebSocket(JSR 356)来实现 WebSocket。

WebSocket 的作用是在 Web 应用程序中实现实时、双向的数据通信,可以用于在线聊天、在线游戏、实时数据展示等场景。与传统的 HTTP 协议不同,WebSocket 可以保持长连接,实时传输数据,避免了频繁的 HTTP 请求和响应,节省了网络带宽和服务器资源,提高了应用程序的性能和用户体验。

在这里插入图片描述

WebSocket 示例代码

下面是一个使用 Java API for WebSocket 实现的简单的 WebSocket 示例代码:

服务端代码:

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

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

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        for (Session s : sessions) {
            if (s.isOpen()) {
                s.getBasicRemote().sendText(message);
            }
        }
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }
}

在上面的代码中,我们使用 @ServerEndpoint 注解将 ChatServer 类作为 WebSocket 服务器端的入口点,定义了一个 /chat 的 WebSocket 端点。在 onOpen() 方法中,我们使用 sessions 集合保存当前连接的所有会话。在 onMessage() 方法中,我们遍历 sessions 集合,将收到的消息发送给所有连接的会话。在 onClose() 方法中,我们移除当前会话。这样,我们就实现了一个简单的在线聊天室。

客户端代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Chat</title>
</head>
<body>
    <input type="text" id="message">
    <button onclick="sendMessage()">Send</button>
    <div id="output"></div>
    <script>
        var websocket = new WebSocket("ws://" + window.location.host + "/chat");

        websocket.onmessage = function(event) {
            var output = document.getElementById("output");
            output.innerHTML += event.data + "<br>";
        };

        function sendMessage() {
            var message = document.getElementById("message").value;
            websocket.send(message);
        }
    </script>
</body>
</html>

在上面的代码中,我们使用 JavaScript 创建 WebSocket 对象,建立与 ChatServer 类的 /chat 端点的连接。在 onmessage() 方法中,我们将收到的消息添加到页面的 output 元素中。在 sendMessage() 方法中,我们获取页面的 message 元素的值,并将其发送给服务端。

在运行上面的代码后,我们可以在浏览器中打开多个页面,然后在每个页面的输入框中输入消息,点击 Send 按钮发送消息,就能在所有页面上看到收到的消息了。

总的来说,WebSocket 是一种实现实时、双向数据通信的协议,可以在 Web 应用程序中用于实现在线聊天、在线游戏、实时数据展示等场景。在 Java 中,我们可以使用 Java API for WebSocket 来实现 WebSocket,实现简单、易用、高效、可靠的 WebSocket 应用。

更多

除了上面提到的基本功能之外,Java API for WebSocket(JSR 356)还提供了一些其他的特性,包括:

  1. 编程模型:Java API for WebSocket 提供了基于注解和基于接口两种编程模型,使得开发者可以根据自己的需求选择合适的编程模型。
  2. 生命周期管理:Java API for WebSocket 提供了标准的生命周期管理,包括连接建立、消息接收、连接关闭等阶段,可以方便地管理 WebSocket 的生命周期。
  3. 消息编解码:Java API for WebSocket 提供了消息编解码的支持,可以将 Java 对象转换为 WebSocket 消息,或将 WebSocket 消息转换为 Java 对象。
  4. 子协议支持:Java API for WebSocket 支持子协议,可以根据需要选择合适的子协议,以实现更加灵活的数据传输。
  5. SSL/TLS 支持:Java API for WebSocket 支持 SSL/TLS 安全传输协议,可以保障数据的安全性和完整性。
  6. WebSocket 客户端 API:Java API for WebSocket 还提供了 WebSocket 客户端 API,可以方便地实现 WebSocket 客户端,与服务端进行双向通信。

下面是一个使用 Java API for WebSocket 实现消息编解码的示例代码:

import java.io.IOException;
import java.nio.ByteBuffer;
import javax.websocket.DecodeException;
import javax.websocket.Decoder;
import javax.websocket.EncodeException;
import javax.websocket.Encoder;
import javax.websocket.EndpointConfig;

public class Message {
    private String from;
    private String to;
    private String content;

    // 构造函数、getter 和 setter 略

    public static class MessageEncoder implements Encoder.Text<Message> {
        @Override
        public String encode(Message message) throws EncodeException {
            return message.getFrom() + "|" + message.getTo() + "|" + message.getContent();
        }

        @Override
        public void init(EndpointConfig config) {}

        @Override
        public void destroy() {}
    }

    public static class MessageDecoder implements Decoder.Text<Message> {
        @Override
        public Message decode(String message) throws DecodeException {
            String[] parts = message.split("\\|");
            if (parts.length != 3) {
                throw new DecodeException(message, "Invalid message format");
            }
            Message m = new Message();
            m.setFrom(parts[0]);
            m.setTo(parts[1]);
            m.setContent(parts[2]);
            return m;
        }

        @Override
        public boolean willDecode(String message) {
            return true;
        }

        @Override
        public void init(EndpointConfig config) {}

        @Override
        public void destroy() {}
    }
}

在上面的代码中,我们定义了一个 Message 类,包含 from、to 和 content 三个属性。然后,我们实现了一个 MessageEncoder 类和一个 MessageDecoder 类,分别用于将 Message 对象转换为字符串和将字符串转换为 Message 对象。在 MessageEncoder 类中,我们使用 encode() 方法将 Message 对象转换为字符串,使用 “|” 分隔三个属性。在 MessageDecoder 类中,我们使用 decode() 方法将字符串转换为 Message 对象,使用 “|” 正则表达式将字符串分割为三个部分,然后调用 Message 的 setter 方法设置属性值。

这样,我们就可以在 WebSocket 中传输 Message 对象了,而不需要手动进行字符串的拼接和解析。

小结

总的来说,Java API for WebSocket 提供了丰富的特性,可以帮助开发者快速、简单、高效地实现 WebSocket 应用,提高应用程序的性能和用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot+jsp+javaweb学生信息管理系统 05hs

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户是管…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【MySQL】浅谈事务

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 “事务”&#xff0c;可能大家都会在心中出现一个大大的 &#xff1f;&#xff0c;博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

详解二叉树

&#x1f308;目录 一、树形结构​ &#x1f333;1.1 概念1.2 其他概念1.3 树的表示形式 二、二叉树✨2.1 概念2.2 两种特殊二叉树2.3 性质2.4 二叉树存储 三、二叉树的基本操作&#x1f64c;3.1 前置说明3.2 二叉树的遍历3.3 二叉树的基本操作 四、二叉树的OJ✍️ 一、树形结构…

康耐视智能相机insight主从触发以及康耐视insight视觉系统之间数据特有交互方式

1、一个相机设置为主系统,指定自己的名称,下方可以指定发给从系统的数据,触发方式不要设置 成网络 2、另外一个相机触发方式设置成网络,然后下方指定主系统的名称 3、主系统每触发一次,就会带动从系统触发,同时指定的数据会发送到从系 统,从系统使用函数getstring获取…

爱奇艺2020校招Java方向笔试题(第一场)

1.计算下列程序的时间复杂度&#xff08;&#xff09; for (i1;i<n;i)for(j1;j<m;j){a1,a2,a3,a4};A.O(n) B.O(mn) C.O(m) D.O(1) 答案:B 2.求递归方程T(n)4T(n/2)n 的解 ( ) A.O(n) B.O(n^2) C.O(n^3) D.O(logn) 答案:B 用Mater公式计算 3.下列关于动态规划算法说法错…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

国货大佬“卡脖子”后王者风范不减?小米卷出光学拍摄“天花板”?| 手机行业社媒心智品牌榜出炉

Social Power 核心解读 1、智能手机“乍暖还寒”&#xff0c;龙头品牌仍稳占消费者心智 比拼屏幕、赶超系统、迭代形态、拓展概念&#xff1f;眼花缭乱过后&#xff0c;产品精益求精&#xff0c;建立稳固的消费者认知&#xff0c;才是“保鲜”关键。在最新发布的数说故事5月…

MyBatis Plus 拦截器实现数据权限控制

一、介绍 上篇文章介绍的MyBatis Plus 插件实际上就是用拦截器实现的&#xff0c;MyBatis Plus拦截器对MyBatis的拦截器进行了包装处理&#xff0c;操作起来更加方便 二、自定义拦截器 2.1、InnerInterceptor MyBatis Plus提供的InnerInterceptor接口提供了如下方法&#x…

基于AI技术的API开发工具,自动化和智能化快速高效开发API

一、开源项目简介 ApiCat 是一款基于 AI 技术的 API 开发工具&#xff0c;它旨在通过自动化和智能化的方式&#xff0c;帮助开发人员更快速、更高效地开发 API。ApiCat 支持 OpenAPI 和 Swagger 的数据文件导入和导出&#xff0c;并可以对用户输入的 API 需求进行分析和识别&a…

真题详解(补码转换)-软件设计(七十四)

真题详解(索引查询)-软件设计&#xff08;七十三)https://blog.csdn.net/ke1ying/article/details/130659024 Composite模式&#xff1a; 以树形结构来表示”整体-部分”的关系&#xff0c;使得单个和团体的使用都具有一致性。 对一个基本有序的数组进行排序&#xff0c;适合…

精彩回顾 | Fortinet Accelerate 2023·中国区巡展厦门站

Fortinet Accelerate 2023中国区 5月16日&#xff0c;Fortinet Accelerate 2023中国区巡展来到魅力“鹭岛”——厦门&#xff0c;技术、产品和业务专家&#xff0c;携手亚马逊云科技、唯一网络等云、网、安合作伙伴&#xff0c;与交通、物流、金融等各行业典型代表客户&#x…

HR真的会嫌弃跳槽频繁的测试人员吗?

我们都知道&#xff1a;“跳槽≠涨薪”&#xff0c;但是对于测试人来说&#xff0c;跳槽绝哔能和升职加薪画上等号啊。 所以&#xff0c;有很多测试人在一家公司常常待不到1年&#xff0c;就另觅新东家&#xff0c;来借此达成升职加薪的目的。 有人提出质疑&#xff1a;为什么测…

嚯——ChatGPT是很强,但也会胡说八道。。。

现在的ChatGPT确实强&#xff0c;但是也会一本正经的胡说八道&#xff0c;例如它回答“nineteen”中有12个字母、或是旗鱼是哺乳动物…… 尽管ChatGPT可以生成流畅甚至优雅的散文&#xff0c;轻松通过困扰了AI领域超过70年的图灵测试基准&#xff0c;但它也可能看起来非常愚蠢…

探讨接口测试颗粒度

偶然间在论坛上看到一个帖子&#xff0c;帖子内容如下&#xff1a; 假设现在有一个新增商品的接口&#xff0c;返回的参数中有新增商品的 id&#xff08;每次返回的 id 都不一样&#xff09;、success&#xff08;判断是否成功&#xff0c;0 失败 1 成功&#xff09; 1. 接口…

Elasticsearch painless脚本教程(包含Java API和SpringDataElasticsearch调用脚本)

Elasticsearch painless脚本 1.什么是painless2.painless的特性3.使用kibana进行准备操作3.1 使用kibana创建索引和映射3.2 使用kibana添加测试数据 4.使用painless执行查询操作关于脚本查询须知4.1 字段查询脚本4.1 排序查询脚本 5.如何使用painless执行更新操作关于脚本查询须…

【机器学习】第二节:线性回归和线性分类

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;机器学习sklearn 描述&#x1f3a8;&#xff1a;本专栏主要分享博主学习机器学习的笔记和一些心得体会。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算…

Text-to-SQL提示工程【Prompt Engineering】

我们刚刚启动了一个开源项目pg-text-query&#xff0c;目标是为文本到 SQL 制作生产就绪的大型语言模型 (LLM) 提示。 我们的目标是 利用 LLM、我们自己对 PostgreSQL 数据库的深入了解以及严格的测试来开发一流的文本到 SQL 的翻译。 推荐&#xff1a;用 NSDT设计器 快速搭建…

【MySQL】C语言连接数据库

在使用数据库的时候&#xff0c;我们是操作客户端方的&#xff0c;向服务器请求数据。MySQL的端口号-3306 连接mysql需要头文件&#xff1a;#include<mysql/mysql.h> 基础连接步骤&#xff1a; 1.创建连接句柄 MYSQL mysql_con;//连接句柄 2.初始化连接句柄mysql_i…

「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

OceanBase 4.1 体验 前言OCP Express在线升级功能租户级物理备库TP&#xff08;事务处理&#xff09;和AP&#xff08;分析处理&#xff09;优化TP 性能优化AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4.1的初体验&#xff0c;国产的分布式数据库也太太太太…