SpringBoot+WebSocket【sockjs】广播配置

本文介绍如何使用SpringBoot实现WebSocket广播功能,通过配置WebSocket环境,创建控制器处理消息,并利用前端JavaScript进行连接和发送消息,实现客户端与服务器的实时通信。
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>
package com.vking.power.web.common.config;

import org.springframework.context.annotation.Bean;
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;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * 服务器 Tomcat 启动会加载 tomcatjdbc,而内置tomcat 不会,
 * 根据此特性来判断当前环境,如果是内置tomcat,则加载websocket 环境
 */
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{

	@Bean
//	@ConditionalOnMissingClass(value = "org.apache.tomcat.jdbc.pool.DataSource")
    public ServerEndpointExporter serverEndpointExporter() 
	{
		return new ServerEndpointExporter();  
    }
	
	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry){
		registry.addEndpoint("/endpointWisely").setAllowedOrigins("*").withSockJS();
		System.out.println("112");
	}
	
	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry){
		registry.enableSimpleBroker("/topic");
	}
}
/**
 * 
 */
package com.vking.power.web.module.xuji.controller;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

import com.vking.power.web.module.xuji.pojo.WiselyMessage;
import com.vking.power.web.module.xuji.pojo.WiselyResponse;

@Controller
public class WsController
{
	@MessageMapping("/welcome")
	@SendTo("/topic/getResponse")
	public WiselyResponse say(WiselyMessage message) throws Exception {
		Thread.sleep(3000);
	    return new WiselyResponse("Welcome," + message.getName() + "!");
	}

}
/**
 * 
 */
package com.vking.power.web.module.xuji.pojo;

public class WiselyMessage
{
	private String name;
	
	public String getName(){
		return name;
	}
}
/**
 * 
 */
package com.vking.power.web.module.xuji.pojo;

public class WiselyResponse
{
	private String responseMessage;
	
	public WiselyResponse(String responseMessage){
		this.responseMessage = responseMessage;
	}
	
	public String getResponseMessage(){
		return responseMessage;
	}
}
/**
 * 
 */
package com.vking.power.web.module.xuji.service;

import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

@Service
public class TestJsonDataService
{

	@Value("classpath:/static/xujiTest/warnInfo.json")
	private Resource warnInfo;
	
	public String getWarmJson(){
		try
		{
			return IOUtils.toString(warnInfo.getInputStream(), Charset.forName("UTF-8"));
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		return null;
	}
}
<!DOCTYPE html>
  <html xmlns:th="http://www.michenggw.com/">
	  <head>
		<meta charset="UTF-8" />
		  <title>Spring Boot+WebSocket+广播式</title>
	</head>
	  <body οnlοad="disconnect()">
		  <noscript>
			<h2 style="color: #ff0000">貌似你的浏览器不支持websocket</h2>
		</noscript>
		  <div>
			  <div>
				  <button id="connect">连接</button>
				  <button id="disconnect" disabled="disabled">断开连接</button>
			</div>
			  <div id="conversationDiv">
				  <label>输入你的名字</label>www.furggw.com <input type="text" id="name" />
				  <button id="sendName">发送</button>
				  <p id="response"></p>
			</div>
		</div>
		<script src="../static/js/jquery-1.8.3.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="../static/js/sockjs.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="../static/js/stomp.min.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
		
		
			$(function(){
				console.log("测试一下")
				
			})
			var stompClient = null;

			function setConnected(connected) {
				document.getElementById('connect').disabled = connected;
				document.getElementById('disconnect').disabled = !connected;
				document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
				$('#response').html();
			}

			$("#connect").on("click", function(){
				connect();
			});
			
			$("#disconnect").on("click", function(){
				disconnect();
			});
			
			$("#sendName").on("click", function(){
				sendName();
			});
			
			
			
			function connect() {
				console.log("测试一下2222")
				var socket = new SockJS('http://localhost:10004/lead/endpointWisely'); //1
				stompClient = Stomp.over(socket);
				stompClient.connect({}, function(frame) {
					setConnected(true);
					console.log('Connected: ' + frame);
					stompClient.subscribe('/topic/getResponse', function(respnose) { //2
						showResponse(JSON.parse(respnose.body).responseMessage);
					});
				});
			}

			function disconnect() {
				if (stompClient != null) {
					stompClient.disconnect();
				}
				setConnected(false);
				console.log("Disconnected");
			}

			function sendName() {
				console.log("测试一下333")
				var name = $('#name').val();
				//3
				stompClient.send("/welcome", {}, JSON.stringify({
					'name': name
				}));
			}

			function showResponse(message) {
				var response = $("#response");
				response.html(message);
			}
		</script> 
	</body>
	  </html>

sockjs、sotmp资源下载路径:

链接:https://pan.baidu.com/s/15Gn9uJ1W7i9WgPrgIB1z7Q
提取码:oy34

### Flutter与Spring Boot通过WebSocket实现双向通信 #### 配置Spring Boot端的WebSocket支持 为了使Spring Boot应用程序能够处理WebSocket连接,需要创建一个配置类来设置消息代理和其他必要的参数[^1]。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); // 启用简单代理用于广播消息 config.setApplicationDestinationPrefixes("/app"); // 设置应用前缀 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").withSockJS(); // 注册STOMP终端并启用SockJS回退机制 } } ``` 此代码片段定义了一个`WebSocketConfig`类,它实现了`WebSocketMessageBrokerConfigurer`接口,并重写了两个方法:一个是用来配置消息代理以及指定哪些路径下的目的地应该被当作是客户端订阅的目的地;另一个则是注册了WebSocket端点以便前端可以建立连接。这里还启用了SockJS协议的支持,这允许浏览器即使在网络环境不理想的情况下也能维持稳定的连接[^2]。 #### 创建控制器以接收来自Flutter的消息并向其发送响应 为了让服务器能接收到从移动设备发出的信息并且做出回应,在服务端还需要编写相应的控制逻辑: ```java @Controller public class ChatController { @MessageMapping("/chat.sendMessage") @SendTo("/topic/messages") public Message sendMessage(@Payload Message message) throws Exception { Thread.sleep(1000); // 模拟延迟 return new Message(message.getFrom(), "Hello, " + message.getContent()); } static class Message{ private String from; private String content; // 构造函数、getter和setter省略... public Message(String from, String content){ this.from = from; this.content = content; } public String getFrom() { return from; } public String getContent() { return content; } } } ``` 上述代码展示了如何利用`@MessageMapping`注解映射特定目的地址上的入站消息到处理器的方法上,而`@SendTo`则指定了返回的数据应当推送给哪个频道中的所有已订阅者。在这个例子中,每当有新消息到达时都会触发一次回复操作,模拟了一种简单的聊天室功能[^3]。 #### 在Flutter侧集成WebSocketClient库并与后端交互 对于移动端而言,则要借助于第三方包如`web_socket_channel`来进行网络层面上的操作。下面是一个简化版的例子说明怎样初始化通道对象并通过它收发数据流: ```dart import 'package:flutter/material.dart'; import 'package:web_socket_channel/io.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { final channel = IOWebSocketChannel.connect('ws://localhost:8080/ws'); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('WebSocket Demo')), body: Center(child: StreamBuilder( stream: channel.stream, builder: (context, snapshot) { if(snapshot.hasData && !snapshot.hasError && snapshot.data != null){ return Text("${snapshot.data}"); }else{ return const CircularProgressIndicator(); } }, )), floatingActionButton: FloatingActionButton( onPressed: (){ channel.sink.add("Hello Server!"); }, child: Icon(Icons.send), ), ) ); } @dispose(){ channel.sink.close(); } } ``` 这段Dart程序构建了一个小型的应用界面,其中包含了一个按钮用于向远端发送字符串形式的消息,还有一个区域显示由服务器传回来的内容。当按下浮动按钮的时候就会调用`sink.add()`方法把信息写入输出缓冲区从而触发改变事件传播给对方监听器。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值