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(防止抄袭,原文地址不可删除)