WebSocket+String

WebSocket+String

 

1、  新建一个maven项目

 

2、  修改pom.xml,完整的pom.xml如下:

<projectxmlns="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.0http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>my</groupId>
 <artifactId>WebSocket_String_test1</artifactId>
 <packaging>war</packaging>
 <version>0.0.1-SNAPSHOT</version>
  <name>WebSocket_String_test1 MavenWebapp</name>
 <url>http://maven.apache.org</url>
 <properties>
      <spring-version>4.2.5.RELEASE</spring-version>
      <hibernate-version>4.3.0</hibernate-version>
      <project-build-encode>UTF-8</project-build-encode>
      <jackson-version>2.8.3</jackson-version>
 </properties>
 
 <dependencies>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <scope>test</scope>
   </dependency>
   <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
   </dependency>
 
   <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.3</version>
   </dependency>
 
   <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
   </dependency>
   <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
   </dependency>
   <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
   </dependency>
   <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
   </dependency>
   <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.6</version>
   </dependency>
   <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging-api</artifactId>
            <version>1.1</version>
   </dependency>
   <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
             <version>3.2.1</version>
         </dependency>
         <dependency>
             <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
             <version>1.4</version>
         </dependency>
   <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
   </dependency>
   <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
   </dependency>
   <dependency>
            <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
             <version>1.7.12</version>
         </dependency>
   <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.4.1.RELEASE</version>
   </dependency>
   <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>1.6.1.RELEASE</version>
   </dependency>
 
         <!--Spring 配置 -->
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring-version}</version>
   </dependency>
   <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>4.2.5.RELEASE</version>
   </dependency>
   <!--spring websocket-->
   <dependency>
        <groupId>org.springframework</groupId>
       <artifactId>spring-websocket</artifactId>
            <version>4.2.5.RELEASE</version>
   </dependency>
    
   <dependency>
            <groupId>antlr</groupId>
            <artifactId>antlr</artifactId>
            <version>2.7.7</version>
   </dependency>
   <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
   </dependency>
   <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.7.4</version>
   </dependency>
   <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
   </dependency>
   <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
   </dependency>
   <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
   </dependency>
   <dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>4.0.2.Final</version>
   </dependency>
   <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.5.Final</version>
   </dependency>
   <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.2.5.Final</version>
   </dependency>
   <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.0.Final</version>
   </dependency>
   <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
   </dependency>
   <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.15.0-GA</version>
   </dependency>
   <dependency>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
            <version>3.1.0.GA</version>
   </dependency>
   <dependency>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.1_spec</artifactId>
            <version>1.0.1.Final</version>
   </dependency>
   <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.12</version>
   </dependency>
   <!-- 要把这个注释掉与 Spring websocket冲突
   <dependency>
            <groupId>javax</groupId>
             <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
   </dependency>
    -->
 </dependencies>
 <build>
   <finalName>MySocket</finalName>
   <!-- 编译的时候使用JDK7和UTF8编码 ,-->
   <plugins>
            <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.1</version>
                      <configuration>
                               <source>1.8</source>
                               <target>1.8</target>
                               <encoding>UTF-8</encoding>
                      </configuration>
            </plugin>
           
            <!-- 编译jar包 -->
            <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-jar-plugin</artifactId>
                      <configuration>
                               <archive>
                                        <addMavenDescriptor>false</addMavenDescriptor>
                                        <manifest>
                                                  <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                                  <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                                        </manifest>
                               </archive>
                      </configuration>
            </plugin>
            </plugins>
 </build>
</project>

3、  在src/main/java目录下,新建一个mytest包

 

4、  在mytest包中创建ChatWebSocketHandler.java,代码如下:

package mytest;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import org.springframework.web.socket.CloseStatus;
importorg.springframework.web.socket.TextMessage;
importorg.springframework.web.socket.WebSocketSession;
importorg.springframework.web.socket.handler.TextWebSocketHandler;
 
public class ChatWebSocketHandlerextends TextWebSocketHandler{
   
         privatefinal static List<WebSocketSession> sessions =Collections.synchronizedList(new ArrayList<WebSocketSession>());
   //接收文本消息,并发送出去
   @Override
   protected void handleTextMessage(WebSocketSession session, TextMessagemessage) throws Exception {
        super.handleTextMessage(session,message);
       
        sendMessageToUsers(session, message);//发送所有人
   }
   //连接建立后处理
   @SuppressWarnings("unchecked")
   @Override
   public void afterConnectionEstablished(WebSocketSession session) throwsException {
        System.out.println("connect to thewebsocket chat success......");
        sessions.add(session);
        //处理离线消息
   }
   //抛出异常时处理
   @Override
   public void handleTransportError(WebSocketSession session, Throwableexception) throws Exception {
        if(session.isOpen()){
            session.close();
        }
        System.out.println("websocket chatconnection closed......");
        sessions.remove(session);
   }
   //连接关闭后处理
   @Override
   public void afterConnectionClosed(WebSocketSession session, CloseStatuscloseStatus) throws Exception {
        System.out.println("websocket chatconnection closed......");
        sessions.remove(session);
   }
 
   @Override
   public boolean supportsPartialMessages() {
        return false;
   }
   
         //发送消息方法
      private voidsendMessageToUsers(WebSocketSession session,
                        TextMessagemessage) throws IOException {
                //循环在线会话,发送消息
               for (WebSocketSessionitemSession : sessions) {
                        if(itemSession.isOpen()) {
                                  itemSession.sendMessage(message);
                        }
               }
              
      }
}


5、  在mytest包中创建WebSocketHandshakeInterceptor.java,代码如下:

package mytest;
 
import java.util.Map;
 
import javax.servlet.http.HttpSession;
 
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
 
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
 
private static final String SESSION_NAME ="username";
private String userName;
    @Override
    public boolean beforeHandshake(ServerHttpRequestrequest, ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes) throws Exception {
        if (request instanceofServletServerHttpRequest) {
        HttpSessionsession = ((ServletServerHttpRequest)request).getServletRequest().getSession();
        userName= (String) session.getAttribute(SESSION_NAME);
               if(userName == null) {
                        userName= "访客" + session.getId() ;
                        session.setAttribute(SESSION_NAME,userName);
               }
           attributes.put("username",userName);
        }
        return true;
    }
 
    @Override
    public voidafterHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Exception exception) {
 
    }
}


 

6、  在mytest包中创建WebSocketConfig.java,代码如下:

package mytest;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
 
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implementsWebSocketConfigurer {
    @Override
    public voidregisterWebSocketHandlers(WebSocketHandlerRegistry registry) {
        //允许连接的域,只能以http或https开头
    //   String[] allowsOrigins = {"http://www.xxx.com"};
        String[] allowsOrigins ={"*"};
       
       //WebIM WebSocket通道
       registry.addHandler(chatWebSocketHandler(),"/webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor());
       registry.addHandler(chatWebSocketHandler(),"/sockjs/webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS();
    }
    @Bean
    public ChatWebSocketHandlerchatWebSocketHandler() {
        return new ChatWebSocketHandler();
    }
    @Bean
    public WebSocketHandshakeInterceptormyInterceptor(){
        return newWebSocketHandshakeInterceptor();
    }
}


 

7、  在src/main/resources中,创建spring-mvc.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:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
           http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
           http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd
           http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
   
        <!--会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,
    位spring MVC的注解提供支持 。 -->
    <mvc:annotation-driven />
   
    <context:component-scanbase-package="mytest"/>
 
         <!--静态资源访问(不拦截此目录下的东西的访问) --> 
    <mvc:resourceslocation="/imgs/" mapping="/imgs/**" /> 
   
</beans>

8、  配置web.xml,全部代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"version="2.5">
 
  <display-name>Archetype Created WebApplication</display-name>
 
  <servlet>
        <servlet-name>webserver</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
                 <param-name>contextConfigLocation</param-name>
                 <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
        <servlet-name>webserver</servlet-name>
        <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

 

9、  修改index.jsp,全部代码如下:

<%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Inserttitle here</title>
</head>
<body>
Welcome<br/><input id="text"type="text"/>
    <button οnclick="send()">发送消息</button>
    <hr/>
    <buttonοnclick="closeWebSocket()">关闭WebSocket连接</button>
    <hr/>
    <divid="message"></div>
<script type="text/javascript">
    varwebsocket = null;
    //判断当前浏览器是否支持WebSocket
    if('WebSocket' in window) {
       websocket = newWebSocket("ws://localhost:8088/WebSocket_String_test1/webSocketIMServer");
    }
    else{
       alert('当前浏览器 Not support websocket')
    }
    //连接发生错误的回调方法
   websocket.onerror = function () {
             //需要部署在Tomcat7.0.47以上的版本才能运行
        setMessageInnerHTML("WebSocket连接发生错误");
    };
    //连接成功建立的回调方法
   websocket.onopen = function () {
       setMessageInnerHTML("WebSocket连接成功");
    }
    //接收到消息的回调方法
   websocket.onmessage = function (event) {
       setMessageInnerHTML(event.data);
    }
    //连接关闭的回调方法
   websocket.onclose = function () {
       setMessageInnerHTML("WebSocket连接关闭");
    }
    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
   window.onbeforeunload = function () {
       closeWebSocket();
    }
    //将消息显示在网页上
   function setMessageInnerHTML(innerHTML) {
       document.getElementById('message').innerHTML += innerHTML +'<br/>';
    }
    //关闭WebSocket连接
   function closeWebSocket() {
       websocket.close();
    }
    //发送消息
   function send() {
       var message = document.getElementById('text').value;
       websocket.send(message);
    }
</script>
</body>
</html>

 

10、最后进行测试,打开两个浏览器,分别访问这个index.jsp,在其中一个jsp中的文本框输入内容,点击发送消息,看另一个浏览器中是否会有相应变化呢,如果有变化,那么就成功了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值