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

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

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

面分析下上面的代码:

使用@ ServerEndpoint定义一个新的endpoint,其中的值指定了URL并且可以使用PathParams参数,就象在JAX-RS中的用法一样。

所以值“/chat/{room}”允许用户通过如下形式的URL去连接某个聊天室:ws://0.0.0.0:8080/hascode/chat/java

在大括号中的值即room),可以通过使用javax.websocket.server.PathParam,在endpoint的生命周期回调方法中以参数的方式注入。

此外,我们要使用一个编码和解码的类,因为我们使用的是一个DTO形式的类,用于在服务端和客户端传送数据。

当用户第一次连接到服务端,输入要进入聊天室的房号,则这个房号以参数的方式注入提交,并且使用session.getUserProperties将值保存在用户的属性map中。

当一个聊天参与者通过tcp连接发送信息到服务端,则循环遍历所有已打开的session,每个session被绑定到指定的聊天室中,并且接收编码和解码的信息。

如果我们想发送简单的文本信息或和二进制格式的信息,则可以使用session.getBasicRemote().sendBinary() 或session.getBasicRemote().sendText()

接下来我们看下用于代表信息传递实体(DTO:Data Transfer Object)的代码,如下:

  1. package com.hascode.tutorial; 
  2.   
  3. import java.util.Date; 
  4.   
  5. public class ChatMessage { 
  6.     private String message; 
  7.     private String sender; 
  8.     private Date received; 
  9.   
  10.     // 其他getter,setter方法 

聊天消息的转换

在这个应用中,将编写一个编码和解码类,用于在聊天信息和JSON格式间进行转换。

先来看下解码类的实现,这将会把传递到服务端的聊天信息转换为ChatMessage实体类。在这里,使用的是Java API for JSON Processing(JSR353)参考:

http://jcp.org/en/jsr/detail?id=353)规范去将JSON格式的信息转换为实体类,代码如下,其中重写的willDecode方法,这里默认返回为true。

  1. package com.hascode.tutorial; 
  2.   
  3. import java.io.StringReader; 
  4. import java.util.Date; 
  5.   
  6. import javax.json.Json; 
  7. import javax.json.JsonObject; 
  8. import javax.websocket.DecodeException; 
  9. import javax.websocket.Decoder; 
  10. import javax.websocket.EndpointConfig; 
  11.   
  12. public class ChatMessageDecoder implements Decoder.Text<ChatMessage> { 
  13.     @Override 
  14.     public void init(final EndpointConfig config) { 
  15.     } 
  16.   
  17.     @Override 
  18.     public void destroy() { 
  19.     } 
  20.   
  21.     @Override 
  22.     public ChatMessage decode(final String textMessage) throws DecodeException { 
  23.         ChatMessage chatMessage = new ChatMessage(); 
  24.         JsonObject obj = Json.createReader(new StringReader(textMessage)) 
  25.                 .readObject(); 
  26.         chatMessage.setMessage(obj.getString("message")); 
  27.         chatMessage.setSender(obj.getString("sender")); 
  28.         chatMessage.setReceived(new Date()); 
  29.         return chatMessage; 
  30.     } 
  31.   
  32.     @Override 
  33.     public boolean willDecode(final String s) { 
  34.         return true
  35.     } 

同样再看下编码类的代码,这个类相反,是将ChatMessage类转换为Json格式,代码如下:

  1. package com.hascode.tutorial; 
  2.   
  3. import javax.json.Json; 
  4. import javax.websocket.EncodeException; 
  5. import javax.websocket.Encoder; 
  6. import javax.websocket.EndpointConfig; 
  7.   
  8. public class ChatMessageEncoder implements Encoder.Text<ChatMessage> { 
  9.     @Override 
  10.     public void init(final EndpointConfig config) { 
  11.     } 
  12.   
  13.     @Override 
  14.     public void destroy() { 
  15.     } 
  16.   
  17.     @Override 
  18.     public String encode(final ChatMessage chatMessage) throws EncodeException { 
  19.         return Json.createObjectBuilder() 
  20.                 .add("message", chatMessage.getMessage()) 
  21.                 .add("sender", chatMessage.getSender()) 
  22.                 .add("received", chatMessage.getReceived().toString()).build() 
  23.                 .toString(); 
  24.     } 

这里可以看到JSR-353的强大威力,只需要调用Json.createObjectBuilder就可以轻易把一个DTO对象转化为JSON了。


相关栏目:

用户点评