当前位置: 首页 > news >正文

Java中的WebSocket与实时通信!

全文目录:

    • 开篇语
    • 前言
    • 一、WebSocket概念:全双工通信、长连接
      • 1.1 WebSocket协议简介
        • WebSocket的特点:
      • 1.2 WebSocket工作原理
        • WebSocket连接的三阶段:
    • 二、Java实现WebSocket:Java API for WebSocket(JSR 356)、Spring WebSocket
      • 2.1 Java API for WebSocket(JSR 356)
        • 服务器端实现
        • 代码解析:
        • 启动服务器
      • 2.2 Spring WebSocket
        • 配置WebSocket
        • 代码解析:
        • 发送和接收消息
        • 代码解析:
        • 客户端实现
        • 代码解析:
    • 三、应用场景:即时聊天、实时通知、在线游戏
      • 3.1 即时聊天
      • 3.2 实时通知
      • 3.3 在线游戏
    • 四、总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在现代Web应用中,用户对实时互动的需求越来越高。无论是即时聊天、实时通知,还是在线多人游戏,实时通信已成为现代应用的重要组成部分。传统的HTTP请求/响应模式已经不能满足实时数据交换的需求,而WebSocket作为一种支持全双工通信的协议,为开发者提供了一个高效、低延迟的解决方案。Java为实现WebSocket通信提供了多种工具和框架,其中最常用的是Java API for WebSocket (JSR 356)Spring WebSocket

本文将深入探讨WebSocket的概念、Java实现WebSocket的技术手段,并通过实际应用场景(如即时聊天、实时通知、在线游戏)进行详细分析。

一、WebSocket概念:全双工通信、长连接

1.1 WebSocket协议简介

WebSocket协议是HTML5推出的一种网络协议,用于在客户端和服务器之间建立一个持久的、双向的通信通道。与传统的HTTP协议不同,WebSocket提供了全双工通信方式,这意味着客户端和服务器可以随时相互发送消息,而不需要每次建立新的连接。这使得WebSocket特别适用于实时应用场景。

WebSocket的特点:
  • 全双工通信:WebSocket支持客户端和服务器之间的双向数据流,可以同时发送和接收数据,不像HTTP那样只能从客户端发起请求。
  • 长连接:WebSocket协议建立连接后,客户端与服务器之间保持长时间的连接,直到手动关闭连接。这避免了频繁建立和关闭连接的开销。
  • 低延迟:由于WebSocket使用持久连接,数据交换不再受到传统HTTP请求/响应模型的限制,具有更低的延迟。

1.2 WebSocket工作原理

  1. 建立连接:WebSocket连接由客户端发起,客户端通过HTTP请求与服务器进行握手。服务器响应HTTP请求并升级协议为WebSocket,连接建立成功。

  2. 数据交换:一旦WebSocket连接建立,客户端和服务器可以通过该连接进行双向数据传输。数据交换是基于WebSocket协议的帧结构进行的,数据帧通过WebSocket连接不断发送。

  3. 关闭连接:当通信完成时,客户端或服务器都可以发送关闭帧,关闭WebSocket连接。

WebSocket连接的三阶段:
  • 握手阶段:客户端向服务器发起连接请求,服务器响应并升级协议为WebSocket。
  • 数据传输阶段:客户端和服务器通过持久连接进行双向数据传输。
  • 关闭阶段:通信完成后,客户端或服务器发送关闭帧关闭连接。

二、Java实现WebSocket:Java API for WebSocket(JSR 356)、Spring WebSocket

2.1 Java API for WebSocket(JSR 356)

**Java API for WebSocket (JSR 356)**是Java EE7引入的标准API,旨在简化WebSocket通信的实现。通过JSR 356,开发者可以轻松地在Java应用中实现WebSocket服务器端和客户端。

服务器端实现
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 ChatEndpoint {@OnOpenpublic void onOpen(Session session) {System.out.println("New connection: " + session.getId());}@OnMessagepublic void onMessage(String message, Session session) {System.out.println("Received message: " + message);session.getAsyncRemote().sendText("Echo: " + message);}@OnClosepublic void onClose(Session session) {System.out.println("Connection closed: " + session.getId());}
}
代码解析:
  • @ServerEndpoint(“/chat”):标注WebSocket端点,客户端可以通过ws://localhost:8080/chat进行连接。
  • @OnOpen:当WebSocket连接建立时调用,session.getId()可用来获取客户端的连接ID。
  • @OnMessage:当接收到客户端发送的消息时调用,session.getAsyncRemote().sendText()用于向客户端发送消息。
  • @OnClose:当WebSocket连接关闭时调用,释放资源等。
启动服务器
import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerEndpointConfig;
import javax.servlet.ServletContext;
import org.apache.tomcat.websocket.server.WsSci;public class WebSocketServer {public static void main(String[] args) {ServletContext context = new MyServletContext();ServerContainer container = (ServerContainer) context.getAttribute("javax.websocket.server.ServerContainer");container.addEndpoint(ChatEndpoint.class);}
}

2.2 Spring WebSocket

Spring WebSocket是Spring框架提供的一种集成WebSocket的解决方案。它结合了Spring的依赖注入和消息驱动的处理方式,能够轻松地实现WebSocket服务器端和客户端通信。Spring WebSocket与STOMP协议结合使用,使得消息推送和事件通知变得更加简单和强大。

配置WebSocket
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/chat").withSockJS(); // 创建WebSocket端点,使用SockJS进行降级处理}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker("/topic"); // 启用一个简单的内存消息代理,处理`/topic`下的消息registry.setApplicationDestinationPrefixes("/app"); // 设置消息前缀}
}
代码解析:
  • @EnableWebSocketMessageBroker:启用WebSocket消息代理,允许使用STOMP协议进行消息推送。
  • registerStompEndpoints:注册WebSocket端点,客户端通过/chat连接。
  • configureMessageBroker:配置消息代理和应用消息前缀。/topic用于广播消息,/app是应用消息的前缀。
发送和接收消息
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;@Controller
public class ChatController {@MessageMapping("/sendMessage") // 处理客户端发送的消息@SendTo("/topic/messages") // 向订阅者发送消息public String sendMessage(String message) {return "Message: " + message;}
}
代码解析:
  • @MessageMapping(“/sendMessage”):接收客户端发送到/sendMessage的消息。
  • @SendTo(“/topic/messages”):消息将被转发到/topic/messages,然后广播到所有订阅者。
客户端实现
<!DOCTYPE html>
<html>
<head><title>WebSocket Chat</title><script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"></script>
</head>
<body><div id="messages"></div><input type="text" id="messageInput"><button onclick="sendMessage()">Send</button><script>var socket = new SockJS('/chat');var stompClient = Stomp.over(socket);stompClient.connect({}, function(frame) {stompClient.subscribe('/topic/messages', function(message) {document.getElementById("messages").innerHTML += message.body + "<br>";});});function sendMessage() {var message = document.getElementById("messageInput").value;stompClient.send("/app/sendMessage", {}, message);}</script>
</body>
</html>
代码解析:
  • SockJS:提供WebSocket连接的降级支持,在不支持WebSocket的环境中使用。
  • STOMP:消息传递协议,客户端通过STOMP协议发送消息到/app/sendMessage,并接收来自/topic/messages的广播消息。

三、应用场景:即时聊天、实时通知、在线游戏

3.1 即时聊天

WebSocket在即时通讯应用中的应用非常广泛,利用WebSocket的全双工通信,可以实现实时的消息推送。每当一个用户发送消息,消息便立即传递给其他连接的客户端,提供实时互动的体验。

3.2 实时通知

WebSocket也常用于实时通知系统。在很多业务场景中,系统需要向用户推送实时信息,如订单状态更新、系统警告、直播通知等。WebSocket提供了一个持久连接,能够在有新事件发生时立即通知到客户端。

3.3 在线游戏

在线游戏中的实时数据交换对低延迟的要求非常高。WebSocket的低延迟和持久连接特性使其成为在线多人游戏的理想选择。游戏中的实时互动、玩家状态更新、多人协作等都可以通过WebSocket实现。

四、总结

Java中的WebSocket和实时通信技术提供了低延迟、高吞吐量的双向通信解决方案,使得开发者能够轻松地构建实时交互应用。Java API for WebSocket(JSR 356)Spring WebSocket为开发者提供了简洁且功能强大的实现方式,适用于即时聊天、实时通知、在线游戏等多种应用场景。

通过WebSocket,开发者能够实现高效的实时通信,消除了传统HTTP协议的限制,使得应用能够在客户端和服务器之间进行无缝的、实时的双向数据流。随着WebSocket的广泛应用,实时交互功能在Web开发中的重要性也将不断增强,推动互联网应用的智能化与实时化。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

http://www.dtcms.com/a/569630.html

相关文章:

  • SQL server创建数据表
  • MacOS-Terminal直接command解压缩文件文件夹
  • GIM 模型转 GLB 模型:从格式适配到前端渲染的完整方案
  • 什么是网站平台开发wordpress链接优化
  • 软件测试——自动化测试概念
  • 大模型-详解 Vision Transformer (ViT)
  • 建站公司互橙知乎郑州seo哪家专业
  • 09-ubuntu20.04 执行 apt update时报错,是因为官网已停止维护不再更新的缘故吗?
  • 南通做网站找谁求网站懂的说下开车
  • ps做网站宽度重庆公司团建推荐
  • uniapp中的uni_modules分包
  • 算法笔记 09
  • 【VLAs篇】08:以实时速度运行VLA
  • 广西桂林建设局网站建立网站需要多少钱 索 圈湖南岚鸿
  • 买完服务器怎么做网站网页编辑软件绿色
  • 从奠基到前沿:CIFAR-10 数据集如何驱动计算机视觉研发进化
  • 计算机网络第六章学习
  • 华为A800I A2 arm64架构鲲鹏920cpu的ubuntu22.04 tls配置直通的grub配置
  • 耐热型发光颜料:高温环境下的功能材料新星
  • 简单易做的的网站做网站一定要注册域名吗
  • 正态分布概率:1σ、2σ、3σ、4σ深度解读
  • 红帽Linux-调优系统性能
  • python找到文件夹A中但是不在文件夹B中的文件
  • 做企业网站要怎么设计方案机关单位网站安全建设
  • 网站建设乙方义务wordpress 模板 淘宝客
  • 归并排序解读(基于java实现)
  • 从0开始学算法——第一天(如何高效学习算法)
  • 相似度计算算法系统性总结
  • 大型网站建设用什么系统好佛山网站设计哪里好
  • Perplexity AI 的 RAG 架构全解析:幕后技术详解