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 的实时双向通信应用。

相关推荐
晨曦中的暮雨10 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
o0麦嘎10 小时前
内网ip配置https
网络协议·tcp/ip·https
七老板的blog10 小时前
当 Spring StateMachine 遇见大模型:构建工业级 AI 写作流水线
java·人工智能·spring
云烟成雨TD10 小时前
Spring AI 1.x 系列【46】MCP Security 模块
java·人工智能·spring
CRMEB系统商城10 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
sinat_2554878110 小时前
第七部分。介绍MVC(模型-视图-控制器)模式
java·ide·http·tomcat·intellij-idea
潜创微科技11 小时前
4K60 over IP 方案简介
网络·嵌入式硬件·网络协议·tcp/ip·音视频
pride.li11 小时前
海思视觉Hi3516CV610--开机自动设置ip
linux·网络·网络协议·tcp/ip
李白的天不白11 小时前
ps -ef | grep java
java
ab_dg_dp11 小时前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python