commit 578b0f553b5af40fb761325ead6e98eb650f85f9 Author: Zerroi Date: Sat Apr 20 12:33:43 2024 +0800 Day1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d2be69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +/target \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a4ec7b9 --- /dev/null +++ b/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.zerroi + netty + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + io.netty + netty-all + 4.1.101.Final + + + org.projectlombok + lombok + 1.18.30 + + + com.google.code.gson + gson + 2.10.1 + + + com.google.guava + guava + 19.0 + + + ch.qos.logback + logback-classic + 1.4.11 + + + + \ No newline at end of file diff --git a/src/main/java/com/zerroi/netty/charpter01/Test1.java b/src/main/java/com/zerroi/netty/charpter01/Test1.java new file mode 100644 index 0000000..5ba9a6a --- /dev/null +++ b/src/main/java/com/zerroi/netty/charpter01/Test1.java @@ -0,0 +1,7 @@ +package com.zerroi.netty.charpter01; + +public class Test1 { + public static void main(String[] args) { + + } +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..8ce8da9 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + diff --git a/src/test/java/com/zerroi/netty/chapter01/ByteBufferUtil.java b/src/test/java/com/zerroi/netty/chapter01/ByteBufferUtil.java new file mode 100644 index 0000000..6dd3a25 --- /dev/null +++ b/src/test/java/com/zerroi/netty/chapter01/ByteBufferUtil.java @@ -0,0 +1,183 @@ +package com.zerroi.netty.chapter01; + +import io.netty.util.internal.StringUtil; + +import java.nio.ByteBuffer; + +import static io.netty.util.internal.MathUtil.isOutOfBounds; +import static io.netty.util.internal.StringUtil.NEWLINE; + +public class ByteBufferUtil { + private static final char[] BYTE2CHAR = new char[256]; + private static final char[] HEXDUMP_TABLE = new char[256 * 4]; + private static final String[] HEXPADDING = new String[16]; + private static final String[] HEXDUMP_ROWPREFIXES = new String[65536 >>> 4]; + private static final String[] BYTE2HEX = new String[256]; + private static final String[] BYTEPADDING = new String[16]; + + static { + final char[] DIGITS = "0123456789abcdef".toCharArray(); + for (int i = 0; i < 256; i++) { + HEXDUMP_TABLE[i << 1] = DIGITS[i >>> 4 & 0x0F]; + HEXDUMP_TABLE[(i << 1) + 1] = DIGITS[i & 0x0F]; + } + + int i; + + // Generate the lookup table for hex dump paddings + for (i = 0; i < HEXPADDING.length; i++) { + int padding = HEXPADDING.length - i; + StringBuilder buf = new StringBuilder(padding * 3); + for (int j = 0; j < padding; j++) { + buf.append(" "); + } + HEXPADDING[i] = buf.toString(); + } + + // Generate the lookup table for the start-offset header in each row (up to 64KiB). + for (i = 0; i < HEXDUMP_ROWPREFIXES.length; i++) { + StringBuilder buf = new StringBuilder(12); + buf.append(NEWLINE); + buf.append(Long.toHexString(i << 4 & 0xFFFFFFFFL | 0x100000000L)); + buf.setCharAt(buf.length() - 9, '|'); + buf.append('|'); + HEXDUMP_ROWPREFIXES[i] = buf.toString(); + } + + // Generate the lookup table for byte-to-hex-dump conversion + for (i = 0; i < BYTE2HEX.length; i++) { + BYTE2HEX[i] = ' ' + StringUtil.byteToHexStringPadded(i); + } + + // Generate the lookup table for byte dump paddings + for (i = 0; i < BYTEPADDING.length; i++) { + int padding = BYTEPADDING.length - i; + StringBuilder buf = new StringBuilder(padding); + for (int j = 0; j < padding; j++) { + buf.append(' '); + } + BYTEPADDING[i] = buf.toString(); + } + + // Generate the lookup table for byte-to-char conversion + for (i = 0; i < BYTE2CHAR.length; i++) { + if (i <= 0x1f || i >= 0x7f) { + BYTE2CHAR[i] = '.'; + } else { + BYTE2CHAR[i] = (char) i; + } + } + } + + /** + * 打印所有内容 + * @param buffer + */ + public static void debugAll(ByteBuffer buffer) { + int oldlimit = buffer.limit(); + buffer.limit(buffer.capacity()); + StringBuilder origin = new StringBuilder(256); + appendPrettyHexDump(origin, buffer, 0, buffer.capacity()); + System.out.println("+--------+-------------------- all ------------------------+----------------+"); + System.out.printf("position: [%d], limit: [%d]\n", buffer.position(), oldlimit); + System.out.println(origin); + buffer.limit(oldlimit); + } + + /** + * 打印可读取内容 + * @param buffer + */ + public static void debugRead(ByteBuffer buffer) { + StringBuilder builder = new StringBuilder(256); + appendPrettyHexDump(builder, buffer, buffer.position(), buffer.limit() - buffer.position()); + System.out.println("+--------+-------------------- read -----------------------+----------------+"); + System.out.printf("position: [%d], limit: [%d]\n", buffer.position(), buffer.limit()); + System.out.println(builder); + } + + public static void main(String[] args) { + ByteBuffer buffer = ByteBuffer.allocate(10); + buffer.put(new byte[]{97, 98, 99, 100}); + debugAll(buffer); + } + + private static void appendPrettyHexDump(StringBuilder dump, ByteBuffer buf, int offset, int length) { + if (isOutOfBounds(offset, length, buf.capacity())) { + throw new IndexOutOfBoundsException( + "expected: " + "0 <= offset(" + offset + ") <= offset + length(" + length + + ") <= " + "buf.capacity(" + buf.capacity() + ')'); + } + if (length == 0) { + return; + } + dump.append( + " +-------------------------------------------------+" + + NEWLINE + " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |" + + NEWLINE + "+--------+-------------------------------------------------+----------------+"); + + final int startIndex = offset; + final int fullRows = length >>> 4; + final int remainder = length & 0xF; + + // Dump the rows which have 16 bytes. + for (int row = 0; row < fullRows; row++) { + int rowStartIndex = (row << 4) + startIndex; + + // Per-row prefix. + appendHexDumpRowPrefix(dump, row, rowStartIndex); + + // Hex dump + int rowEndIndex = rowStartIndex + 16; + for (int j = rowStartIndex; j < rowEndIndex; j++) { + dump.append(BYTE2HEX[getUnsignedByte(buf, j)]); + } + dump.append(" |"); + + // ASCII dump + for (int j = rowStartIndex; j < rowEndIndex; j++) { + dump.append(BYTE2CHAR[getUnsignedByte(buf, j)]); + } + dump.append('|'); + } + + // Dump the last row which has less than 16 bytes. + if (remainder != 0) { + int rowStartIndex = (fullRows << 4) + startIndex; + appendHexDumpRowPrefix(dump, fullRows, rowStartIndex); + + // Hex dump + int rowEndIndex = rowStartIndex + remainder; + for (int j = rowStartIndex; j < rowEndIndex; j++) { + dump.append(BYTE2HEX[getUnsignedByte(buf, j)]); + } + dump.append(HEXPADDING[remainder]); + dump.append(" |"); + + // Ascii dump + for (int j = rowStartIndex; j < rowEndIndex; j++) { + dump.append(BYTE2CHAR[getUnsignedByte(buf, j)]); + } + dump.append(BYTEPADDING[remainder]); + dump.append('|'); + } + + dump.append(NEWLINE + + "+--------+-------------------------------------------------+----------------+"); + } + + private static void appendHexDumpRowPrefix(StringBuilder dump, int row, int rowStartIndex) { + if (row < HEXDUMP_ROWPREFIXES.length) { + dump.append(HEXDUMP_ROWPREFIXES[row]); + } else { + dump.append(NEWLINE); + dump.append(Long.toHexString(rowStartIndex & 0xFFFFFFFFL | 0x100000000L)); + dump.setCharAt(dump.length() - 9, '|'); + dump.append('|'); + } + } + + public static short getUnsignedByte(ByteBuffer buffer, int index) { + return (short) (buffer.get(index) & 0xFF); + } +} \ No newline at end of file diff --git a/src/test/java/com/zerroi/netty/chapter01/TestAllocateByteBuffer.java b/src/test/java/com/zerroi/netty/chapter01/TestAllocateByteBuffer.java new file mode 100644 index 0000000..8238845 --- /dev/null +++ b/src/test/java/com/zerroi/netty/chapter01/TestAllocateByteBuffer.java @@ -0,0 +1,11 @@ +package com.zerroi.netty.chapter01; + +import java.nio.Buffer; +import java.nio.ByteBuffer; + +public class TestAllocateByteBuffer { + public static void main(String[] args) { + System.out.println(ByteBuffer.allocate(10).getClass()); + System.out.println(ByteBuffer.allocateDirect(10).getClass()); + } +} diff --git a/src/test/java/com/zerroi/netty/chapter01/TestBuffer.java b/src/test/java/com/zerroi/netty/chapter01/TestBuffer.java new file mode 100644 index 0000000..599c452 --- /dev/null +++ b/src/test/java/com/zerroi/netty/chapter01/TestBuffer.java @@ -0,0 +1,41 @@ +package com.zerroi.netty.chapter01; + + +import lombok.extern.slf4j.Slf4j; + +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +@Slf4j +public class TestBuffer { + public static void main(String[] args) { + // FileChannel + // 输入输出流 RandomAccessFile + + try (FileChannel channel = new FileInputStream("text.txt").getChannel()) { + // 缓存区 + ByteBuffer buffer = ByteBuffer.allocate(10); +/* //channel读取数据,向buffer中写入 + int len = channel.read(buffer); + buffer.flip(); + while (buffer.hasRemaining()) { + char c = (char) buffer.get(); + log.info("{}", c); + }*/ + int len = 0; + while ((len = channel.read(buffer)) != -1) { + log.debug("{}", len); + buffer.flip(); + while (buffer.hasRemaining()) { + char c = (char) buffer.get(); + log.info("{}", c); + } + buffer.clear(); + } + + } catch (IOException e) { + } + } +} diff --git a/src/test/java/com/zerroi/netty/chapter01/TestBufferReadWrite.java b/src/test/java/com/zerroi/netty/chapter01/TestBufferReadWrite.java new file mode 100644 index 0000000..395cece --- /dev/null +++ b/src/test/java/com/zerroi/netty/chapter01/TestBufferReadWrite.java @@ -0,0 +1,25 @@ +package com.zerroi.netty.chapter01; + +import java.nio.ByteBuffer; + +import static com.zerroi.netty.chapter01.ByteBufferUtil.debugAll; + +public class TestBufferReadWrite { + public static void main(String[] args) { + ByteBuffer buffer = ByteBuffer.allocate(10); + buffer.put((byte) 0x61); +// debugAll(buffer); + buffer.put(new byte[]{0x62, 0x63, 0x64}); +// debugAll(buffer); + + buffer.flip(); + debugAll(buffer); + byte b = buffer.get(); + debugAll(buffer); + + buffer.compact(); + debugAll(buffer); + buffer.put(new byte[]{0x65, 0x66, 0x67}); + debugAll(buffer); + } +} diff --git a/src/test/java/com/zerroi/netty/chapter01/TestByteBufferRead.java b/src/test/java/com/zerroi/netty/chapter01/TestByteBufferRead.java new file mode 100644 index 0000000..a45dda5 --- /dev/null +++ b/src/test/java/com/zerroi/netty/chapter01/TestByteBufferRead.java @@ -0,0 +1,30 @@ +package com.zerroi.netty.chapter01; + +import java.nio.ByteBuffer; + +import static com.zerroi.netty.chapter01.ByteBufferUtil.debugAll; + +public class TestByteBufferRead { + public static void main(String[] args) { + ByteBuffer buffer = ByteBuffer.allocateDirect(10); + buffer.put(new byte[]{'a', 'b', 'c', 'd'}); + buffer.flip(); + +// buffer.get(new byte[4]); +// debugAll(buffer); +// buffer.rewind(); +// buffer.get(); +// debugAll(buffer); + + System.out.println(((char) buffer.get())); + System.out.println(((char) buffer.get())); + debugAll(buffer); + buffer.mark(); + System.out.println(((char) buffer.get())); + System.out.println(((char) buffer.get())); + buffer.reset(); + System.out.println(((char) buffer.get())); + System.out.println(((char) buffer.get())); + debugAll(buffer); + } +} diff --git a/src/test/java/com/zerroi/netty/chapter01/TestByteBufferString.java b/src/test/java/com/zerroi/netty/chapter01/TestByteBufferString.java new file mode 100644 index 0000000..641bf1c --- /dev/null +++ b/src/test/java/com/zerroi/netty/chapter01/TestByteBufferString.java @@ -0,0 +1,27 @@ +package com.zerroi.netty.chapter01; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +import static com.zerroi.netty.chapter01.ByteBufferUtil.debugAll; + +public class TestByteBufferString { + public static void main(String[] args) throws UnsupportedEncodingException { + ByteBuffer buffer = ByteBuffer.allocate(16); + buffer.put("Hello".getBytes(StandardCharsets.UTF_8)); + debugAll(buffer); + ByteBuffer hello = StandardCharsets.UTF_8.encode("Hello"); + debugAll(hello); + + ByteBuffer hello2 = ByteBuffer.wrap("Hello".getBytes()); + debugAll(hello2); + + String str = StandardCharsets.UTF_8.decode(hello2).toString(); +// System.out.println("str = " + str); + + buffer.flip(); + String str1 = StandardCharsets.UTF_8.decode(buffer).toString(); + System.out.println(str1); + } +} diff --git a/text.txt b/text.txt new file mode 100644 index 0000000..e443afe --- /dev/null +++ b/text.txt @@ -0,0 +1 @@ +12389127636asnkjd \ No newline at end of file