如何搭建SpringWebSocket以及搭建中一些常到的问题

来源:互联网 发布:java三大框架要学多久 编辑:程序博客网 时间:2024/06/03 13:43

第一步:

         我们需要配置一下web.xml文件:

           <servlet>
                         <servlet-name>dispatcherServlet</servlet-name>
                         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                         <init-param>
                              <param-name>ContextConfigLocation</param-name>
                              <param-value>classpath:springmvc.xml</param-value>
                        </init-param>
                              <load-on-startup>1</load-on-startup>//web容器启动边加载配置
                       <async-supported>true</async-supported>//异步处理
             </servlet>
             <servlet-mapping>
                      <servlet-name>dispatcherServlet</servlet-name>
                    <url-pattern>/</url-pattern>
            </servlet-mapping>


第二步:

            我们需要配置一下springmvc.xml文件:我先这个我就不多说了,你都学到这里了,相信spring这些也都很熟悉了

               <context:component-scan base-package="com.helei.config"/>
 
                       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                       <property name="prefix" value="/webapp/WEB-INF/page"/>
                         <property name="suffix" value=".jsp"></property>
                      </bean>

                <mvc:annotation-driven/>//是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用。
                <mvc:default-servlet-handler/>//就是将我们的静态资源交给servlet容器处理


第三步:

        来写我们的SpringwebSocket的配置类需要实现WebSocketConfigurer这个接口

             

                @Configuration //指明该类为Spring 配置类,相当于beans
               @EnableWebSocket // 声明该类支持WebSocket
               public class springSocketConfig implements WebSocketConfigurer {
                          public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
                                 //在这里我们要注册WebSocket Server 的实现类,这就好比 ServerApplicationConfig,让spring的得到webSocket操作对象
                                //第一个参数是我们要注册的操作对象,第二个参数是我们访问的地址,也就是类似于之前 serverEndpoint("/helei")
                                //接下来一个是增加一个拦截器,可以再我们之前做一些过滤处理
                                         registry.addHandler(webSocketEndpoint(), "/text").
                                         addInterceptors(handShakeIntercepter()).setAllowedOrigins("http://localhost:8080");//这里呢是有权限设定,如果你很困扰,如若遇到权限问题,你就                                            不要setAllowedOrigins,获取你就成功了,倒是后再来加上这句,反复测试,加深理解
  
                                         registry.addHandler(webSocketEndpoint(), "/sockjs/helei").
                                         addInterceptors(handShakeIntercepter()).withSockJS();
                                       }
 
                                         /**
                                           * 得到webSocket操作对象
                                           * @return
                                           */
                                       @Bean
                                        public WebSocketEndpoint webSocketEndpoint()
                                         {
                                                    return new WebSocketEndpoint();
                                         }
 
                                        @Bean
                                          public HandShakeIntercepter handShakeIntercepter()
                                        {
                                                  return new HandShakeIntercepter();
                                        }
 
                      }

第四步:

                如果你想搞个拦截器,哈哈,看这里,我们需要继承一个HttpSessionHandshakeInterceptor这个类

               

                      //这个类当继承 HttpSessionHandshakeInterceptor 就可以再wensocket握手前或者后,做一些相关操作
                               public class HandShakeIntercepter extends HttpSessionHandshakeInterceptor  {
                     //握手之前
                  @Override
                  public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                       Map<String, Object> attributes) throws Exception {
                // TODO Auto-generated method stub
                 //这个参数是request, response,wsHandler
                   //WebSocketHandler这个接口还实现了很多的操作的抽象子类,该对象提供了客户端连接,关闭,错误,发送等方法,重写这几个方法即可实现自定义业务逻辑
                  //Map<String, Object> attributes  装有webSocketSession设置的属性
                  System.out.println("握手之前");
                 return super.beforeHandshake(request, response, wsHandler, attributes);
  
  
          }
 
                //握手之后
                @Override
                 public void afterHandshake(ServerHttpRequest serverhttprequest, ServerHttpResponse serverhttpresponse,
                   WebSocketHandler websockethandler, Exception exception) {
                   // TODO Auto-generated method stub
                    System.out.println("握手之后");
                    super.afterHandshake(serverhttprequest, serverhttpresponse, websockethandler, exception);
 
                        }
 
           }

第五步:
           接下来这个类就是我们的消息操作,一个c/s之间通过WebSocket进行信息交流那么我们需要继承TextWebSocketHandler这个类
           
//这个类继承TextWebSocketHandler类之后,可以用来处理客户端传来的请求并做相应的处理
public class WebSocketEndpoint extends TextWebSocketHandler {
  //然后重写父类方法handlerTextMessage(),每当客户端发送信息过来,都会由这个函数接收并处理。
 //在这里还可以实现消息发送,点对点发送等功能    WebSocketSession session会话   textmessage传递过来的信息
  @Override
  protected void handleTextMessage(WebSocketSession websocketsession, TextMessage textmessage) throws Exception {
   // TODO Auto-generated method stub
   
   TextMessage returnMessage=new TextMessage(textmessage.getPayload()+"服务器接收到来自客户端的信息");
   System.out.println(returnMessage.toString());
   super.handleTextMessage(websocketsession, textmessage);
  }
  @Override
  public void afterConnectionEstablished(WebSocketSession websocketsession) throws Exception {
   // TODO Auto-generated method stub
   //在这里我们可以创建一个顺序集合来装纳我们的session 会话
   System.out.println("开启WebSocket"+websocketsession.getRemoteAddress().toString());
   super.afterConnectionEstablished(websocketsession);
  }
  
  @Override
  public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
   // TODO Auto-generated method stub
   System.out.println("连接关闭"+session.getRemoteAddress().toString());
   super.afterConnectionClosed(session, status);
  }
  
  @Override
  public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
   // TODO Auto-generated method stub
   System.out.println(message.getPayload());
   TextMessage msg=new TextMessage(message.getPayload()+"服务器收到信息");
   session.sendMessage(msg);
   super.handleMessage(session, message);
  }
  
  @Override
  public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
   // TODO Auto-generated method stub
   if(session.isOpen())
   {
    session.close();
   }
   System.out.println(exception.toString());
   System.out.println("webSocket连接异常");
   super.handleTransportError(session, exception);
  }
  
  @Override
  public boolean supportsPartialMessages() {
   // TODO Auto-generated method stub
   return false;
  }
 
}
这个有带你多哈,其实你也不用重写太多,就handleMessage那个就可以了,我相信,你看得懂

第六步:
           
           哎,写的好辛苦,终于到了界面了:这个我就截图了,注意点看,我怕打字,我会累瘫了,嘻嘻
      
           

由于截图,感想有些地方截图截取重复了,多担待点哈。有什么地方需要指正的欢迎多多留言,让我也一起学习。

接下来就是运行的结果图:

       


阅读全文
0 0
原创粉丝点击