开篇语
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是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工作原理
- 建立连接:websocket连接由客户端发起,客户端通过http请求与服务器进行握手。服务器响应http请求并升级协议为websocket,连接建立成功。
- 数据交换:一旦websocket连接建立,客户端和服务器可以通过该连接进行双向数据传输。数据交换是基于websocket协议的帧结构进行的,数据帧通过websocket连接不断发送。
- 关闭连接:当通信完成时,客户端或服务器都可以发送关闭帧,关闭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 {
@onopen
public void onopen(session session) {
system.out.println("new connection: " + session.getid());
}
@onmessage
public void onmessage(string message, session session) {
system.out.println("received message: " + message);
session.getasyncremote().sendtext("echo: " + message);
}
@onclose
public 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 {
@override
public void registerstompendpoints(stompendpointregistry registry) {
registry.addendpoint("/chat").withsockjs(); // 创建websocket端点,使用sockjs进行降级处理
}
@override
public 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 + "
";
});
});
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开发中的重要性也将不断增强,推动互联网应用的智能化与实时化。
到此这篇关于java中的websocket与实时通信!的文章就介绍到这了,更多相关java websocket实时通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论