首页 > 学院 > 开发设计 > 正文

springboot+websocket+sockjs进行消息推送

2019-11-14 10:56:26
字体:
来源:转载
供稿:网友

一,消息推送的服务端

1.创建简单的sPRingboot工程。pom配置如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>org.springframework</groupId>    <artifactId>gs-messaging-stomp-websocket</artifactId>    <version>0.1.0</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.4.2.RELEASE</version>    </parent>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>            <exclusions>                <exclusion>                    <groupId>org.springframework.boot</groupId>                    <artifactId>spring-boot-starter-tomcat</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-jetty</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-websocket</artifactId>           <exclusions>                <exclusion>                    <groupId>org.springframework.boot</groupId>                    <artifactId>spring-boot-starter-web</artifactId>                </exclusion>            </exclusions>         </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>webjars-locator</artifactId>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>sockjs-client</artifactId>            <version>1.0.2</version>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>stomp-websocket</artifactId>            <version>2.3.3</version>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>bootstrap</artifactId>            <version>3.3.7</version>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>jquery</artifactId>            <version>3.1.0</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-actuator</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>    <properties>        <java.version>1.8</java.version>    </properties>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>去掉了默认的tomcat,采用jetty

2.采用stomp消息格式,定义接收的消息和发送的消息bean

客户端发送的消息

package hello;public class Greeting {    private String content;    public Greeting() {    }    public Greeting(String content) {        this.content = content;    }    public String getContent() {        return content;    }}服务器发送给客户端的消息

package hello;public class HelloMessage {    private String name;    public HelloMessage() {    }    public HelloMessage(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}3,消息处理handler

package hello;import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.messaging.handler.annotation.SendTo;import org.springframework.stereotype.Controller;@Controllerpublic class GreetingController {    @MessageMapping("/hello")    @SendTo("/topic/greetings")    public Greeting greeting(HelloMessage message) throws Exception {        Thread.sleep(1000); // simulated delay        return new Greeting("Hello, " + message.getName() + "!");    }}

4对websocket类进行配置

package hello;import org.springframework.context.annotation.Configuration;import org.springframework.messaging.simp.config.MessageBrokerRegistry;import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;import org.springframework.web.socket.config.annotation.StompEndpointRegistry;@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {    @Override    public void configureMessageBroker(MessageBrokerRegistry config) {        config.enableSimpleBroker("/topic");        config.setapplicationDestinationPrefixes("/app");    }    @Override    public void registerStompEndpoints(StompEndpointRegistry registry) {        registry.addEndpoint("/gs-guide-websocket").withSockJS();    }}

创建客户端app.js和index.html

app.js文件如下:

var stompClient = null;function setConnected(connected) {    $("#connect").prop("disabled", connected);    $("#disconnect").prop("disabled", !connected);    if (connected) {        $("#conversation").show();    }    else {        $("#conversation").hide();    }    $("#greetings").html("");}function connect() {    var socket = new SockJS('/gs-guide-websocket');    stompClient = Stomp.over(socket);    stompClient.connect({}, function (frame) {        setConnected(true);        console.log('Connected: ' + frame);        stompClient.subscribe('/topic/greetings', function (greeting) {            showGreeting(JSON.parse(greeting.body).content);        });    });}function disconnect() {    if (stompClient != null) {        stompClient.disconnect();    }    setConnected(false);    console.log("Disconnected");}function sendName() {    stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));}function showGreeting(message) {    $("#greetings").append("<tr><td>" + message + "</td></tr>");}$(function () {    $("form").on('submit', function (e) {        e.preventDefault();    });    $( "#connect" ).click(function() { connect(); });    $( "#disconnect" ).click(function() { disconnect(); });    $( "#send" ).click(function() { sendName(); });});

点解connect即与服务器建立连接,在输入框输入任何消息,点击send,发送给服务器,会获得服务器的响应,

三、服务器主动发消息给客户端

服务器主动发消息给客户端通过

最后,服务器主动发消息给客户端

通过SimpleMessagingTemplate类实现

@RestControllerpublic%20class%20TestController%20{%20%20%20%20@Autowired%20%20%20%20private%20SimpMessagingTemplate%20template;%20%20%20%20@RequestMapping(value%20=%20"/test",method%20=%20RequestMethod.GET)%20%20%20%20public%20String%20test(){%20%20%20%20%20%20%20%20template.convertAndSend("/topic/greetings",new%20Greeting("hello"));%20%20%20%20%20%20%20%20return%20"hello";%20%20%20%20}}

调用http://localhost:8080/test,会看到消息发给了客户端

以上就是对springboot服务端进行消息推送的大致介绍。不过目前似乎消息推送系统go或nodejs版本很流行。nodejs+socketio. java服务端可以调用消息推送系统接口实现
消息发送到客户端。欢迎讨论。O(∩_∩)O~


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表