文档章节

spring-websocket使用方法

wankaiming
 wankaiming
发布于 2017/04/06 16:14
字数 587
阅读 153
收藏 0

1.pom.xml加入依赖包

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-websocket</artifactId>
	<version>${spring.version}</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-messaging</artifactId>
	<version>${spring.version}</version>
</dependency>

2.配置web.xml

<servlet>
	<servlet-name>rest</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
	<async-supported>true</async-supported>  <!-- 加入这一行 -->
</servlet>
<filter>
	<filter-name>encodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
	<async-supported>true</async-supported> <!-- 加入这一行 -->
</filter>

3.配置websocket

@Configuration
@EnableWebMvc
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		//这句表示在topic和user这两个域上可以向客户端发消息
		config.enableSimpleBroker("/topic", "/user");
		//这句表示给指定用户发送(一对一)的主题前缀是“/user/”
		config.setUserDestinationPrefix("/user");
	}

	@Override
	public void registerStompEndpoints(StompEndpointRegistry registry) {
		//这个和客户端创建连接时的url有关
		registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS();
	}

}

4.建立一个消息dto

public class MessageDto implements Serializable{
	
	private static final long serialVersionUID = -4953803885944191487L;
	
	private Date time;

	private Integer code;
	
	private String msg;

	public Date getTime() {
		return time;
	}

	public void setTime(Date time) {
		this.time = time;
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}
}

5.测试消息发送的地址

@RestController
@RequestMapping(value = "/test")
public class TestRest {
	
    @Autowired
    private SimpMessageSendingOperations simpMessageSendingOperations;
	
	/**
	 * 测试消息发送
	 * @return
	 */
    @NotNeedOauth
    @RequestMapping(value = "/pub",method = RequestMethod.GET)
    public Object praiseBeingList(){
    	
    	MessageDto msg_1 = new MessageDto();
    	msg_1.setTime(new Date());
    	msg_1.setCode(0);
    	msg_1.setMsg("点对点");
    	simpMessageSendingOperations.convertAndSendToUser("1", "/message", msg_1); //一对一发送,发送特定的客户端  
    	
    	MessageDto msg = new MessageDto();
    	msg.setTime(new Date());
    	msg.setCode(0);
    	msg.setMsg("广播");
    	simpMessageSendingOperations.convertAndSend("/topic/broadcast",msg); //广播  
    	

        Map<String,Object>  resultMap = new HashMap<>();
        resultMap.put("code","ok");
        return resultMap;
    }

}

6.前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <title>Hello WebSocket</title>
    <script src="http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>
    <script src="http://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script>
    <script src="http://cdn.bootcss.com/jquery/1.8.1/jquery.min.js"></script>
    <script type="text/javascript">
        var stompClient = null;
		
        function setConnected(connected) {
        	$("#connect").attr("disabled",connected);
        	$("#disconnect").attr("disabled",!connected);
        	$("#conversationDiv").css('visibility',connected ? 'visible' : 'hidden');
            $("#response").html("");
        }

        function connect() {
            var userid = 1;
            var socket = new SockJS("http://localhost:8080/websocket");
            stompClient = Stomp.over(socket);
            stompClient.connect({}, function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/broadcast', function(data){
                    console.log(data);
                    $("#response").text(data.body);
                });
               
                stompClient.subscribe('/user/' + userid + '/message',function(data){
                	console.log(data);
                	$("#response").text(data.body);
                });
            });
        }

        function disconnect() {
            if (stompClient != null) {
                stompClient.disconnect();
            }
            setConnected(false);
            console.log("Disconnected");
        }
        
    </script>
</head>
<body>
<div>
    <div>
        <button id="connect" onclick="connect();">Connect</button>
        <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
    </div>
    <div id="conversationDiv">
        <p id="response"></p>
    </div>
</div>
</body>
</html>

7.先点击Connect按钮,建立websocket连接,然后访问http://localhost:8080/test/pub发布消息出来,这样页面就可以收到消息了

备注:如果用nginx作为前置代理,nginx 的 location需要加入下面的配置

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

© 著作权归作者所有

共有 人打赏支持
wankaiming

wankaiming

粉丝 72
博文 226
码字总数 60574
作品 0
广州
高级程序员
私信 提问
spring boot整合Websocket笔记

特别说明:自学笔记 使用websocket有两种方式: 使用sockjs, 使用h5的标准。 使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法。 1、pom.xml中添加如下: 核心是@ServerEndpoint...

jackcooper2015
2017/12/28
0
0
Yeauty/netty-websocket-spring-boot-starter

netty-websocket-spring-boot-starter 中文文档 About netty-websocket-spring-boot-starter will help you develop WebSocket server by using Netty in spring-boot,it is easy to develop......

Yeauty
09/24
0
0
实时通信技术之websocket

本文章即从4个方面带大家了解websocket: websocket是什么? 为什么需要 WebSocket ? websocket的优点与缺点? websocket的相关使用(客户端与服务器端)? websocket的相关协议与规范? 一...

一看就喷亏的小猿
11/03
0
0
Spring消息之WebSocket

一、WebSocket简介 WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议。在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Socket一样。 WebSocket 的由来...

jmcui
05/06
0
0
spring-boot框架下的websocket服务

这几天在做web端实时展示服务端日志文件新增内容的功能。要满足实时的需求,我选择的方案是在web端跟服务端建立一个websocket链接,由服务端通过tail -f 命令将文件新增内容发送给web端。 关...

lilugoodjob
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

不可不说的Java“锁”事

前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点...

美团技术团队
22分钟前
1
0
ali oss util demo

package com.example.demo;import com.aliyun.oss.OSSClient;import com.aliyun.oss.common.utils.BinaryUtil;import com.aliyun.oss.model.*;import org.slf4j.Logger;import o......

经常把天聊死的胖子
23分钟前
1
0
Windows系统中eclipse修改字体为Courier New

背景:在eclipse修改字体时没有找到Courier New字体; 解决: 1.在计算机地址栏上输入“C:\Windows\Fonts”路径,回车打开Win10字体文件夹。查看是否有Courier New字体;如下图: 2.如果有该...

anlve
24分钟前
1
0
使用hexo做博客网站

hexo有什么用? hexo 可以把md文件生成html静态网页。 hexo官网:https://hexo.io/zh-cn/ 本地安装hexo。 npm install -g hexo-cli#生成blog(名字任意)文件夹,并且在这个文件夹里面初始化...

王坤charlie
24分钟前
2
0
RabbitMQ+PHP 教程四(Routing)用yii2测试通过

开始 在本教程中,我们将为它添加一个特性——我们将只可能订阅消息的一个子集。例如,我们只能够将关键错误消息直接指向日志文件(以节省磁盘空间),同时仍然能够打印控制台上的所有日志消...

hansonwong
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部