提交 205a03f1 编写于 作者: GreyZeng's avatar GreyZeng

update

上级 28998eaf
package chat.client;
import chat.protocol.LoginRequestPacket;
import chat.protocol.LoginResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.Date;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class LoginResponseHandler extends SimpleChannelInboundHandler<LoginRequestPacket> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, LoginRequestPacket loginRequestPacket) {
System.out.println(new Date() + ": 收到客户端登录请求……");
LoginResponsePacket loginResponsePacket = new LoginResponsePacket();
loginResponsePacket.setVersion(loginRequestPacket.getVersion());
if (valid(loginRequestPacket)) {
loginResponsePacket.setSuccess(true);
System.out.println(new Date() + ": 登录成功!");
} else {
loginResponsePacket.setReason("账号密码校验失败");
loginResponsePacket.setSuccess(false);
System.out.println(new Date() + ": 登录失败!");
}
// 登录响应
ctx.channel().writeAndFlush(loginResponsePacket);
}
private boolean valid(LoginRequestPacket loginRequestPacket) {
return true;
}
}
\ No newline at end of file
package chat.client;
import chat.protocol.MessageResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.Date;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class MessageResponseHandler extends SimpleChannelInboundHandler<MessageResponsePacket> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, MessageResponsePacket messageResponsePacket) {
System.out.println(new Date() + ": 收到服务端的消息: " + messageResponsePacket.getMessage());
}
}
\ No newline at end of file
package chat.client;
import chat.LoginUtil;
import chat.client.ClientHandler;
import chat.protocol.LoginResponseHandler;
import chat.protocol.MessageRequestPacket;
import chat.protocol.MessageResponseHandler;
import chat.protocol.PacketCodeC;
import chat.protocol.PacketDecoder;
import chat.protocol.PacketEncoder;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
......
package chat.protocol;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class LoginRequestHandler implements ChannelHandler, EventExecutorGroup {
}
package chat.protocol;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class LoginResponseHandler implements ChannelHandler, EventExecutorGroup {
}
package chat.protocol;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class MessageRequestHandler implements ChannelHandler, EventExecutorGroup {
}
package chat.protocol;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class MessageResponseHandler implements ChannelHandler, EventExecutorGroup {
}
......@@ -34,6 +34,17 @@ public class PacketCodeC {
serializerMap.put(serializer.getSerializerAlogrithm(), serializer);
}
public void encode(ByteBuf byteBuf, Packet packet) {
// 2. 序列化 java 对象
byte[] bytes = Serializer.DEFAULT.serialize(packet);
// 3. 实际编码过程
byteBuf.writeInt(MAGIC_NUMBER);
byteBuf.writeByte(packet.getVersion());
byteBuf.writeByte(Serializer.DEFAULT.getSerializerAlogrithm());
byteBuf.writeByte(packet.getCommand());
byteBuf.writeInt(bytes.length);
byteBuf.writeBytes(bytes);
}
public ByteBuf encode(ByteBufAllocator byteBufAllocator, Packet packet) {
// 1. 创建 ByteBuf 对象
......@@ -54,25 +65,18 @@ public class PacketCodeC {
public Packet decode(ByteBuf byteBuf) {
// 跳过 magic number
byteBuf.skipBytes(4);
// 跳过版本号
byteBuf.skipBytes(1);
// 序列化算法
byte serializeAlgorithm = byteBuf.readByte();
// 指令
byte command = byteBuf.readByte();
// 数据包长度
int length = byteBuf.readInt();
byte[] bytes = new byte[length];
byteBuf.readBytes(bytes);
Class<? extends Packet> requestType = getRequestType(command);
Serializer serializer = getSerializer(serializeAlgorithm);
if (requestType != null && serializer != null) {
return serializer.deserialize(requestType, bytes);
}
......@@ -81,12 +85,10 @@ public class PacketCodeC {
}
private Serializer getSerializer(byte serializeAlgorithm) {
return serializerMap.get(serializeAlgorithm);
}
private Class<? extends Packet> getRequestType(byte command) {
return packetTypeMap.get(command);
}
}
package chat.protocol;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.util.List;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class PacketDecoder implements ChannelHandler, EventExecutorGroup {
public class PacketDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
out.add(PacketCodeC.INSTANCE.decode(in));
}
}
package chat.protocol;
import io.netty.channel.ChannelHandler;
import io.netty.util.concurrent.EventExecutorGroup;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class PacketEncoder implements ChannelHandler, EventExecutorGroup {
public class PacketEncoder extends MessageToByteEncoder<Packet> {
@Override
protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception {
PacketCodeC.INSTANCE.encode(out, msg);
}
}
package chat.server;
import chat.LoginUtil;
import chat.protocol.LoginRequestPacket;
import chat.protocol.LoginResponsePacket;
import chat.protocol.MessageResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.Date;
import java.util.UUID;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class LoginRequestHandler extends SimpleChannelInboundHandler<LoginResponsePacket> {
@Override
public void channelActive(ChannelHandlerContext ctx) {
// 创建登录对象
LoginRequestPacket loginRequestPacket = new LoginRequestPacket();
loginRequestPacket.setUserId(UUID.randomUUID().toString());
loginRequestPacket.setUsername("flash");
loginRequestPacket.setPassword("pwd");
// 写数据
ctx.channel().writeAndFlush(loginRequestPacket);
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, LoginResponsePacket loginResponsePacket) {
if (loginResponsePacket.isSuccess()) {
System.out.println(new Date() + ": 客户端登录成功");
LoginUtil.markAsLogin(ctx.channel());
} else {
System.out.println(new Date() + ": 客户端登录失败,原因:" + loginResponsePacket.getReason());
}
}
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
}
\ No newline at end of file
package chat.server;
import chat.protocol.MessageRequestPacket;
import chat.protocol.MessageResponsePacket;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.Date;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class MessageRequestHandler extends SimpleChannelInboundHandler<MessageRequestPacket> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, MessageRequestPacket msg) {
MessageResponsePacket messageResponsePacket = new MessageResponsePacket();
System.out.println(new Date() + ": 收到客户端消息: " + msg.getMessage());
messageResponsePacket.setMessage("服务端回复【" + msg.getMessage() + "】");
ctx.channel().writeAndFlush(messageResponsePacket);
}
}
package chat.server;
import chat.protocol.LoginRequestHandler;
import chat.protocol.MessageRequestHandler;
import chat.protocol.PacketDecoder;
import chat.protocol.PacketEncoder;
import io.netty.bootstrap.ServerBootstrap;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册