1.0
This commit is contained in:
24
旧的java项目/itcast/server/session/Group.java
Normal file
24
旧的java项目/itcast/server/session/Group.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
@Data
|
||||
/**
|
||||
* 聊天组,即聊天室
|
||||
*/
|
||||
public class Group {
|
||||
// 聊天室名称
|
||||
private String name;
|
||||
// 聊天室成员
|
||||
private Set<String> members;
|
||||
|
||||
public static final Group EMPTY_GROUP = new Group("empty", Collections.emptySet());
|
||||
|
||||
public Group(String name, Set<String> members) {
|
||||
this.name = name;
|
||||
this.members = members;
|
||||
}
|
||||
}
|
||||
57
旧的java项目/itcast/server/session/GroupSession.java
Normal file
57
旧的java项目/itcast/server/session/GroupSession.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 聊天组会话管理接口
|
||||
*/
|
||||
public interface GroupSession {
|
||||
|
||||
/**
|
||||
* 创建一个聊天组, 如果不存在才能创建成功, 否则返回 null
|
||||
* @param name 组名
|
||||
* @param members 成员
|
||||
* @return 成功时返回组对象, 失败返回 null
|
||||
*/
|
||||
Group createGroup(String name, Set<String> members);
|
||||
|
||||
/**
|
||||
* 加入聊天组
|
||||
* @param name 组名
|
||||
* @param member 成员名
|
||||
* @return 如果组不存在返回 null, 否则返回组对象
|
||||
*/
|
||||
Group joinMember(String name, String member);
|
||||
|
||||
/**
|
||||
* 移除组成员
|
||||
* @param name 组名
|
||||
* @param member 成员名
|
||||
* @return 如果组不存在返回 null, 否则返回组对象
|
||||
*/
|
||||
Group removeMember(String name, String member);
|
||||
|
||||
/**
|
||||
* 移除聊天组
|
||||
* @param name 组名
|
||||
* @return 如果组不存在返回 null, 否则返回组对象
|
||||
*/
|
||||
Group removeGroup(String name);
|
||||
|
||||
/**
|
||||
* 获取组成员
|
||||
* @param name 组名
|
||||
* @return 成员集合, 没有成员会返回 empty set
|
||||
*/
|
||||
Set<String> getMembers(String name);
|
||||
|
||||
/**
|
||||
* 获取组成员的 channel 集合, 只有在线的 channel 才会返回
|
||||
* @param name 组名
|
||||
* @return 成员 channel 集合
|
||||
*/
|
||||
List<Channel> getMembersChannel(String name);
|
||||
}
|
||||
10
旧的java项目/itcast/server/session/GroupSessionFactory.java
Normal file
10
旧的java项目/itcast/server/session/GroupSessionFactory.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
public abstract class GroupSessionFactory {
|
||||
|
||||
private static GroupSession session = new GroupSessionMemoryImpl();
|
||||
|
||||
public static GroupSession getGroupSession() {
|
||||
return session;
|
||||
}
|
||||
}
|
||||
55
旧的java项目/itcast/server/session/GroupSessionMemoryImpl.java
Normal file
55
旧的java项目/itcast/server/session/GroupSessionMemoryImpl.java
Normal file
@@ -0,0 +1,55 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class GroupSessionMemoryImpl implements GroupSession {
|
||||
private final Map<String, Group> groupMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public Group createGroup(String name, Set<String> members) {
|
||||
Group group = new Group(name, members);
|
||||
return groupMap.putIfAbsent(name, group);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Group joinMember(String name, String member) {
|
||||
return groupMap.computeIfPresent(name, (key, value) -> {
|
||||
// value.getMembers().add(member);
|
||||
return value;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Group removeMember(String name, String member) {
|
||||
return groupMap.computeIfPresent(name, (key, value) -> {
|
||||
// value.getMembers().remove(member);
|
||||
return value;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Group removeGroup(String name) {
|
||||
return groupMap.remove(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getMembers(String name) {
|
||||
// return groupMap.getOrDefault(name, Group.EMPTY_GROUP).getMembers();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Channel> getMembersChannel(String name) {
|
||||
return getMembers(name).stream()
|
||||
.map(member -> SessionFactory.getSession().getChannel(member))
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
46
旧的java项目/itcast/server/session/Session.java
Normal file
46
旧的java项目/itcast/server/session/Session.java
Normal file
@@ -0,0 +1,46 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
/**
|
||||
* 会话管理接口
|
||||
*/
|
||||
public interface Session {
|
||||
|
||||
/**
|
||||
* 绑定会话
|
||||
* @param channel 哪个 channel 要绑定会话
|
||||
* @param username 会话绑定用户
|
||||
*/
|
||||
void bind(Channel channel, String username);
|
||||
|
||||
/**
|
||||
* 解绑会话
|
||||
* @param channel 哪个 channel 要解绑会话
|
||||
*/
|
||||
void unbind(Channel channel);
|
||||
|
||||
/**
|
||||
* 获取属性
|
||||
* @param channel 哪个 channel
|
||||
* @param name 属性名
|
||||
* @return 属性值
|
||||
*/
|
||||
Object getAttribute(Channel channel, String name);
|
||||
|
||||
/**
|
||||
* 设置属性
|
||||
* @param channel 哪个 channel
|
||||
* @param name 属性名
|
||||
* @param value 属性值
|
||||
*/
|
||||
void setAttribute(Channel channel, String name, Object value);
|
||||
|
||||
/**
|
||||
* 根据用户名获取 channel
|
||||
* @param username 用户名
|
||||
* @return channel
|
||||
*/
|
||||
Channel getChannel(String username);
|
||||
}
|
||||
10
旧的java项目/itcast/server/session/SessionFactory.java
Normal file
10
旧的java项目/itcast/server/session/SessionFactory.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
public abstract class SessionFactory {
|
||||
|
||||
private static Session session = new SessionMemoryImpl();
|
||||
|
||||
public static Session getSession() {
|
||||
return session;
|
||||
}
|
||||
}
|
||||
47
旧的java项目/itcast/server/session/SessionMemoryImpl.java
Normal file
47
旧的java项目/itcast/server/session/SessionMemoryImpl.java
Normal file
@@ -0,0 +1,47 @@
|
||||
package cn.itcast.server.session;
|
||||
|
||||
import io.netty.channel.Channel;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class SessionMemoryImpl implements Session {
|
||||
|
||||
private final Map<String, Channel> usernameChannelMap = new ConcurrentHashMap<>();
|
||||
private final Map<Channel, String> channelUsernameMap = new ConcurrentHashMap<>();
|
||||
private final Map<Channel,Map<String,Object>> channelAttributesMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public void bind(Channel channel, String username) {
|
||||
usernameChannelMap.put(username, channel);
|
||||
channelUsernameMap.put(channel, username);
|
||||
channelAttributesMap.put(channel, new ConcurrentHashMap<>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unbind(Channel channel) {
|
||||
String username = channelUsernameMap.remove(channel);
|
||||
usernameChannelMap.remove(username);
|
||||
channelAttributesMap.remove(channel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getAttribute(Channel channel, String name) {
|
||||
return channelAttributesMap.get(channel).get(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAttribute(Channel channel, String name, Object value) {
|
||||
channelAttributesMap.get(channel).put(name, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Channel getChannel(String username) {
|
||||
return usernameChannelMap.get(username);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return usernameChannelMap.toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user