文档章节

websocket

流萤飘枫丶
 流萤飘枫丶
发布于 2017/05/27 17:09
字数 789
阅读 177
收藏 6

 1.1 服务注册

   服务注册分为两种模式:注解模式(推荐)、XML配置模式

  1.1.1 注解配置模式

Java代码 

/** 
 *  
 * @author Goma 
 * 
 */  
@Configuration  
@EnableWebSocket  
public class WebSocketConfig implements WebSocketConfigurer {  
  
    @Override  
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  
        registry.addHandler(myhandler(), "/websocket").addInterceptors(myInterceptors()).setAllowedOrigins("*");  
        registry.addHandler(myhandler(), "/sockjs/websocket").addInterceptors(myInterceptors()).withSockJS();  
    }  
  
    @Bean  
    public WebSocketHandler myhandler() {  
        return new WebsocketEndPoint();  
    }  
  
    @Bean  
    public HandshakeInterceptor myInterceptors() {  
        return new HandshakeInterceptor();  
    }  
}  

  注:该类需要放在SpringMVC扫描路径下

   @Configuration     指明该类为Spring 配置类

   @EnableWebSocket  声明该类支持WebSocket

 

registry.addHandler(myhandler(), "/websocket").addInterceptors(myInterceptors()).setAllowedOrigins("*");

   用来注册WebSocket Server实现类,第二个参数是访问WebSocket的地址

   注:setAllowedOrigins方法用来设置来自那些域名的请求可访问,默认为localhost

 

 

registry.addHandler(myhandler(), "/sockjs/websocket").addInterceptors(myInterceptors()).withSockJS();  

  允许客户端使用SockJS

 

 1.1.2 XML配置模式

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:context="http://www.springframework.org/schema/context"   
    xmlns:websocket="http://www.springframework.org/schema/websocket"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
                           http://www.springframework.org/schema/context  
                           http://www.springframework.org/schema/context/spring-context-4.0.xsd  
                           http://www.springframework.org/schema/websocket   
                           http://www.springframework.org/schema/websocket/spring-websocket.xsd">  

 

<bean id="websocket" class="com.camelot.lrpportal.web.webapp.controller.WebsocketEndPoint"/>  
<websocket:handlers>  
    <websocket:mapping path="/websocket" handler="websocket"/>  
    <websocket:handshake-interceptors>  
        <bean class="com.camelot.lrpportal.web.webapp.controller.HandshakeInterceptor"/>  
    </websocket:handshake-interceptors>  
</websocket:handlers>  

 1.2 服务端编写

 

public class WebsocketEndPoint extends TextWebSocketHandler {  
      
    private Logger logger = Logger.getLogger(getClass());  
      
    @Override  
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {  
          
        super.handleTextMessage(session, message);  
        logger.debug("GOMA === > WebSocketEndPoint.handlerTextMessage...");  
          
        TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");  
        session.sendMessage(returnMessage);  
          
    }  
}  

  这个类处理来之浏览器(客户端)的WebSocket请求。在这个例子中,我们创建一个叫WebSocketEndPoint的类,并让它集成TextWebsocketHandler类。然后重写父类方法handlerTextMessage(),每当客户端发送信息过来,都会由这个函数接收并处理。

 

  当然这里还可以重写其他方法,如afterConnectionEstablished、afterConnectionClosed、handleTransportError 等等

 

  扩展:这里可以将登录用户保存到对象中,然后可以实现点对点消息发送、发送所有用户等功能。

 

 

 1.3 握手拦截器

  WebSocket握手拦截器用来拦截和处理客户端和服务器端分别在握手前和握手后的事件,我们这里添加这个拦截器是为了清晰的知道什么时候以及是否握手成功。

 

public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {  
      
    private Logger logger = Logger.getLogger(getClass());  
      
    @Override  
    public boolean beforeHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Map<String, Object> attributes) throws Exception {  
        logger.debug("GOMA ===> Before Handshake");  
        return super.beforeHandshake(request, response, wsHandler, attributes);  
    }  
  
    @Override  
    public void afterHandshake(ServerHttpRequest request,  
            ServerHttpResponse response, WebSocketHandler wsHandler,  
            Exception ex) {  
        logger.debug("GOMA ===> After Handshake");  
        super.afterHandshake(request, response, wsHandler, ex);  
    }  
}  

 

 二、WebSocket 客户端配置

 

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="UTF-8">  
<title>Insert title here</title>  
  
  
  
<script type="text/javascript">  
        function setConnected(connected) {  
            document.getElementById('connect').disabled = connected;  
            document.getElementById('disconnect').disabled = !connected;  
            document.getElementById('response').innerHTML = '';  
        }  
  
        function connect() {  
            if ('WebSocket' in window){  
                  console.log('Websocket supported');  
                  socket = new WebSocket('ws://localhost:8080/lrpportal-web-webapp/websocket');  
  
                  console.log('Connection attempted');  
  
                  socket.onopen = function(){  
                       console.log('Connection open!');  
                       setConnected(true);  
                    }  
  
                  socket.onclose = function(){  
                      console.log('Disconnecting connection');  
                  }  
  
                  socket.onmessage = function (evt)   
                     {   
                        var received_msg = evt.data;  
                        console.log(received_msg);  
                        console.log('message received!');  
                        showMessage(received_msg);  
                     }  
  
                } else {  
                  console.log('Websocket not supported');  
                }  
        }  
  
        function disconnect() {  
            setConnected(false);  
            console.log("Disconnected");  
        }  
  
        function sendName() {  
            var message = document.getElementById('message').value;  
            socket.send(JSON.stringify({ 'message': message }));  
        }  
  
        function showMessage(message) {  
            var response = document.getElementById('response');  
            var p = document.createElement('p');  
            p.style.wordWrap = 'break-word';  
            p.appendChild(document.createTextNode(message));  
            response.appendChild(p);  
        }  
  
/*   
1. new WebSocket('ws://localhost:8080//websocket')尝试与服务器建立连接;  
2. 握手成功并建立连接后,socket.onopen被调用  
3. 当接收来自服务器的消息,socket.onmessage被调用  
4. socket.send()用来发送消息至服务端  
*/  
</script>  
</head>  
<body>  
  
<button id="connect" onclick="connect()">connect</button>  
<button id="disconnect" onclick="disconnect()"/>disconnect</button><br>  
<input id="message" value="send message"/>  
<button onclick="sendName()">发送消息</button>  
<div id="response"></div>  
</body>  
</html> 

 

© 著作权归作者所有

上一篇: jrebel
下一篇: git 操作
流萤飘枫丶
粉丝 12
博文 177
码字总数 107518
作品 0
成都
程序员
私信 提问

暂无文章

聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
4分钟前
0
0
Spring系列教程六:AOP详细讲解

AOP 概述 什么是 AOP AOP:全称是 Aspect Oriented Programming 即:面向切面编程。 AOP技术是对OOP技术的一种延伸,AOP是面向纵向,OOP是面向横向。简单的说它就是把我们程序重复的代码抽取...

我叫小糖主
17分钟前
5
0
Qt编写数据可视化大屏界面电子看板9-曲线效果

一、前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派、香橙派、全志H3、imx6)展示这么华...

飞扬青云
38分钟前
3
0
责任链模式

//这篇博客的博主真的不错,解析的都很清晰明了, https://blog.csdn.net/jason0539/article/details/45091639

南桥北木
今天
3
0
Flutter -------- dio网络请求

dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等... 1.添加依赖# dependencies: dio: 2.1.x #...

切切歆语
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部