diff --git a/net.html b/net.html index f3536cbc7..c4411b67d 100644 --- a/net.html +++ b/net.html @@ -163,6 +163,56 @@ <servlets path="/pipes" autoload="true"/> </server>
如上, 配置了/pipes 前缀后,客户端发送Servlet请求需带上前缀,请求当前用户信息的url就变成:/pipes/user/myinfo 。
+@WebServlet("/ws/chat")
+public class ChatWebSocketServlet extends WebSocketServlet {
+
+ @Resource //[RedKale内置资源]
+ protected JsonConvert jsonConvert;
+
+ @Resource
+ private UserService userService;
+
+ @Override
+ protected WebSocket createWebSocket() {
+
+ return new WebSocket() {
+
+ private UserInfo user;
+
+ @Override
+ public void onMessage(String text) { // text 接收的格式: {"receiveid":200000001, "content":"Hi Redkale!"}
+ final ChatMessage message = jsonConvert.convertFrom(ChatMessage.class, text); //获取给对方的消息体信息
+ message.sendid = user.getUserid(); //将当前用户设为消息的发送方
+ message.sendtime = System.currentTimeMillis(); //设置消息发送时间
+ //给接收方发送消息, 即使接收方在其他WebSocket进程节点上有链接,RedKale也会自动发送到其他链接进程节点上。
+ super.sendEachMessage(message.receiveid, jsonConvert.convertTo(message));
+ }
+
+ @Override
+ protected Serializable createGroupid() { //以用户ID作为WebSocketGroup的groupid
+ this.user = userService.current(String.valueOf(super.getSessionid()));
+ return this.user == null ? null : this.user.getUserid();
+ }
+
+ @Override
+ public Serializable onOpen(HttpRequest request) {
+ return request.getSessionid(false); //以request中的sessionid字符串作为WebSocket的sessionid
+ }
+
+ };
+ }
+
+ public static class ChatMessage {
+
+ public int sendid; //发送方用户ID
+
+ public int receiveid; //接收方用户ID
+
+ public String content; //文本消息内容
+
+ public long sendtime; //消息发送时间
+ }
+}. HttpRequest 对象
public class HttpRequest {