Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
GreyZeng
hello-netty
提交
2b17a820
H
hello-netty
项目概览
GreyZeng
/
hello-netty
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hello-netty
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2b17a820
编写于
9月 19, 2022
作者:
GreyZeng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
client send and server recive msg
上级
a36862b5
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
98 addition
and
8 deletion
+98
-8
src/main/java/chat/LoginUtil.java
src/main/java/chat/LoginUtil.java
+21
-0
src/main/java/chat/client/ClientHandler.java
src/main/java/chat/client/ClientHandler.java
+5
-0
src/main/java/chat/client/NettyClient.java
src/main/java/chat/client/NettyClient.java
+27
-0
src/main/java/chat/protocol/Attributes.java
src/main/java/chat/protocol/Attributes.java
+12
-0
src/main/java/chat/protocol/Command.java
src/main/java/chat/protocol/Command.java
+1
-0
src/main/java/chat/protocol/MessageRequestPacket.java
src/main/java/chat/protocol/MessageRequestPacket.java
+3
-0
src/main/java/chat/protocol/MessageResponsePacket.java
src/main/java/chat/protocol/MessageResponsePacket.java
+18
-0
src/main/java/chat/protocol/PacketCodeC.java
src/main/java/chat/protocol/PacketCodeC.java
+2
-1
src/main/java/chat/server/ServerHandler.java
src/main/java/chat/server/ServerHandler.java
+9
-7
未找到文件。
src/main/java/chat/LoginUtil.java
0 → 100644
浏览文件 @
2b17a820
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
;
}
}
src/main/java/chat/client/ClientHandler.java
浏览文件 @
2b17a820
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
());
}
}
}
src/main/java/chat/client/NettyClient.java
浏览文件 @
2b17a820
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
src/main/java/chat/protocol/Attributes.java
0 → 100644
浏览文件 @
2b17a820
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"
);
}
src/main/java/chat/protocol/Command.java
浏览文件 @
2b17a820
...
...
@@ -4,4 +4,5 @@ public interface Command {
Byte
LOGIN_REQUEST
=
1
;
Byte
LOGIN_RESPONSE
=
2
;
Byte
MESSAGE_REQUEST
=
3
;
Byte
MESSAGE_RESPONSE
=
4
;
}
src/main/java/chat/protocol/MessageRequestPacket.java
浏览文件 @
2b17a820
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
;
...
...
src/main/java/chat/protocol/MessageResponsePacket.java
0 → 100644
浏览文件 @
2b17a820
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
;
}
}
src/main/java/chat/protocol/PacketCodeC.java
浏览文件 @
2b17a820
...
...
@@ -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
);
...
...
src/main/java/chat/server/ServerHandler.java
浏览文件 @
2b17a820
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录