文档章节

spring-websocket使用方法

wankaiming
 wankaiming
发布于 2017/04/06 16:14
字数 587
阅读 183
收藏 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
博文 227
码字总数 61416
作品 0
广州
高级程序员
私信 提问
spring boot整合Websocket笔记

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

jackcooper2015
2017/12/28
0
0
websocket:handlers 不起作用

@jack_jones 你好,想跟你请教个问题: 我在使用Spring websocket 时遇到了websocket:handlers不起作用, 其中Spring版本为4.1.6.RELEASE...

TreasureWe
2016/02/26
918
2
spring-boot-test测试时出现不能创建bean的问题

最近使用spring-boot写项目,集成了spring-boot-starter-websocket和spring-boot-starter-test; websocket配置如下 正常运行spring-boot时websocket不报错 但是使用单元测试的时候报错 去掉w...

bithup
2018/04/08
855
1
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
2018/09/24
0
0
实时通信技术之websocket

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

一看就喷亏的小猿
2018/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
2
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
4
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
3
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
3
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部