Skip to content

Commit 63b992a

Browse files
committed
客户端互相通信
1 parent f2f9a9a commit 63b992a

17 files changed

+248
-136
lines changed

Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.bruis.learnnetty.im.client;
22

3-
import com.bruis.learnnetty.im.client.handler.FirstClientHandler;
43
import com.bruis.learnnetty.im.client.handler.LoginResponseHandler;
54
import com.bruis.learnnetty.im.client.handler.MessageResponseHandler;
65
import com.bruis.learnnetty.im.codec.PacketDecoder;
76
import com.bruis.learnnetty.im.codec.PacketEncoder;
87
import com.bruis.learnnetty.im.codec.Spliter;
8+
import com.bruis.learnnetty.im.model.LoginRequestPacket;
99
import com.bruis.learnnetty.im.model.MessageRequestPacket;
10-
import com.bruis.learnnetty.im.util.LoginUtil;
10+
import com.bruis.learnnetty.im.util.SessionUtil;
1111
import io.netty.bootstrap.Bootstrap;
1212
import io.netty.channel.Channel;
1313
import io.netty.channel.ChannelFuture;
@@ -45,13 +45,15 @@ public static void main(String[] args) {
4545
.handler(new ChannelInitializer<SocketChannel>() {
4646
@Override
4747
public void initChannel(SocketChannel ch) {
48+
// 拆包粘包处理
4849
ch.pipeline().addLast(new Spliter());
49-
// ch.pipeline().addLast(new FirstClientHandler());
50-
// 解码
50+
// 编码
5151
ch.pipeline().addLast(new PacketDecoder());
52+
// 登录响应
5253
ch.pipeline().addLast(new LoginResponseHandler());
54+
// 消息返回
5355
ch.pipeline().addLast(new MessageResponseHandler());
54-
// 编码
56+
// 解码
5557
ch.pipeline().addLast(new PacketEncoder());
5658
}
5759
});
@@ -80,16 +82,35 @@ private static void connect(Bootstrap bootstrap, String host, int port, int retr
8082
}
8183

8284
private static void startConsoleThread(Channel channel) {
85+
Scanner sc = new Scanner(System.in);
86+
LoginRequestPacket loginRequestPacket = new LoginRequestPacket();
87+
8388
new Thread(() -> {
8489
while (!Thread.interrupted()) {
85-
if (LoginUtil.hasLogin(channel)) {
86-
System.out.println("输入消息发送至服务端: ");
87-
Scanner sc = new Scanner(System.in);
88-
String line = sc.nextLine();
90+
if (!SessionUtil.hasLogin(channel)) {
91+
System.out.print("输入用户名登录: ");
92+
String username = sc.nextLine();
93+
loginRequestPacket.setUserName(username);
94+
95+
// 密码使用默认的
96+
loginRequestPacket.setPassword("pwd");
8997

90-
channel.writeAndFlush(new MessageRequestPacket(line));
98+
// 发送登录数据包
99+
channel.writeAndFlush(loginRequestPacket);
100+
waitForLoginResponse();
101+
} else {
102+
String toUserId = sc.next();
103+
String message = sc.next();
104+
channel.writeAndFlush(new MessageRequestPacket(toUserId, message));
91105
}
92106
}
93107
}).start();
94108
}
109+
110+
private static void waitForLoginResponse() {
111+
try {
112+
Thread.sleep(1000);
113+
} catch (InterruptedException ignored) {
114+
}
115+
}
95116
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.bruis.learnnetty.im.client.handler;
22

3-
import com.bruis.learnnetty.im.model.LoginRequestPacket;
43
import com.bruis.learnnetty.im.model.LoginResponsePacket;
5-
import com.bruis.learnnetty.im.util.LoginUtil;
4+
import com.bruis.learnnetty.im.session.Session;
5+
import com.bruis.learnnetty.im.util.SessionUtil;
66
import io.netty.channel.ChannelHandlerContext;
77
import io.netty.channel.SimpleChannelInboundHandler;
88

99
import java.util.Date;
10-
import java.util.UUID;
1110

1211
/**
1312
* @Description 登录响应的reponse
@@ -17,24 +16,20 @@
1716
public class LoginResponseHandler extends SimpleChannelInboundHandler<LoginResponsePacket> {
1817

1918
@Override
20-
public void channelActive(ChannelHandlerContext ctx) throws Exception {
21-
// 创建登录对象
22-
LoginRequestPacket loginRequestPacket = new LoginRequestPacket();
23-
loginRequestPacket.setUserId(UUID.randomUUID().toString());
24-
loginRequestPacket.setUserName("flash");
25-
loginRequestPacket.setPassword("pwd");
19+
protected void channelRead0(ChannelHandlerContext ctx, LoginResponsePacket loginResponsePacket) throws Exception {
20+
String userId = loginResponsePacket.getUserId();
21+
String userName = loginResponsePacket.getUserName();
2622

27-
// 写数据-发起登录
28-
ctx.channel().writeAndFlush(loginRequestPacket);
29-
}
30-
31-
@Override
32-
protected void channelRead0(ChannelHandlerContext channelHandlerContext, LoginResponsePacket loginResponsePacket) throws Exception {
3323
if (loginResponsePacket.isSuccess()) {
3424
System.out.println(new Date() + ": 客户端登录成功");
35-
LoginUtil.markAsLogin(channelHandlerContext.channel());
25+
SessionUtil.bindSession(new Session(userId, userName), ctx.channel());
3626
} else {
3727
System.out.println(new Date() + ": 客户端登录失败,原因:" + loginResponsePacket.getReason());
3828
}
3929
}
30+
31+
@Override
32+
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
33+
System.out.println("客户端连接被关闭");
34+
}
4035
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import io.netty.channel.ChannelHandlerContext;
55
import io.netty.channel.SimpleChannelInboundHandler;
66

7-
import java.util.Date;
8-
97
/**
108
* @Description
119
* @Author luohaiyang
@@ -14,6 +12,8 @@
1412
public class MessageResponseHandler extends SimpleChannelInboundHandler<MessageResponsePacket> {
1513
@Override
1614
protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageResponsePacket messageResponsePacket) throws Exception {
17-
System.out.println(new Date() + ": 收到服务端的消息: " + messageResponsePacket.getMessage());
15+
String fromUserId = messageResponsePacket.getFromUserId();
16+
String fromUserName = messageResponsePacket.getFromUserName();
17+
System.out.println(fromUserId + ":" + fromUserName + " -> " + messageResponsePacket.getMessage());
1818
}
1919
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
77

88
/**
9-
* @Description
9+
* @Description 拆包、粘包处理
1010
* @Author luohaiyang
1111
* @Date 2022/3/23
1212
*/
@@ -20,11 +20,11 @@ public Spliter() {
2020

2121
@Override
2222
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
23+
// 校验协议
2324
if (in.getInt(in.readerIndex()) != PacketCodeC.MAGIC_NUMBER) {
2425
ctx.channel().close();
2526
return null;
2627
}
27-
2828
return super.decode(ctx, in);
2929
}
3030
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.bruis.learnnetty.im.model;
22

3+
import com.bruis.learnnetty.im.session.Session;
34
import io.netty.util.AttributeKey;
45

56
/**
@@ -8,5 +9,5 @@
89
* @Date 2022/3/22
910
*/
1011
public interface Attributes {
11-
AttributeKey<Boolean> LOGIN = AttributeKey.newInstance("login");
12+
AttributeKey<Session> SESSION = AttributeKey.newInstance("session");
1213
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
* @Date 2022/3/22
99
*/
1010
public class LoginResponsePacket extends Packet {
11+
12+
private String userId;
13+
14+
private String userName;
15+
1116
private boolean success;
1217

1318
private String reason;
@@ -33,4 +38,20 @@ public String getReason() {
3338
public void setReason(String reason) {
3439
this.reason = reason;
3540
}
41+
42+
public String getUserId() {
43+
return userId;
44+
}
45+
46+
public void setUserId(String userId) {
47+
this.userId = userId;
48+
}
49+
50+
public String getUserName() {
51+
return userName;
52+
}
53+
54+
public void setUserName(String userName) {
55+
this.userName = userName;
56+
}
3657
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@
99
*/
1010
public class MessageRequestPacket extends Packet {
1111

12+
private String toUserId;
13+
14+
private String message;
15+
1216
public MessageRequestPacket(){}
1317

14-
public MessageRequestPacket(String message) {
18+
public MessageRequestPacket(String toUserId, String message) {
19+
this.toUserId = toUserId;
1520
this.message = message;
1621
}
1722

18-
private String message;
19-
2023
@Override
2124
public Byte getCommand() {
2225
return MESSAGE_REQUEST;
@@ -29,4 +32,12 @@ public String getMessage() {
2932
public void setMessage(String message) {
3033
this.message = message;
3134
}
35+
36+
public String getToUserId() {
37+
return toUserId;
38+
}
39+
40+
public void setToUserId(String toUserId) {
41+
this.toUserId = toUserId;
42+
}
3243
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
*/
1010
public class MessageResponsePacket extends Packet {
1111

12+
private String fromUserId;
13+
14+
private String fromUserName;
15+
1216
private String message;
1317

1418
@Override
@@ -24,4 +28,20 @@ public String getMessage() {
2428
public void setMessage(String message) {
2529
this.message = message;
2630
}
31+
32+
public String getFromUserId() {
33+
return fromUserId;
34+
}
35+
36+
public void setFromUserId(String fromUserId) {
37+
this.fromUserId = fromUserId;
38+
}
39+
40+
public String getFromUserName() {
41+
return fromUserName;
42+
}
43+
44+
public void setFromUserName(String fromUserName) {
45+
this.fromUserName = fromUserName;
46+
}
2747
}

Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.bruis.learnnetty.im.codec.PacketDecoder;
44
import com.bruis.learnnetty.im.codec.PacketEncoder;
55
import com.bruis.learnnetty.im.codec.Spliter;
6-
import com.bruis.learnnetty.im.server.handler.FirstServerHandler;
6+
import com.bruis.learnnetty.im.server.handler.AuthHandler;
77
import com.bruis.learnnetty.im.server.handler.LoginRequestHandler;
88
import com.bruis.learnnetty.im.server.handler.MessageRequestHandler;
99
import io.netty.bootstrap.ServerBootstrap;
@@ -41,6 +41,7 @@ protected void initChannel(NioSocketChannel ch) throws Exception {
4141
// ch.pipeline().addLast(new FirstServerHandler());
4242
ch.pipeline().addLast(new PacketDecoder());
4343
ch.pipeline().addLast(new LoginRequestHandler());
44+
ch.pipeline().addLast(new AuthHandler());
4445
ch.pipeline().addLast(new MessageRequestHandler());
4546
ch.pipeline().addLast(new PacketEncoder());
4647
}

0 commit comments

Comments
 (0)