用JavaEE7、Websockets和GlassFish4打造聊天室(一)(1)
分享于 点击 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的部分:
- <properties>
- <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <dependencies>
- <dependency>
- <groupId>javax</groupId>
- <artifactId>javaee-api</artifactId>
- <version>7.0</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- <compilerArguments>
- <endorseddirs>${endorsed.dir}</endorseddirs>
- </compilerArguments>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <failOnMissingWebXml>false</failOnMissingWebXml>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.6</version>
- [..]
- </plugin>
- </plugins>
- </build>
同时,为了能使用GlassFish 4,需要增加如下的插件:
- plugin>
- <groupId>org.glassfish.embedded</groupId>
- <artifactId>maven-embedded-glassfish-plugin</artifactId>
- <version>4.0</version>
- <configuration>
- <goalPrefix>embedded-glassfish</goalPrefix>
- <app>${basedir}/target/${project.artifactId}-${project.version}.war</app>
- <autoDelete>true</autoDelete>
- <port>8080</port>
- <name>${project.artifactId}</name>
- <contextRoot>hascode</contextRoot>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>deploy</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
设置Websocket的Endpoint
我们先来看服务端Websocket的代码如下,然后再做进一步解析:
- package com.hascode.tutorial;
- import java.io.IOException;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.websocket.EncodeException;
- import javax.websocket.OnMessage;
- import javax.websocket.OnOpen;
- import javax.websocket.Session;
- import javax.websocket.server.PathParam;
- import javax.websocket.server.ServerEndpoint;
- @ServerEndpoint(value = "/chat/{room}", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
- public class ChatEndpoint {
- private final Logger log = Logger.getLogger(getClass().getName());
- @OnOpen
- public void open(final Session session, @PathParam("room") final String room) {
- log.info("session openend and bound to room: " + room);
- session.getUserProperties().put("room", room);
- }
- @OnMessage
- public void onMessage(final Session session, final ChatMessage chatMessage) {
- String room = (String) session.getUserProperties().get("room");
- try {
- for (Session s : session.getOpenSessions()) {
- if (s.isOpen()
- && room.equals(s.getUserProperties().get("room"))) {
- s.getBasicRemote().sendObject(chatMessage);
- }
- }
- } catch (IOException | EncodeException e) {
- log.log(Level.WARNING, "onMessage failed", e);
- }
- }
- }
用户点评