package com.mytest.processor;
import com.alibaba.fastjson.JSONObject;
import com.mytest.protocol.ChatDecoder;
import com.mytest.protocol.ChatEncoder;
import com.mytest.protocol.ChatMessage;
import com.mytest.protocol.ChatType;
import io.netty.channel.Channel;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.AttributeKey;
import io.netty.util.concurrent.GlobalEventExecutor;
public class ChatMessageProcessor {
//记录在线用户
private static ChannelGroup onlineUsers = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
//定义一些扩展属性
private final AttributeKey<String> NICK_NAME = AttributeKey.valueOf("nickName");
private final AttributeKey<String> IP_ADDR = AttributeKey.valueOf("ipAddr");
private final AttributeKey<JSONObject> ATTRS = AttributeKey.valueOf("attrs");
//解码器
private ChatDecoder decoder = new ChatDecoder();
//编码器
private ChatEncoder encoder = new ChatEncoder();
/**
* 获取用户昵称
*
* @param client
* @return
*/
public String getNickName(Channel client) {
return client.attr(NICK_NAME).get();
}
/**
* 获取用户远程IP地址
*
* @param client
* @return
*/
public String getAddress(Channel client) {
return client.remoteAddress().toString().replaceFirst("/", "");
}
/**
* 获取扩展属性
*
* @param client
* @return
*/
public JSONObject getAttrs(Channel client) {
try {
return client.attr(ATTRS).get();
} catch (Exception e) {
return null;
}
}
/**
* 设置扩展属性
*
* @param client
* @return
*/
private void setAttrs(Channel client, String key, Object value) {
try {
JSONObject json = client.attr(ATTRS).get();
json.put(key, value);
client.attr(ATTRS).set(json);
} catch (Exception e) {
JSONObject json = new JSONObject();
json.put(key, value);
client.attr(ATTRS).set(json);
}
}
/**
* 登录退出通知
*
* @param client
*/
public void logout(Channel client) {
if (getNickName(client) == null) {
return;
}
for (Channel channel : onlineUsers) {
ChatMessage request = new ChatMessage(ChatType.SYSTEM.getName(), sysTime(), onlineUsers.size(), getNickName(client) + "离开");
String content = encoder.encode(request);
channel.writeAndFlush(new TextWebSocketFrame(content));
}
onlineUsers.remove(client);
}
/**
* 发送消息
*
* @param client
* @param msg
*/
public void sendMsg(Channel client, ChatMessage msg) {
sendMsg(client, encoder.encode(msg));
}
/**
* 发送消息
*
* @param client
* @param msg
*/
public void sendMsg(Channel client, String msg) {
ChatMessage request = decoder.decode(msg);
if (null == request) {
return;
}
String addr = getAddress(client);
//登录消息
if (request.getCmd().equals(ChatType.LOGIN.getName())) {
client.attr(NICK_NAME).getAndSet(request.getSender());
client.attr(IP_ADDR).getAndSet(addr);
onlineUsers.add(client);
for (Channel channel : onlineUsers) {
if (channel != client) {
request = new ChatMessage(ChatType.SYSTEM.getName(), sysTime(), onlineUsers.size(), getNickName(client) + "加入");
} else {
request = new ChatMessage(ChatType.SYSTEM.getName(), sysTime(), onlineUsers.size(), "已与服务器建立连接!");
}
String content = encoder.encode(request);
//把数据通过websocket协议写到浏览器
channel.writeAndFlush(new TextWebSocketFrame(content));
}
//聊天消息
} else if (request.getCmd().equals(ChatType.CHAT.getName())) {
for (Channel channel : onlineUsers) {
if (channel == client) {
request.setSender("你");
} else {
request.setSender(getNickName(client));
}
request.setTime(sysTime());
String content = encoder.encode(request);
channel.writeAndFlush(new TextWebSocketFrame(content));
}
//送鲜花消息
} else if (request.getCmd().equals(ChatType.FLOWER.getName())) {
JSONObject attrs = getAttrs(client);
long currTime = sysTime();
if (null != attrs) {
long lastTime = attrs.getLongValue("lastFlowerTime");
//10秒之内不允许重复刷鲜花
int secends = 10;
long sub = currTime - lastTime;
if (sub < 1000 * secends) {
request.setSender("你");
request.setCmd(ChatType.SYSTEM.getName());
request.setContent("送鲜花太频繁了, " + (secends - Math.round(sub / 1000)) + "秒后再试.");
String content = encoder.encode(request);
client.writeAndFlush(new TextWebSocketFrame(content));
return;
}
}
//正常送花
for (Channel channel : onlineUsers) {
if (channel == client) {
request.setSender("你");
request.setContent("你给大家送了一波鲜花雨");
setAttrs(client, "lastFlowerTime", currTime);
} else {
request.setSender(getNickName(client));
request.setContent(getNickName(client) + "送来一波鲜花雨");
}
request.setTime(sysTime());
String content = encoder.encode(request);
channel.writeAndFlush(new TextWebSocketFrame(content));
}
}
}
/**
* 获取系统时间
*
* @return
*/
private Long sysTime() {
return System.currentTimeMillis();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
nettybishuai-chat.zip
共311个文件
gif:260个
xml:14个
class:9个
需积分: 5 0 下载量 55 浏览量
2023-09-22
10:20:37
上传
评论
收藏 1.2MB ZIP 举报
温馨提示
nettybishuai-chat.zip
资源推荐
资源详情
资源评论
收起资源包目录
nettybishuai-chat.zip (311个子文件)
ChatMessageProcessor.class 6KB
HttpHandler.class 6KB
ChatDecoder.class 4KB
WebSocktHandler.class 3KB
ChatMessage.class 3KB
ChatServer.class 2KB
ChatEncoder.class 2KB
ChatServer$1.class 2KB
ChatType.class 2KB
style.css 21KB
style.css 21KB
65.gif 13KB
65.gif 13KB
17.gif 8KB
17.gif 8KB
18.gif 8KB
18.gif 8KB
11.gif 8KB
11.gif 8KB
30.gif 7KB
30.gif 7KB
72.gif 6KB
72.gif 6KB
93.gif 5KB
93.gif 5KB
69.gif 5KB
69.gif 5KB
79.gif 5KB
79.gif 5KB
8.gif 5KB
8.gif 5KB
28.gif 5KB
28.gif 5KB
68.gif 5KB
68.gif 5KB
42.gif 4KB
42.gif 4KB
31.gif 4KB
31.gif 4KB
66.gif 4KB
66.gif 4KB
14.gif 4KB
14.gif 4KB
25.gif 4KB
25.gif 4KB
7.gif 4KB
7.gif 4KB
10.gif 4KB
10.gif 4KB
70.gif 4KB
70.gif 4KB
74.gif 4KB
74.gif 4KB
46.gif 4KB
46.gif 4KB
61.gif 4KB
61.gif 4KB
85.gif 3KB
85.gif 3KB
9.gif 3KB
9.gif 3KB
27.gif 3KB
27.gif 3KB
64.gif 3KB
64.gif 3KB
130.gif 3KB
130.gif 3KB
6.gif 3KB
6.gif 3KB
63.gif 3KB
63.gif 3KB
73.gif 3KB
73.gif 3KB
21.gif 3KB
21.gif 3KB
91.gif 3KB
91.gif 3KB
115.gif 3KB
115.gif 3KB
114.gif 3KB
114.gif 3KB
53.gif 3KB
53.gif 3KB
48.gif 3KB
48.gif 3KB
26.gif 3KB
26.gif 3KB
80.gif 3KB
80.gif 3KB
38.gif 3KB
38.gif 3KB
47.gif 2KB
47.gif 2KB
24.gif 2KB
24.gif 2KB
97.gif 2KB
97.gif 2KB
78.gif 2KB
78.gif 2KB
77.gif 2KB
共 311 条
- 1
- 2
- 3
- 4
资源评论
奉先节度使
- 粉丝: 190
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功