提交 2b17a820 编写于 作者: GreyZeng's avatar GreyZeng

client send and server recive msg

上级 a36862b5
package chat;
import chat.protocol.Attributes;
import io.netty.channel.Channel;
import io.netty.util.Attribute;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public class LoginUtil {
public static void markAsLogin(Channel channel) {
channel.attr(Attributes.LOGIN).set(true);
}
public static boolean hasLogin(Channel channel) {
Attribute<Boolean> loginAttr = channel.attr(Attributes.LOGIN);
return loginAttr.get() != null;
}
}
package chat.client;
import chat.LoginUtil;
import chat.protocol.LoginRequestPacket;
import chat.protocol.LoginResponsePacket;
import chat.protocol.MessageResponsePacket;
import chat.protocol.Packet;
import chat.protocol.PacketCodeC;
import io.netty.channel.ChannelHandlerContext;
......@@ -56,10 +58,13 @@ public class ClientHandler extends ChannelInboundHandlerAdapter {
// jdk 16 新语法
if (packet instanceof LoginResponsePacket loginResponsePacket) {
if (loginResponsePacket.isSuccess()) {
LoginUtil.markAsLogin(ctx.channel());
System.out.println(new Date() + ": 客户端登录成功");
} else {
System.out.println(new Date() + ": 客户端登录失败,原因:" + loginResponsePacket.getReason());
}
} else if (packet instanceof MessageResponsePacket messageResponsePacket) {
System.out.println(new Date() + ": 收到服务端的消息:" + messageResponsePacket.getMessage());
}
}
}
package chat.client;
import chat.LoginUtil;
import chat.client.ClientHandler;
import chat.protocol.MessageRequestPacket;
import chat.protocol.PacketCodeC;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
......@@ -9,7 +15,9 @@ import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
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
......@@ -45,6 +53,8 @@ public class NettyClient {
bootstrap.connect(host, port).addListener(future -> {
if (future.isSuccess()) {
System.out.println(new Date() + ": 连接成功!");
Channel channel = ((ChannelFuture) future).channel();
startConsoleThread(channel);
} else if (retry == 0) {
System.err.println("重试次数已用完,放弃连接!");
} else {
......@@ -58,4 +68,21 @@ public class NettyClient {
}
});
}
// 启动控制台客户端,给服务端发送消息
private static void startConsoleThread(Channel channel) {
new Thread(() -> {
while (!Thread.interrupted()) {
if (LoginUtil.hasLogin(channel)) {
System.out.println("输入消息发送至服务端:");
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
MessageRequestPacket packet = new MessageRequestPacket();
packet.setMessage(line);
ByteBuf byteBuf = PacketCodeC.INSTANCE.encode(channel.alloc(), packet);
channel.writeAndFlush(byteBuf);
}
}
}).start();
}
}
\ No newline at end of file
package chat.protocol;
import io.netty.util.AttributeKey;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
public interface Attributes {
AttributeKey<Boolean> LOGIN = AttributeKey.newInstance("login");
}
......@@ -4,4 +4,5 @@ public interface Command {
Byte LOGIN_REQUEST = 1;
Byte LOGIN_RESPONSE = 2;
Byte MESSAGE_REQUEST = 3;
Byte MESSAGE_RESPONSE = 4;
}
package chat.protocol;
import lombok.Data;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
@Data
public class MessageRequestPacket extends Packet {
private String message;
......
package chat.protocol;
import lombok.Data;
/**
* @author <a href="mailto:410486047@qq.com">Grey</a>
* @date 2022/9/12
* @since
*/
@Data
public class MessageResponsePacket extends Packet {
private String message;
@Override
public Byte getCommand() {
return Command.MESSAGE_RESPONSE;
}
}
......@@ -25,7 +25,8 @@ public class PacketCodeC {
packetTypeMap = new HashMap<>();
packetTypeMap.put(LOGIN_REQUEST, LoginRequestPacket.class);
packetTypeMap.put(LOGIN_RESPONSE, LoginResponsePacket.class);
packetTypeMap.put(Command.MESSAGE_REQUEST, MessageRequestPacket.class);
packetTypeMap.put(Command.MESSAGE_RESPONSE, MessageResponsePacket.class);
serializerMap = new HashMap<>();
Serializer serializer = new JSONSerializer();
serializerMap.put(serializer.getSerializerAlogrithm(), serializer);
......
......@@ -18,13 +18,10 @@ public class ServerHandler extends ChannelInboundHandlerAdapter {
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println(new Date() + ": 客户端开始登录……");
ByteBuf requestByteBuf = (ByteBuf) msg;
Packet packet = PacketCodeC.INSTANCE.decode(requestByteBuf);
if (packet instanceof LoginRequestPacket) {
ByteBuf byteBuf = null;
if (packet instanceof LoginRequestPacket loginRequestPacket) {
// 登录流程
LoginRequestPacket loginRequestPacket = (LoginRequestPacket) packet;
LoginResponsePacket loginResponsePacket = new LoginResponsePacket();
loginResponsePacket.setVersion(packet.getVersion());
if (valid(loginRequestPacket)) {
......@@ -36,9 +33,14 @@ public class ServerHandler extends ChannelInboundHandlerAdapter {
System.out.println(new Date() + ": 登录失败!");
}
// 登录响应
ByteBuf responseByteBuf = PacketCodeC.INSTANCE.encode(ctx.alloc(), loginResponsePacket);
ctx.channel().writeAndFlush(responseByteBuf);
byteBuf = PacketCodeC.INSTANCE.encode(ctx.alloc(), loginResponsePacket);
} else if (packet instanceof MessageRequestPacket messageRequestPacket) {
System.out.println(new Date() + ": 收到客户端消息:" + messageRequestPacket.getMessage());
MessageResponsePacket messageResponsePacket = new MessageResponsePacket();
messageResponsePacket.setMessage("服务端回复【" + messageRequestPacket.getMessage() + "】");
byteBuf = PacketCodeC.INSTANCE.encode(ctx.alloc(), messageResponsePacket);
}
ctx.channel().writeAndFlush(byteBuf);
}
private boolean valid(LoginRequestPacket loginRequestPacket) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册