欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

用JavaEE7、Websockets和GlassFish4打造聊天室(一)(1)

来源: javaer 分享于  点击 26437 次 点评:56

用JavaEE7、Websockets和GlassFish4打造聊天室(一)(1)


Java EE 7已经在今年正式发布了,新增加了很多新的功能和特性,如新增或更新了不少的JSR标准。其中特别受到关注的是Websockets。它的一个好处之一是减少了不必要的网络流量。它主要是用于在客户机和服务器之间建立单一的双向连接。这意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端则可以在等待这个时间继续去做其他工作,整个过程是异步的。在本系列教程中,将指导用户如何在JAVA EE 7的容器GlassFish 4中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及综合运用jQuery和Bootstrap。本文要求读者有一定的HTML 5 Websocket的基础原理知识。

效果图

我们先来看下在完成这个教程后的效果图,如下所示:

准备工作

我们使用的是JDK 7 和MAVN 3进行库的构建工作,首先看pom.xml中关于Jave EE 7的部分:

  1.  <properties> 
  2.     <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir> 
  3.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
  4. </properties> 
  5.   
  6. <dependencies> 
  7.     <dependency> 
  8.         <groupId>javax</groupId> 
  9.         <artifactId>javaee-api</artifactId> 
  10.         <version>7.0</version> 
  11.         <scope>provided</scope> 
  12.     </dependency> 
  13. </dependencies> 
  14.   
  15. <build> 
  16.     <plugins> 
  17.         <plugin> 
  18.             <groupId>org.apache.maven.plugins</groupId> 
  19.             <artifactId>maven-compiler-plugin</artifactId> 
  20.             <version>3.1</version> 
  21.             <configuration> 
  22.                 <source>1.7</source> 
  23.                 <target>1.7</target> 
  24.                 <compilerArguments> 
  25.                     <endorseddirs>${endorsed.dir}</endorseddirs> 
  26.                 </compilerArguments> 
  27.             </configuration> 
  28.         </plugin> 
  29.         <plugin> 
  30.             <groupId>org.apache.maven.plugins</groupId> 
  31.             <artifactId>maven-war-plugin</artifactId> 
  32.             <version>2.3</version> 
  33.             <configuration> 
  34.                 <failOnMissingWebXml>false</failOnMissingWebXml> 
  35.             </configuration> 
  36.         </plugin> 
  37.         <plugin> 
  38.             <groupId>org.apache.maven.plugins</groupId> 
  39.             <artifactId>maven-dependency-plugin</artifactId> 
  40.             <version>2.6</version> 
  41.             [..] 
  42.         </plugin> 
  43.     </plugins> 
  44. </build> 

同时,为了能使用GlassFish 4,需要增加如下的插件:

  1. plugin> 
  2.     <groupId>org.glassfish.embedded</groupId> 
  3.     <artifactId>maven-embedded-glassfish-plugin</artifactId> 
  4.     <version>4.0</version> 
  5.     <configuration> 
  6.         <goalPrefix>embedded-glassfish</goalPrefix> 
  7.         <app>${basedir}/target/${project.artifactId}-${project.version}.war</app> 
  8.         <autoDelete>true</autoDelete> 
  9.         <port>8080</port> 
  10.         <name>${project.artifactId}</name> 
  11.         <contextRoot>hascode</contextRoot> 
  12.     </configuration> 
  13.     <executions> 
  14.         <execution> 
  15.             <goals> 
  16.                 <goal>deploy</goal> 
  17.             </goals> 
  18.         </execution> 
  19.     </executions> 
  20. </plugin> 

设置Websocket的Endpoint

我们先来看服务端Websocket的代码如下,然后再做进一步解析:

  1. package com.hascode.tutorial; 
  2.   
  3. import java.io.IOException; 
  4. import java.util.logging.Level; 
  5. import java.util.logging.Logger; 
  6.   
  7. import javax.websocket.EncodeException; 
  8. import javax.websocket.OnMessage; 
  9. import javax.websocket.OnOpen; 
  10. import javax.websocket.Session; 
  11. import javax.websocket.server.PathParam; 
  12. import javax.websocket.server.ServerEndpoint; 
  13.   
  14. @ServerEndpoint(value = "/chat/{room}", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class
  15. public class ChatEndpoint { 
  16.     private final Logger log = Logger.getLogger(getClass().getName()); 
  17.   
  18.     @OnOpen 
  19.     public void open(final Session session, @PathParam("room"final String room) { 
  20.         log.info("session openend and bound to room: " + room); 
  21.         session.getUserProperties().put("room", room); 
  22.     } 
  23.   
  24.     @OnMessage 
  25.     public void onMessage(final Session session, final ChatMessage chatMessage) { 
  26.         String room = (String) session.getUserProperties().get("room"); 
  27.         try { 
  28.             for (Session s : session.getOpenSessions()) { 
  29.                 if (s.isOpen() 
  30.                         && room.equals(s.getUserProperties().get("room"))) { 
  31.                     s.getBasicRemote().sendObject(chatMessage); 
  32.                 } 
  33.             } 
  34.         } catch (IOException | EncodeException e) { 
  35.             log.log(Level.WARNING, "onMessage failed", e); 
  36.         } 
  37.     } 


相关栏目:

用户点评