WebSocket+String

来源:互联网 发布:飞行器结构优化设计 编辑:程序博客网 时间:2024/05/16 17:10

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@EnableWebSocketpublic 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-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://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 onclick="send()">发送消息</button>    <hr/>    <buttononclick="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中的文本框输入内容,点击发送消息,看另一个浏览器中是否会有相应变化呢,如果有变化,那么就成功了