通过自己编写的 netty
客户端向 redis
写入数据。
redis 的 set key value,其协议是这样的。
1 2 3 4 5 6 7 8 9 10
| set key value *3 「表明元素有几个」 $3 「长度 3 个字节为 set」 set $4 「假设 key = name,则这是 4 个字节」 name $3 「假设 value 为 aaa,则是 3 个字节」 aaa
ps: 每一行都需要一个 回车 + 换行进行分割
|
编写代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| package com.redisc;
import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInitializer; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import java.io.IOException; import java.nio.charset.Charset; import java.util.Random;
public class Client { static final Logger log = LoggerFactory.getLogger(Client.class);
public static void main(String[] args) throws IOException, InterruptedException { send(); }
public static void send() { final byte[] LINE = {13, 10}; NioEventLoopGroup worker = new NioEventLoopGroup();
try { Bootstrap bootstrap = new Bootstrap(); bootstrap.channel(NioSocketChannel.class); bootstrap.group(worker); bootstrap.handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { socketChannel.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG)); socketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter() { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { ByteBuf buf = ctx.alloc().buffer(); buf.writeBytes("*3".getBytes()); buf.writeBytes(LINE); buf.writeBytes("$3".getBytes()); buf.writeBytes(LINE); buf.writeBytes("set".getBytes()); buf.writeBytes(LINE); buf.writeBytes("$4".getBytes()); buf.writeBytes(LINE); buf.writeBytes("name".getBytes()); buf.writeBytes(LINE); buf.writeBytes("$3".getBytes()); buf.writeBytes(LINE); buf.writeBytes("aaa".getBytes()); buf.writeBytes(LINE); ctx.writeAndFlush(buf); }
@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf byteBuf = (ByteBuf)msg; System.out.println(byteBuf.toString(Charset.defaultCharset())); } }); } }); ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 6379); channelFuture.channel().closeFuture().sync(); } catch (InterruptedException e) { log.error("error", e); } finally { worker.shutdownGracefully(); } } }
|
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 20:26:56.315 [nioEventLoopGroup-2-1] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@1f26c33b 20:26:56.321 [nioEventLoopGroup-2-1] DEBUG io.netty.handler.logging.LoggingHandler - [id: 0x24ec6db4, L:/127.0.0.1:57820 - R:/127.0.0.1:6379] WRITE: 32B +-------------------------------------------------+ | 0 1 2 3 4 5 6 7 8 9 a b c d e f | +--------+-------------------------------------------------+----------------+ |00000000| 2a 33 0d 0a 24 33 0d 0a 73 65 74 0d 0a 24 34 0d |*3..$3..set..$4.| |00000010| 0a 6e 61 6d 65 0d 0a 24 33 0d 0a 61 61 61 0d 0a |.name..$3..aaa..| +--------+-------------------------------------------------+----------------+ 20:26:56.322 [nioEventLoopGroup-2-1] DEBUG io.netty.handler.logging.LoggingHandler - [id: 0x24ec6db4, L:/127.0.0.1:57820 - R:/127.0.0.1:6379] FLUSH 20:26:56.328 [nioEventLoopGroup-2-1] DEBUG io.netty.handler.logging.LoggingHandler - [id: 0x24ec6db4, L:/127.0.0.1:57820 - R:/127.0.0.1:6379] READ: 5B +-------------------------------------------------+ | 0 1 2 3 4 5 6 7 8 9 a b c d e f | +--------+-------------------------------------------------+----------------+ |00000000| 2b 4f 4b 0d 0a |+OK.. | +--------+-------------------------------------------------+----------------+ +OK
|