Skip to content

Commit 98f18ea

Browse files
author
litongjava
committed
update tcp handler
1 parent 55e4b5d commit 98f18ea

File tree

2 files changed

+78
-41
lines changed

2 files changed

+78
-41
lines changed

docs/zh/06_内置组件/05.md

+29-21
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,31 @@
22

33
配置 websocket 路由
44

5-
```
6-
5+
```java
76
package com.litongjava.tio.web.socket.hello.config;
87

9-
import com.litongjava.jfinal.aop.annotation.Bean;
10-
import com.litongjava.jfinal.aop.annotation.Configuration;
8+
import com.litongjava.jfinal.aop.annotation.AConfiguration;
9+
import com.litongjava.jfinal.aop.annotation.AInitialization;
10+
import com.litongjava.tio.boot.server.TioBootServer;
1111
import com.litongjava.tio.boot.websocket.handler.WebSocketRoutes;
1212
import com.litongjava.tio.web.socket.hello.handler.HelloWebSocketHandler;
1313

1414
@AConfiguration
1515
public class WebSocketConfig {
1616

17-
@ABean
18-
public WebSocketRoutes webSocketRoutes() {
19-
WebSocketRoutes webSocketRoutes = new WebSocketRoutes();
20-
webSocketRoutes.add("/hello", HelloWebSocketHandler.class);
21-
return webSocketRoutes;
17+
@AInitialization
18+
public void config() {
19+
WebSocketRoutes webSocketRoutes = new WebSocketRoutes();
20+
webSocketRoutes.add("/hello", new HelloWebSocketHandler());
21+
//添加到TioBootServer
22+
TioBootServer.setWebSocketRoutes(webSocketRoutes);
2223
}
23-
2424
}
25-
2625
```
2726

28-
实现 websocket 处理器
27+
websocket 消息处理器
2928

3029
```
31-
3230
package com.litongjava.tio.web.socket.hello.handler;
3331
3432
import java.util.Objects;
@@ -63,8 +61,8 @@ public class HelloWebSocketHandler implements IWsMsgHandler {
6361
String myname = request.getParam("name");
6462
6563
Tio.bindUser(channelContext, myname);
66-
// channelContext.setUserid(myname);
67-
log.info("收到来自{}的ws握手包\r\n{}", clientip, request.toString());
64+
// channelContext.setUserid(myname);
65+
log.info("收到来自{}的ws握手包{}", clientip, request.toString());
6866
return httpResponse;
6967
}
7068
@@ -139,19 +137,17 @@ public class HelloWebSocketHandler implements IWsMsgHandler {
139137
1. `WebSocketConfig` 类:
140138

141139
- 使用 `@AConfiguration` 注解标记,表明它是配置类。
142-
- 通过 `@ABean` 注解提供了 `WebSocketRoutes` 的配置,其中定义了一个 WebSocket 路径和处理器的映射。`"/hello"` 路径映射到 `HelloWebSocketHandler` 处理器。
140+
- 通过 `@AInitialization` 注解标记,表明改方法会在 tio-boot 启动时执行.在改方法内进行 `WebSocketRoutes` 的配置,其中定义了一个 WebSocket 路径和处理器的映射。`"/hello"` 路径映射到 `HelloWebSocketHandler` 处理器。
143141

144142
2. `HelloWebSocketHandler` 类:
145143
- 实现了 `IWsMsgHandler` 接口,用于处理 WebSocket 消息。
146144
- `doBeforeHandler` 方法在处理 WebSocket 消息之前调用,可以进行如日志记录等操作。
147145
- `onAfterHandshaked` 方法在 WebSocket 握手后调用,用于群发消息和绑定用户到群组。
148146
- `onText` 方法处理接收到的文本消息,群发处理后的消息。
149147

150-
4.DefaultWebSocketHandler 会进行 WebSocketHandler 分发
151-
152-
#### 10.2.2.WebSocketHandler 讲解
148+
#### IWsMsgHandler 讲解
153149

154-
定义一个类实现 `IWsMsgHandler` 接口,用于处理 WebSocket 消息。IWsMsgHandler 方式如下
150+
定义一个类实现 `IWsMsgHandler` 接口,用于处理 WebSocket 消息。IWsMsgHandler 方法如下
155151

156152
- `doBeforeHandler` 方法在处理 WebSocket 消息之前调用,可以进行如日志记录等操作。
157153
- `onAfterHandshaked` 方法在 WebSocket 握手后调用,用于群发消息和绑定用户到群组。
@@ -160,8 +156,20 @@ public class HelloWebSocketHandler implements IWsMsgHandler {
160156
- `onText` 方法处理接收到的文本消息。
161157

162158
如果要像客户端发送消息,你可以直接调用 Tio 工具类系列方法
159+
160+
```
163161
Tio.sendToGroup(channelContext.tioConfig, GROUP_ID, wsResponse);
162+
```
164163

165164
如果 onBytes 和 onText 和 onClose 返回值不为 null.DefaultWebSocketHandler 会获取返回值发送到客户端,推荐返回值为 null,自己在方法中发送数据到客户端
166165

167-
因为 Websocket 协议的特殊性,http 的拦截器不会在 websocket 之前执行,如果包含验证功能,你需要再 WebsocketHanlder 中再次进行验证
166+
因为 Websocket 协议的特殊性,http 的拦截器不会在 websocket 之前执行,如果需要对请求进行功能,你需要再 WebsocketHanlder 中再次进行验证
167+
168+
#### 测试
169+
170+
使用 websocket 工具连接并发送消息
171+
ws://127.0.0.1/hello
172+
173+
#### 测试代码地址
174+
175+
https://github.com/litongjava/java-ee-tio-boot-study/tree/main/tio-boot-latest-study/tio-boot-websocket-hello

docs/zh/06_内置组件/07.md

+49-20
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
# tio-boot 内置 Tcp
1+
# tio-boot 内置 tcp 处理器
22

33
tio-boot 内置了 tcp 的支持,可以使用一个端口支持 tcp,http,websocket 三种协议,当一个数据包发送到 tio-boot-server 时,TioBootServerHandler 会根据内置的判断方法,选择对应处理器进行协议的处理.
44

5-
- com.litongjava.tio.http.server.HttpServerAioHandler 内置的 http 协议处理器
6-
- com.litongjava.tio.websocket.server.WsServerAioHandler 内置的 WebSocket 协议处理器
7-
- com.litongjava.tio.boot.tcp.ServerTcpHandler tcp 协议处理器,这是一个接口,需要自己实现 tcp 的处理逻辑
8-
95
下面介绍如何使用 tio-boot 内置 Tcp 功能
106

11-
```
12-
package com.litongjava.tio.web.hello.tcp;
7+
```hava
8+
package com.litongjava.tio.boot.hello.tcp.packet;
9+
1310
import com.litongjava.tio.core.intf.Packet;
1411
1512
/**
@@ -29,11 +26,12 @@ public class DemoPacket extends Packet {
2926
}
3027
```
3128

32-
```
33-
package com.litongjava.tio.boot.hello.tcp;
29+
```java
30+
package com.litongjava.tio.boot.hello.tcp.handler;
3431

3532
import java.nio.ByteBuffer;
3633

34+
import com.litongjava.tio.boot.hello.tcp.packet.DemoPacket;
3735
import com.litongjava.tio.boot.tcp.ServerTcpHandler;
3836
import com.litongjava.tio.core.ChannelContext;
3937
import com.litongjava.tio.core.Tio;
@@ -52,7 +50,7 @@ public class DemoHandler implements ServerTcpHandler {
5250
// 获取由ByteBuffer支持的字节数组
5351
byte[] bytes = new byte[readableLength];
5452
buffer.get(bytes);
55-
// 封装为ShowcasePacket
53+
// 封装为Packet
5654
DemoPacket imPackage = new DemoPacket();
5755
imPackage.setBody(bytes);
5856
return imPackage;
@@ -90,18 +88,19 @@ public class DemoHandler implements ServerTcpHandler {
9088
DemoPacket responsePacket = new DemoPacket();
9189
responsePacket.setBody(bytes);
9290
// 响应消息
93-
log.info("开始响应");
91+
log.info("开始发送响应");
9492
Tio.send(channelContext, responsePacket);
9593
log.info("响应完成");
9694
}
9795
}
9896
```
9997

100-
```
101-
package com.litongjava.tio.boot.hello.tcp;
98+
DemoListener
10299

103-
import com.litongjava.jfinal.aop.annotation.Component;
104-
import com.litongjava.tio.boot.tcp.ServerListener;
100+
```java
101+
package com.litongjava.tio.boot.hello.tcp.listener;
102+
103+
import com.litongjava.tio.boot.tcp.ServerHanlderListener;
105104
import com.litongjava.tio.core.ChannelContext;
106105
import com.litongjava.tio.core.intf.Packet;
107106

@@ -158,13 +157,13 @@ public class DemoListener implements ServerHanlderListener {
158157
}
159158
```
160159

161-
```
162-
package com.litongjava.tio.boot.hello.config;
160+
```java
161+
package com.litongjava.tio.boot.hello.tcp.config;
163162

164163
import com.litongjava.jfinal.aop.annotation.AInitialization;
165164
import com.litongjava.jfinal.aop.annotation.BeforeStartConfiguration;
166-
import com.litongjava.tio.boot.hello.tcp.DemoHandler;
167-
import com.litongjava.tio.boot.hello.tcp.DemoListener;
165+
import com.litongjava.tio.boot.hello.tcp.handler.DemoHandler;
166+
import com.litongjava.tio.boot.hello.tcp.listener.DemoListener;
168167
import com.litongjava.tio.boot.server.TioBootServer;
169168
import com.litongjava.tio.boot.tcp.ServerTcpHandler;
170169

@@ -182,6 +181,24 @@ public class TioBootServerConfig {
182181
}
183182
```
184183

184+
运行日志
185+
186+
```
187+
2024-01-29 12:01:09.841 [tio-group-6] INFO DemoListener.onAfterConnected:13 - server:0.0.0.0:80, client:127.0.0.1:2820,true,false
188+
2024-01-29 12:01:09.842 [tio-group-7] INFO DemoListener.onAfterReceivedBytes:21 - server:0.0.0.0:80, client:127.0.0.1:2820,2
189+
2024-01-29 12:01:09.842 [tio-group-7] INFO DemoHandler.decode:20 - buffer:java.nio.HeapByteBuffer[pos=0 lim=2 cap=30720]
190+
2024-01-29 12:01:09.842 [tio-group-7] INFO DemoListener.onAfterDecoded:17 - server:0.0.0.0:80, client:127.0.0.1:2820,com.litongjava.tio.boot.hello.tcp.packet.DemoPacket@27114133,2
191+
2024-01-29 12:01:09.842 [tio-group-7] INFO DemoHandler.handler:53 - received:gu
192+
2024-01-29 12:01:09.842 [tio-group-7] INFO DemoHandler.handler:56 - sendMessage:echo:gu
193+
2024-01-29 12:01:09.842 [tio-group-7] INFO DemoHandler.handler:62 - 开始响应
194+
2024-01-29 12:01:09.843 [tio-group-7] INFO DemoHandler.handler:64 - 响应完成
195+
2024-01-29 12:01:09.843 [tio-worker-4] INFO DemoHandler.encode:35 - encode:7
196+
2024-01-29 12:01:09.843 [tio-group-7] INFO DemoListener.onAfterHandled:29 - server:0.0.0.0:80, client:127.0.0.1:2820,com.litongjava.tio.boot.hello.tcp.packet.DemoPacket@27114133,0
197+
2024-01-29 12:01:09.844 [tio-group-8] INFO DemoListener.onAfterSent:25 - server:0.0.0.0:80, client:127.0.0.1:2820,com.litongjava.tio.boot.hello.tcp.packet.DemoPacket@5da82e61
198+
2024-01-29 12:01:09.845 [tio-worker-5] INFO DemoListener.onBeforeClose:44 - server:0.0.0.0:80, client:127.0.0.1:2820,null,对方关闭了连接,true
199+
200+
```
201+
185202
### 1. `DemoPacket`
186203

187204
这是一个继承自 `Packet` 的类,用于表示一个 socket 消息包。它主要包含一个 `byte[] body` 字段来存储消息体的数据。
@@ -269,4 +286,16 @@ public class TioBootServerConfig {
269286

270287
### 总结
271288

272-
整体上,这段代码展示了如何使用 `tio-boot` 框架来构建一个同时支持 TCP、HTTP 和 WebSocket 协议的服务器。它通过定义消息包的格式(`DemoPacket`)、处理逻辑(`DemoHandler`)、事件监听(`DemoListener`)以及应用程序启动配置(`ServerConfig`),实现了一个基本的网络通信服务器。
289+
整体上,这段代码展示了如何使用 `tio-boot` 框架来构建一个同时支持 TCP、HTTP 和 WebSocket 协议的服务器。它通过定义消息包的格式(`DemoPacket`)、处理逻辑(`DemoHandler`)、事件监听(`DemoListener`)以及应用程序启动配置(`ServerConfig`),实现了一个基本的网络通信服务器。
290+
291+
### 测试源码地址
292+
293+
https://github.com/litongjava/java-ee-tio-boot-study/tree/main/tio-boot-latest-study/tio-boot-tcp-hello
294+
295+
### ByteBufferPacket
296+
297+
如果你不行将 ByteBuffer 进行编码和解码,可以使用 tio-boot 提供的 ByteBufferPacket 直接将 ByteBuffer 添加到 ByteBufferPacket 中
298+
299+
```
300+
import com.litongjava.tio.boot.tcp.ByteBufferPacket
301+
```

0 commit comments

Comments
 (0)