JAVA |日常开发中Websocket详解


JAVA |日常开发中Websocket详解

  • 前言
  • 一、Websocket 概述
    • 1.1 定义
    • 1.2 优势
  • 二、Websocket 协议基础
    • 2.1 握手过程
    • 2.2 消息格式
    • 2.3 数据传输方式
  • 三、Java 中使用 Websocket
    • 3.1 Java WebSocket API(JSR - 356)
    • 3.2 第三方库(如 Tyrus)
  • 四、应用场景
    • 4.1 实时聊天应用
    • 4.2 实时数据推送(如股票行情、体育赛事比分)
    • 4.3 在线游戏
  • 结束语
  • 优质源码分享

JAVA |日常开发中Websocket详解,WebSocket是一种在单个TCP连接上进行全双工通信的协议,它在Web应用中实现了客户端与服务器之间的实时数据传输。与HTTP不同,WebSocket在建立连接后,客户端和服务器都可以随时向对方发送数据,而无需像HTTP那样每次请求都需要建立新的连接。这使得WebSocket非常适合需要实时通信的场景,如在线聊天、实时通知、股票行情推送等。本文将详细介绍Java开发中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事项。

前言

在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。

一、Websocket 概述

1.1 定义

Websocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时的、双向的数据传输,与传统的 HTTP 请求 - 响应模式不同,HTTP 是单向的,客户端请求,服务器响应后连接就关闭,而 Websocket 保持连接打开,以便随时交换数据。

例如,在一个实时聊天应用中,Websocket 可以让客户端(如浏览器)和服务器之间实时地发送和接收聊天消息,而不需要像传统的 HTTP 轮询那样频繁地发送请求来检查是否有新消息。

1.2 优势

实时性高:能够实现服务器和客户端之间的实时通信,数据可以即时地在双方之间传递,减少了延迟。这对于需要实时更新数据的应用场景,如股票交易平台、在线游戏等非常关键。

高效节能:相较于传统的 HTTP 轮询(客户端定时向服务器发送请求来获取最新信息),Websocket 避免了频繁建立和断开连接的开销,从而节省了网络资源和服务器资源,提高了效率。

跨平台支持:Websocket 协议是基于 TCP 协议的,并且在现代浏览器和大多数服务器环境中都有良好的支持,这使得它可以方便地用于开发跨平台的实时应用。

二、Websocket 协议基础

2.1 握手过程

Websocket 协议在建立连接时需要进行握手。客户端首先向服务器发送一个 HTTP 请求,这个请求中包含一些特殊的头部信息,用于表明这是一个 Websocket 请求。例如,请求头中包含Upgrade: websocket和Connection: Upgrade字段,用于请求将协议从 HTTP 升级到 Websocket。

服务器收到请求后,如果支持 Websocket 协议并且同意升级,会返回一个响应,其中包含101 Switching Protocols状态码,表示协议切换成功,之后双方就建立了 Websocket 连接。

2.2 消息格式

Websocket 消息主要有两种格式:文本格式和二进制格式。消息以帧(frame)为单位进行传输,一个完整的消息可以由一个或多个帧组成。

文本消息以 UTF - 8 编码进行传输,方便处理文本数据,如聊天消息等。二进制格式则适用于传输图像、音频、视频等二进制数据。

2.3 数据传输方式

全双工通信意味着客户端和服务器都可以主动发送消息。在连接建立后,任何一方都可以随时发送数据,并且不需要等待对方的请求。例如,服务器可以主动向客户端推送实时的股票价格变化,同时客户端也可以向服务器发送交易指令。

三、Java 中使用 Websocket

3.1 Java WebSocket API(JSR - 356)

简介:Java 提供了 WebSocket API 来方便地在 Java 应用中实现 Websocket 功能。这个 API 定义了客户端和服务器端的接口,使得开发者可以轻松地构建 Websocket 应用。

服务器端实现示例:

首先,创建一个@ServerEndpoint注解的类来表示 Websocket 服务器端点。

import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/chat")
public class ChatServer {
    @OnMessage
    public String onMessage(String message) {
        // 简单的消息处理,例如将消息转换为大写
        return message.toUpperCase();
    }
}

在上述示例中,@ServerEndpoint("/chat")注解定义了 Websocket 服务器端点的路径为/chat。@OnMessage注解标记的方法会在收到消息时被调用,这里只是简单地将收到的消息转换为大写并返回。

客户端实现示例:

客户端需要创建一个WebSocketContainer来建立连接并发送和接收消息。

import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.net.URI;
public class ChatClient {
    public static void main(String[] args) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "ws://localhost:8080/chat";
            javax.websocket.Session session = container.connectToServer(ChatClientEndpoint.class, new URI(uri));
            // 发送消息
            session.getBasicRemote().sendText("Hello");
            // 接收消息
            String response = session.getBasicRemote().receiveText();
            System.out.println("收到回复: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个客户端示例中,首先获取WebSocketContainer,然后通过connectToServer方法连接到服务器端点。之后可以使用sendText发送消息,使用receiveText接收消息。

3.2 第三方库(如 Tyrus)

简介:Tyrus 是一个流行的 Websocket 实现库,它提供了丰富的功能和更好的性能。它是 Java EE 规范的参考实现,支持 JSR - 356 标准。

示例代码(服务器端):

添加 Tyrus 依赖到项目(以 Maven 为例)。

<dependency>
    <groupId>org.glassfish.tyrus - servlet</groupId>
    <artifactId>tyrus - servlet</artifactId>
    <version>1.15</version>
</dependency>

创建服务器端点类。

import org.glassfish.tyrus.server.Server;
public class TyrusChatServer {
    public static void main(String[] args) {
        Server server = new Server("localhost", 8080, "/", null, ChatServerEndpoint.class);
        try {
            server.start();
            System.out.println("服务器已启动");
            // 保持服务器运行
            Thread.sleep(Long.MAX_VALUE);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            server.stop();
        }
    }
}

其中ChatServerEndpoint类可以类似于前面 JSR - 356 中的服务器端点类定义,用于处理消息。

示例代码(客户端):

同样需要添加 Tyrus 客户端依赖。

<dependency>
    <groupId>org.glassfish.tyrus - client</groupId>
    <artifactId>tyrus - client</artifactId>
    <version>1.15</version>
</dependency>

客户端连接和消息发送接收示例。

import org.glassfish.tyrus.client.ClientManager;
import javax.websocket.Session;
import java.io.IOException;
import java.net.URI;
public class TyrusChatClient {
    public static void main(String[] args) {
        try {
            ClientManager clientManager = new ClientManager();
            String uri = "ws://localhost:8080/chat";
            Session session = clientManager.connectToServer(ChatClientEndpoint.class, new URI(uri));
            // 发送消息
            session.getBasicRemote().sendText("Hello");
            // 接收消息
            String response = session.getBasicRemote().receiveText();
            System.out.println("收到回复: " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、应用场景

4.1 实时聊天应用

这是 Websocket 最典型的应用场景之一。用户在浏览器中打开聊天界面,通过 Websocket 与服务器建立连接。当用户发送聊天消息时,消息通过 Websocket 即时传输到服务器,服务器再将消息转发给其他相关用户的客户端,实现实时聊天功能。

4.2 实时数据推送(如股票行情、体育赛事比分)

对于需要实时更新数据的应用,如金融领域的股票行情监控应用,Websocket 可以让服务器在股票价格发生变化时,立即将最新价格推送给客户端。体育赛事比分更新也是类似的,观众可以在浏览器中实时看到比分的变化,而不需要手动刷新页面。

4.3 在线游戏

在多人在线游戏中,Websocket 用于实时同步玩家的操作和游戏状态。例如,在一个多人竞技游戏中,玩家的移动、攻击等操作可以通过 Websocket 即时传输到服务器,服务器再将这些信息广播给其他玩家,确保游戏的实时性和公平性。

结束语

亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


--------------- 业精于勤,荒于嬉 ---------------


--------------- 行成于思,毁于随 ---------------


优质源码分享



💞 关注博主 带你实现畅游前后端

🏰 大屏可视化 带你体验酷炫大屏

💯 神秘个人简介 带你体验不一样得介绍

🎀 酷炫邀请函 带你体验高大上得邀请


① 🉑提供云服务部署(有自己的阿里云);

② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;

如🈶合作请联系我,期待您的联系。

:本文撰写于CSDN平台 ,作者:xcLeigh所有权归作者所有)https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/144187452(防止抄袭,原文地址不可删除)

相关推荐
weixin_1122334 分钟前
基于Java图书借阅系统的设计与实现
java·开发语言
占疏14 分钟前
在虚拟机的python中安装配置Jupyter Notebook
开发语言·python·jupyter
江上清风山间明月18 分钟前
flutter编译e: Daemon compilation failed: null java.lang.Exception错误解决
java·flutter·exception·daemon·compilation
大G哥18 分钟前
Flutter如何调用java接口如何导入java包
java·开发语言·flutter
helloworld工程师22 分钟前
Dubbo的负载均衡及高性能RPC调用
java·大数据·人工智能
南宫生24 分钟前
力扣-图论-9【算法学习day.59】
java·学习·算法·leetcode·图论
ac-er888826 分钟前
PHP如何给图片添加边框效果
开发语言·php
confident327 分钟前
hibernate 配置 二级 缓存
java·缓存·hibernate
CopyProfessor30 分钟前
Java版-图论-最短路-Floyd算法
java·算法·图论
-觅-35 分钟前
‘Close Project‘ is not available while IDEA is updating indexes的解决
java·ide·intellij-idea