提交 5bb26392 编写于 作者: GreyZeng's avatar GreyZeng

update chat app

上级 afe7bfc0
package snippet.chat;
package chat;
import java.util.UUID;
......
package snippet.chat;
package chat;
import chat.protocol.Attributes;
import chat.protocol.Session;
import io.netty.channel.Channel;
import io.netty.channel.group.ChannelGroup;
import snippet.chat.protocol.Attributes;
import snippet.chat.protocol.Session;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
......
package snippet.chat.client;
package chat.client;
import chat.protocol.CreateGroupResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.CreateGroupResponsePacket;
public class CreateGroupResponseHandler extends SimpleChannelInboundHandler<CreateGroupResponsePacket> {
......
package snippet.chat.client;
package chat.client;
import chat.protocol.GroupMessageResponsePacket;
import chat.protocol.Session;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.GroupMessageResponsePacket;
import snippet.chat.protocol.Session;
public class GroupMessageResponseHandler extends SimpleChannelInboundHandler<GroupMessageResponsePacket> {
@Override
......
package snippet.chat.client;
package chat.client;
import chat.protocol.HeartBeatRequestPacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import snippet.chat.protocol.HeartBeatRequestPacket;
import java.util.concurrent.TimeUnit;
......
package snippet.chat.client;
package chat.client;
import chat.protocol.JoinGroupResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.JoinGroupResponsePacket;
public class JoinGroupResponseHandler extends SimpleChannelInboundHandler<JoinGroupResponsePacket> {
@Override
......
package snippet.chat.client;
package chat.client;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
......
package snippet.chat.client;
package chat.client;
import io.netty.channel.ChannelHandler;
import chat.protocol.ListGroupMembersResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import snippet.chat.protocol.ListGroupMembersResponsePacket;
public class ListGroupMembersResponseHandler extends SimpleChannelInboundHandler<ListGroupMembersResponsePacket> {
......
package snippet.chat.client;
package chat.client;
import chat.SessionUtil;
import chat.protocol.LoginResponsePacket;
import chat.protocol.Session;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.LoginResponsePacket;
import snippet.chat.protocol.Session;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.client;
package chat.client;
import chat.SessionUtil;
import chat.protocol.LogoutResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.LogoutResponsePacket;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.client;
package chat.client;
import chat.protocol.MessageResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.MessageResponsePacket;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.client;
package chat.client;
import chat.SessionUtil;
import chat.protocol.ConsoleCommandManager;
import chat.protocol.LoginConsoleCommand;
import chat.protocol.PacketDecoder;
import chat.protocol.PacketEncoder;
import chat.protocol.Splitter;
import chat.server.IMIdleStateHandler;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
......@@ -8,22 +15,17 @@ import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.ConsoleCommandManager;
import snippet.chat.protocol.LoginConsoleCommand;
import snippet.chat.protocol.PacketDecoder;
import snippet.chat.protocol.PacketEncoder;
import snippet.chat.protocol.Splitter;
import snippet.chat.server.IMIdleStateHandler;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
/**
* 客户端
*
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/15
* @since
* @since 1.8
*/
public class NettyClient {
private static final int MAX_RETRY = 5;
......
package snippet.chat.client;
package chat.client;
import chat.protocol.QuitGroupResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.QuitGroupResponsePacket;
public class QuitGroupResponseHandler extends SimpleChannelInboundHandler<QuitGroupResponsePacket> {
@Override
......
package snippet.chat.protocol;
package chat.protocol;
import io.netty.util.AttributeKey;
......
package snippet.chat.protocol;
package chat.protocol;
public interface Command {
Byte LOGIN_REQUEST = 1;
......
package snippet.chat.protocol;
package chat.protocol;
import io.netty.channel.Channel;
......
package snippet.chat.protocol;
package chat.protocol;
import io.netty.channel.Channel;
import java.util.Arrays;
import java.util.Scanner;
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import java.util.List;
import static snippet.chat.protocol.Command.CREATE_GROUP_REQUEST;
import static chat.protocol.Command.CREATE_GROUP_REQUEST;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import java.util.List;
import static snippet.chat.protocol.Command.CREATE_GROUP_RESPONSE;
import static chat.protocol.Command.CREATE_GROUP_RESPONSE;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import lombok.NoArgsConstructor;
import static snippet.chat.protocol.Command.GROUP_MESSAGE_REQUEST;
import static chat.protocol.Command.GROUP_MESSAGE_REQUEST;
@Data
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.GROUP_MESSAGE_RESPONSE;
import static chat.protocol.Command.GROUP_MESSAGE_RESPONSE;
@Data
public class GroupMessageResponsePacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import static snippet.chat.protocol.Command.HEARTBEAT_REQUEST;
import static chat.protocol.Command.HEARTBEAT_REQUEST;
/**
* 心跳包格式
......
package snippet.chat.protocol;
package chat.protocol;
import static snippet.chat.protocol.Command.HEARTBEAT_RESPONSE;
import static chat.protocol.Command.HEARTBEAT_RESPONSE;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.JOIN_GROUP_REQUEST;
import static chat.protocol.Command.JOIN_GROUP_REQUEST;
@Data
public class JoinGroupRequestPacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import snippet.chat.protocol.Packet;
import static snippet.chat.protocol.Command.JOIN_GROUP_RESPONSE;
import static chat.protocol.Command.JOIN_GROUP_RESPONSE;
@Data
public class JoinGroupResponsePacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.LIST_GROUP_MEMBERS_REQUEST;
import static chat.protocol.Command.LIST_GROUP_MEMBERS_REQUEST;
@Data
public class ListGroupMembersRequestPacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import java.util.List;
import static snippet.chat.protocol.Command.LIST_GROUP_MEMBERS_RESPONSE;
import static chat.protocol.Command.LIST_GROUP_MEMBERS_RESPONSE;
@Data
public class ListGroupMembersResponsePacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.LOGIN_REQUEST;
import static chat.protocol.Command.LOGIN_REQUEST;
@Data
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.LOGIN_RESPONSE;
import static chat.protocol.Command.LOGIN_RESPONSE;
@Data
public class LoginResponsePacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.LOGOUT_REQUEST;
import static chat.protocol.Command.LOGOUT_REQUEST;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.LOGOUT_RESPONSE;
import static chat.protocol.Command.LOGOUT_RESPONSE;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import lombok.NoArgsConstructor;
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import lombok.Data;
import static snippet.chat.protocol.Command.MESSAGE_RESPONSE;
import static chat.protocol.Command.MESSAGE_RESPONSE;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.protocol;
package chat.protocol;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
......
package snippet.chat.protocol;
package chat.protocol;
import chat.serialize.JSONSerializer;
import chat.serialize.Serializer;
import io.netty.buffer.ByteBuf;
import snippet.chat.serialize.JSONSerializer;
import snippet.chat.serialize.Serializer;
import java.util.HashMap;
import java.util.Map;
import static snippet.chat.protocol.Command.CREATE_GROUP_REQUEST;
import static snippet.chat.protocol.Command.CREATE_GROUP_RESPONSE;
import static snippet.chat.protocol.Command.GROUP_MESSAGE_REQUEST;
import static snippet.chat.protocol.Command.GROUP_MESSAGE_RESPONSE;
import static snippet.chat.protocol.Command.HEARTBEAT_REQUEST;
import static snippet.chat.protocol.Command.HEARTBEAT_RESPONSE;
import static snippet.chat.protocol.Command.JOIN_GROUP_REQUEST;
import static snippet.chat.protocol.Command.JOIN_GROUP_RESPONSE;
import static snippet.chat.protocol.Command.LIST_GROUP_MEMBERS_REQUEST;
import static snippet.chat.protocol.Command.LIST_GROUP_MEMBERS_RESPONSE;
import static snippet.chat.protocol.Command.LOGIN_REQUEST;
import static snippet.chat.protocol.Command.LOGIN_RESPONSE;
import static snippet.chat.protocol.Command.LOGOUT_REQUEST;
import static snippet.chat.protocol.Command.LOGOUT_RESPONSE;
import static snippet.chat.protocol.Command.MESSAGE_REQUEST;
import static snippet.chat.protocol.Command.MESSAGE_RESPONSE;
import static snippet.chat.protocol.Command.QUIT_GROUP_REQUEST;
import static snippet.chat.protocol.Command.QUIT_GROUP_RESPONSE;
import static chat.protocol.Command.CREATE_GROUP_REQUEST;
import static chat.protocol.Command.CREATE_GROUP_RESPONSE;
import static chat.protocol.Command.GROUP_MESSAGE_REQUEST;
import static chat.protocol.Command.GROUP_MESSAGE_RESPONSE;
import static chat.protocol.Command.HEARTBEAT_REQUEST;
import static chat.protocol.Command.HEARTBEAT_RESPONSE;
import static chat.protocol.Command.JOIN_GROUP_REQUEST;
import static chat.protocol.Command.JOIN_GROUP_RESPONSE;
import static chat.protocol.Command.LIST_GROUP_MEMBERS_REQUEST;
import static chat.protocol.Command.LIST_GROUP_MEMBERS_RESPONSE;
import static chat.protocol.Command.LOGIN_REQUEST;
import static chat.protocol.Command.LOGIN_RESPONSE;
import static chat.protocol.Command.LOGOUT_REQUEST;
import static chat.protocol.Command.LOGOUT_RESPONSE;
import static chat.protocol.Command.MESSAGE_REQUEST;
import static chat.protocol.Command.MESSAGE_RESPONSE;
import static chat.protocol.Command.QUIT_GROUP_REQUEST;
import static chat.protocol.Command.QUIT_GROUP_RESPONSE;
public class PacketCodec {
......
package snippet.chat.protocol;
package chat.protocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.MessageToMessageDecoder;
import java.util.List;
......
package snippet.chat.protocol;
package chat.protocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.QUIT_GROUP_REQUEST;
import static chat.protocol.Command.QUIT_GROUP_REQUEST;
@Data
public class QuitGroupRequestPacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import static snippet.chat.protocol.Command.QUIT_GROUP_RESPONSE;
import static chat.protocol.Command.QUIT_GROUP_RESPONSE;
@Data
public class QuitGroupResponsePacket extends Packet {
......
package snippet.chat.protocol;
package chat.protocol;
import lombok.Data;
import lombok.NoArgsConstructor;
......
package snippet.chat.protocol;
package chat.protocol;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
......
package snippet.chat.serialize;
package chat.serialize;
import com.alibaba.fastjson.JSON;
......
package snippet.chat.serialize;
package chat.serialize;
public interface Serializer {
......
package snippet.chat.serialize;
package chat.serialize;
public interface SerializerAlogrithm {
/**
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import snippet.chat.SessionUtil;
/**
* 判断是否已经登录,如果已经登录,不需要继续执行这个 Handler
......
package snippet.chat.server;
package chat.server;
import chat.IDUtil;
import chat.SessionUtil;
import chat.protocol.CreateGroupRequestPacket;
import chat.protocol.CreateGroupResponsePacket;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import snippet.chat.IDUtil;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.CreateGroupRequestPacket;
import snippet.chat.protocol.CreateGroupResponsePacket;
import java.util.ArrayList;
import java.util.List;
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import chat.protocol.GroupMessageRequestPacket;
import chat.protocol.GroupMessageResponsePacket;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.GroupMessageRequestPacket;
import snippet.chat.protocol.GroupMessageResponsePacket;
@ChannelHandler.Sharable
public class GroupMessageRequestHandler extends SimpleChannelInboundHandler<GroupMessageRequestPacket> {
......
package snippet.chat.server;
package chat.server;
import chat.protocol.HeartBeatRequestPacket;
import chat.protocol.HeartBeatResponsePacket;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.HeartBeatRequestPacket;
import snippet.chat.protocol.HeartBeatResponsePacket;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.server;
package chat.server;
import chat.protocol.Packet;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.protocol.Packet;
import java.util.HashMap;
import java.util.Map;
import static snippet.chat.protocol.Command.CREATE_GROUP_REQUEST;
import static snippet.chat.protocol.Command.GROUP_MESSAGE_REQUEST;
import static snippet.chat.protocol.Command.JOIN_GROUP_REQUEST;
import static snippet.chat.protocol.Command.LIST_GROUP_MEMBERS_REQUEST;
import static snippet.chat.protocol.Command.LOGOUT_REQUEST;
import static snippet.chat.protocol.Command.MESSAGE_REQUEST;
import static snippet.chat.protocol.Command.QUIT_GROUP_REQUEST;
import static chat.protocol.Command.CREATE_GROUP_REQUEST;
import static chat.protocol.Command.GROUP_MESSAGE_REQUEST;
import static chat.protocol.Command.JOIN_GROUP_REQUEST;
import static chat.protocol.Command.LIST_GROUP_MEMBERS_REQUEST;
import static chat.protocol.Command.LOGOUT_REQUEST;
import static chat.protocol.Command.MESSAGE_REQUEST;
import static chat.protocol.Command.QUIT_GROUP_REQUEST;
/**
* Server 端根据不同的 Command 调用不同的 Handler 去处理请求
......
package snippet.chat.server;
package chat.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleStateEvent;
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import chat.protocol.JoinGroupRequestPacket;
import chat.protocol.JoinGroupResponsePacket;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.JoinGroupRequestPacket;
import snippet.chat.protocol.JoinGroupResponsePacket;
@ChannelHandler.Sharable
public class JoinGroupRequestHandler extends SimpleChannelInboundHandler<JoinGroupRequestPacket> {
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import chat.protocol.ListGroupMembersRequestPacket;
import chat.protocol.ListGroupMembersResponsePacket;
import chat.protocol.Session;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.ListGroupMembersRequestPacket;
import snippet.chat.protocol.ListGroupMembersResponsePacket;
import snippet.chat.protocol.Session;
import java.util.ArrayList;
import java.util.List;
......
package snippet.chat.server;
package chat.server;
import chat.IDUtil;
import chat.SessionUtil;
import chat.protocol.LoginRequestPacket;
import chat.protocol.LoginResponsePacket;
import chat.protocol.Session;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.IDUtil;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.LoginRequestPacket;
import snippet.chat.protocol.LoginResponsePacket;
import snippet.chat.protocol.Session;
import java.util.Date;
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import chat.protocol.LogoutRequestPacket;
import chat.protocol.LogoutResponsePacket;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.LogoutRequestPacket;
import snippet.chat.protocol.LogoutResponsePacket;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import chat.protocol.MessageRequestPacket;
import chat.protocol.MessageResponsePacket;
import chat.protocol.Session;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.MessageRequestPacket;
import snippet.chat.protocol.MessageResponsePacket;
import snippet.chat.protocol.Session;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
......
package snippet.chat.server;
package chat.server;
import chat.protocol.Splitter;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import snippet.chat.protocol.Splitter;
import java.util.Date;
......
package snippet.chat.server;
package chat.server;
import chat.protocol.Packet;
import chat.protocol.PacketCodec;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import snippet.chat.protocol.Packet;
import snippet.chat.protocol.PacketCodec;
import java.util.List;
......
package snippet.chat.server;
package chat.server;
import chat.SessionUtil;
import chat.protocol.QuitGroupRequestPacket;
import chat.protocol.QuitGroupResponsePacket;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import snippet.chat.SessionUtil;
import snippet.chat.protocol.QuitGroupRequestPacket;
import snippet.chat.protocol.QuitGroupResponsePacket;
@ChannelHandler.Sharable
public class QuitGroupRequestHandler extends SimpleChannelInboundHandler<QuitGroupRequestPacket> {
......
package snippet.chat.server.inbound;
package chat.server.inbound;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
......
package snippet.chat.server.inbound;
package chat.server.inbound;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
......
package snippet.chat.server.inbound;
package chat.server.inbound;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
......
package snippet.chat.server.outbound;
package chat.server.outbound;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
......
package snippet.chat.server.outbound;
package chat.server.outbound;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
......
package snippet.chat.server.outbound;
package chat.server.outbound;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册