WebSocket编程:Java实现实时双向通信应用

WebSocket 简介

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于需要实时交互的应用场景(如聊天、实时数据推送)。与 HTTP 不同,WebSocket 允许服务器主动向客户端推送数据,无需频繁建立连接。


Java WebSocket 实现方式

Java 提供了两种主要方式实现 WebSocket:

  1. Java API for WebSocket (JSR 356):标准 API,支持注解和编程式配置。
  2. Spring WebSocket:基于 Spring 框架的封装,简化集成(如 STOMP 协议支持)。

使用 JSR 356 实现 WebSocket

服务端实现
java 复制代码
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/ws") // 定义 WebSocket 端点路径
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("客户端连接: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("收到消息: " + message);
        // 向客户端发送响应
        session.getAsyncRemote().sendText("服务器回复: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("连接关闭: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
}
客户端实现(JavaScript 示例)
javascript 复制代码
const socket = new WebSocket("ws://localhost:8080/ws");
socket.onopen = () => console.log("连接已建立");
socket.onmessage = (event) => console.log("收到消息: " + event.data);
socket.send("Hello WebSocket!");

使用 Spring WebSocket 实现

依赖配置

Maven 需添加以下依赖:

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
服务端配置
java 复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");
    }
}
自定义处理器
java 复制代码
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class MyWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) {
        System.out.println("收到消息: " + message.getPayload());
        session.sendMessage(new TextMessage("服务器回复: " + message.getPayload()));
    }
}

关键注意事项

  • 跨域问题 :确保服务端配置允许客户端域名(如 setAllowedOrigins("*"))。
  • 心跳机制:避免连接因空闲被关闭,可通过定期发送心跳消息实现。
  • 性能优化 :高并发场景下,使用 Async 方法(如 getAsyncRemote())提升吞吐量。

参考:gitee.com/a19283598491/sdcfds5/issues/IJEXNX

gitee.com/a19283598491/sdcfds5/issues/IJEXNR

gitee.com/a19283598491/sdcfds5/issues/IJEXNI

gitee.com/a19283598491/sdcfds5/blob/master/hjbh.md

gitee.com/a19283598491/sdcfds5/blob/master/dsds.md

gitee.com/a19283598491/sdcfds5/blob/master/sadsa.md

gitee.com/a19283598491/sdcfds5/blob/master/sdcdsw8.md

gitee.com/a19283598491/sdcfds5/blob/master/asd454.md

gitee.com/a19283598491/sdcfds5/blob/master/sdfcds878.md

gitee.com/a19283598491/sdcfds5/blob/master/sdds85.md

gitee.com/a19283598491/sdcfds5/blob/master/sad881.md

gitee.com/a19283598491/sdcfds5/blob/master/hdsh.md

gitee.com/a19283598491/sdcfds5/blob/master/dscds8.md

gitee.com/a19283598491/sdcfds5/blob/master/lojioj.md

gitee.com/a19283598491/sdcfds5/blob/master/asq843.md

gitee.com/a19283598491/sdcfds5/blob/master/asw101.md

gitee.com/a19283598491/sdcfds5/blob/master/asdq777.md

gitee.com/a19283598491/sdcfds5/blob/master/aws001.md

gitee.com/a19283598491/sdcfds5/blob/master/as002.md

gitee.com/a19283598491/sdcfds5/blob/master/asas003.md

gitee.com/a19283598491/sdcfds5/blob/master/miki004.md

gitee.com/a19283598491/sdcfds5/blob/master/rew01.md

gitee.com/a19283598491/sdcfds5/blob/master/jiu02.md

gitee.com/a19283598491/sdcfds5/blob/master/asddhas01.md

gitee.com/a19283598491/sdcfds5/blob/master/sdak05.md

gitee.com/a19283598491/sdcfds5/blob/master/dsq06.md

gitee.com/a19283598491/sdcfds5/blob/master/oioq08.md

gitee.com/a19283598491/sdcfds5/blob/master/dsaidis09.md

gitee.com/a19283598491/sdcfds5/blob/master/sdacg005.md

gitee.com/a19283598491/sdcfds5/blob/master/wqwq004.md


扩展功能

  • STOMP 协议:Spring WebSocket 支持 STOMP,提供更高级的消息路由功能。
  • 消息广播 :通过 SimpMessagingTemplate 向多个客户端推送消息。
  • 安全性:集成 Spring Security 实现 WebSocket 鉴权。

通过上述方法,可快速构建基于 Java 的实时双向通信应用。

相关推荐
Highcharts.js2 小时前
技术组合分析:Highcharts 的数据集成能力解析
java·前端·金融·echarts·saas·bi·highcharts
shaoFan12 小时前
关于java 调用阿里千问大模型,流式返回,并返回给前端
java·前端·状态模式
雪碧聊技术2 小时前
Java历史—沙箱安全机制
java·安全·沙箱机制
java1234_小锋2 小时前
Spring AI 2.0 开发Java Agent智能体 - Spring AI 2.0简介
java·人工智能·spring·spring ai
Hesionberger2 小时前
LeetCode72.编辑距离(多维动态规划)
java·开发语言·c++·python·算法
郝学胜-神的一滴2 小时前
从底层看透Linux高性能服务器:epoll自定义封装与超时清理实战
linux·服务器·c++·网络协议·tcp/ip·unix
人道领域2 小时前
【LeetCode刷题日记】1047:双栈法与双指针法巧妙消除相邻重复字符
java·算法·leetcode·职场和发展
Java成神之路-3 小时前
面试题:@Controller 与 @RestController 区别
java·spring boot
用户298698530143 小时前
Java 提取 HTML 文本内容:两种轻量级实现方案对比
java·后端