Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
netty-demo
提交
9c6b463f
N
netty-demo
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
netty-demo
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
netty-demo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
9c6b463f
编写于
4月 28, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:整理协议部分
上级
4cebbfce
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
37 addition
and
41 deletion
+37
-41
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/TestRedisClient.java
...a/com/kwan/shuyu/advance_02_protocol/TestRedisClient.java
+26
-15
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/custom/protocol/MessageCodec.java
...uyu/advance_02_protocol/custom/protocol/MessageCodec.java
+2
-2
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/custom/protocol/MessageCodecSharable.java
...nce_02_protocol/custom/protocol/MessageCodecSharable.java
+4
-19
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/custom/server/ChatServer.java
...n/shuyu/advance_02_protocol/custom/server/ChatServer.java
+5
-5
未找到文件。
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/TestRedisClient.java
浏览文件 @
9c6b463f
...
...
@@ -15,26 +15,36 @@ import lombok.extern.slf4j.Slf4j;
import
java.nio.charset.Charset
;
/**
* 以redis协议 为例 【首先开启redis】
* <b>命令</b> :set key value
* <b>命令内容</b> :set name zhangsan
* 首先 把整个看成一个数组
* <content>
* 协议内容:
* ```
* 3 数组个数
* $3 key命令长度
* set
* $4 key值 内容长度
* name
* $8 value值 内容长度
* zhangsan
* ```
* </content>
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/4/28 10:25
*/
@Slf4j
public
class
TestRedisClient
{
/**
* <b>命令</b> :set key value
* <b>命令内容</b> :set name zhangsan
* 首先 把整个看成一个数组
* <content>
* 协议内容:
* ```
* 3 数组长度
* $3 key命令长度
* set
* $4 key值 内容长度
* name
* $8 value值 内容长度
* zhangsan
* ```
* </content>
*
* @param args
*/
public
static
void
main
(
String
[]
args
)
{
final
byte
[]
LINE
=
{
'\r'
,
'\n'
};
final
NioEventLoopGroup
worker
=
new
NioEventLoopGroup
();
...
...
@@ -68,6 +78,7 @@ public class TestRedisClient {
buf
.
writeBytes
(
LINE
);
ctx
.
writeAndFlush
(
buf
);
}
// read事件 接受redis的返回结果
@Override
public
void
channelRead
(
ChannelHandlerContext
ctx
,
Object
msg
)
throws
Exception
{
...
...
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/custom/protocol/MessageCodec.java
浏览文件 @
9c6b463f
...
...
@@ -61,8 +61,8 @@ public class MessageCodec extends ByteToMessageCodec<Message> {
final
ObjectInputStream
ois
=
new
ObjectInputStream
(
bis
);
// 转成 Message类型
Message
message
=
(
Message
)
ois
.
readObject
();
log
.
debug
(
"{},{},{},{},{},{}"
,
magicNum
,
version
,
serializerType
,
messageType
,
sequenceId
,
length
);
log
.
debug
(
"{}"
,
message
);
log
.
info
(
"{},{},{},{},{},{}"
,
magicNum
,
version
,
serializerType
,
messageType
,
sequenceId
,
length
);
log
.
info
(
"{}"
,
message
);
// 将message给下一个handler使用
out
.
add
(
message
);
}
...
...
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/custom/protocol/MessageCodecSharable.java
浏览文件 @
9c6b463f
...
...
@@ -15,7 +15,7 @@ import java.util.List;
/**
* 【自定义】消息 编解码 类 【 支持@Sharable 】
*
########## 父类 MessageToMessageCodec 认为是完整的信息 【所以必须保证上一个处理器时 帧解码器】 ########
*
父类 MessageToMessageCodec 认为是完整的信息 【所以必须保证上一个处理器是 帧解码器】
* 相当于两个handler合二为一,既能入站 也能做出站处理
* <b>魔数 </b>,用来在第一时间判定是否是无效数据包
* <b>版本号 </b>,可以支持协议的升级
...
...
@@ -25,35 +25,27 @@ import java.util.List;
* <b>正文长度 </b>
* <b>消息正文 </b>
*/
// 写这个类 肯定的认为 上一个处理器 是 帧解码器,所以不用考虑半包黏包问题,直接解码拿数据
@Slf4j
@ChannelHandler
.
Sharable
public
class
MessageCodecSharable
extends
MessageToMessageCodec
<
ByteBuf
,
Message
>
{
// 注意这里Message是自定义类
@Override
protected
void
encode
(
ChannelHandlerContext
ctx
,
Message
msg
,
List
<
Object
>
outList
)
throws
Exception
{
ByteBuf
out
=
ctx
.
alloc
().
buffer
();
out
.
writeBytes
(
new
byte
[]{
1
,
2
,
3
,
4
});
// 4字节的 魔数
out
.
writeByte
(
1
);
// 1字节的 版本
out
.
writeByte
(
0
);
// 1字节的 序列化方式 0-jdk,1-json
out
.
writeByte
(
msg
.
getMessageType
());
// 1字节的 指令类型
out
.
writeInt
(
msg
.
getSequenceId
());
// 4字节的 请求序号 【大端】
out
.
writeByte
(
0xff
);
// 1字节的 对其填充,只为了非消息内容 是2的整数倍
// 处理内容 用对象流包装字节数组 并写入
ByteArrayOutputStream
bos
=
new
ByteArrayOutputStream
();
// 访问数组
ObjectOutputStream
oos
=
new
ObjectOutputStream
(
bos
);
// 用对象流 包装
oos
.
writeObject
(
msg
);
byte
[]
bytes
=
bos
.
toByteArray
();
// 写入内容 长度
out
.
writeInt
(
bytes
.
length
);
// 写入内容
out
.
writeBytes
(
bytes
);
/**
* 加入List 方便传递给 下一个Handler
*/
...
...
@@ -68,26 +60,19 @@ public class MessageCodecSharable extends MessageToMessageCodec<ByteBuf, Message
byte
messageType
=
in
.
readByte
();
int
sequenceId
=
in
.
readInt
();
in
.
readByte
();
int
length
=
in
.
readInt
();
final
byte
[]
bytes
=
new
byte
[
length
];
in
.
readBytes
(
bytes
,
0
,
length
);
// 处理内容
final
ByteArrayInputStream
bis
=
new
ByteArrayInputStream
(
bytes
);
final
ObjectInputStream
ois
=
new
ObjectInputStream
(
bis
);
// 转成 Message类型
Message
message
=
(
Message
)
ois
.
readObject
();
log
.
debug
(
"{},{},{},{},{},{}"
,
magicNum
,
version
,
serializerType
,
messageType
,
sequenceId
,
length
);
log
.
debug
(
"{}"
,
message
);
log
.
info
(
"{},{},{},{},{},{}"
,
magicNum
,
version
,
serializerType
,
messageType
,
sequenceId
,
length
);
log
.
info
(
"{}"
,
message
);
/**
* 加入List 方便传递给 下一个Handler
*/
out
.
add
(
message
);
}
}
}
\ No newline at end of file
netty-03-jinjie/src/main/java/com/kwan/shuyu/advance_02_protocol/custom/server/ChatServer.java
浏览文件 @
9c6b463f
...
...
@@ -13,16 +13,16 @@ import io.netty.handler.logging.LoggingHandler;
import
lombok.extern.slf4j.Slf4j
;
/**
*
* 聊天--服务端
*@version : 2.2.0
*@author : qinyingjie
*@date : 2023/4/27 19:51
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/4/27 19:51
*/
@Slf4j
public
class
ChatServer
{
public
static
final
MessageCodecSharable
MESSAGE_CODEC
=
new
MessageCodecSharable
();
public
static
final
LoggingHandler
LOGGING_HANDLER
=
new
LoggingHandler
(
LogLevel
.
DEBUG
);
public
static
final
LoggingHandler
LOGGING_HANDLER
=
new
LoggingHandler
(
LogLevel
.
INFO
);
public
static
void
main
(
String
[]
args
)
throws
InterruptedException
{
final
NioEventLoopGroup
boss
=
new
NioEventLoopGroup
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录