0%

java | 采集端口数据

例子描述

使用网络调试助手,向固定端口发送数据,netty 可以采集该端口的数据。

该例子有以下的特点

  • 可以处理断开连接、重连接
  • 接受指定端口数据

NettyClient

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bootstrap
.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
// 设置数据处理时间上的限定,比如,下面是 30s 如果 netty 没有取到数据的话,就会触发 ClientConnect 的 userEventTriggered 方法
ch.pipeline().addLast(new IdleStateHandler(30, 0, 0, TimeUnit.SECONDS));
// ClientConnect 主要用于处理连接、断开、异常等
ch.pipeline().addLast(new ClientConnect(netty));
// 编码器,详情请参考 README.md
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(100, 0, 4, 0, 0, true));
// 存储数据,处理异常
ch.pipeline().addLast(new ClientHandler());
}
});

这个比较有意思的是增加了两个处理器,一个专门用来管理连接,一个专门用来管理数据处理。

连接代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void connect() {
System.out.println(Thread.currentThread());
bootstrap.connect("127.0.0.1", 5566).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (future.isSuccess()) {
System.out.println("连接成功");
} else {
System.out.println("连接失败");

// 重新连接

future.channel().eventLoop().schedule(new Runnable() {
@Override
public void run() {
System.out.println("重新连接");
connect();
}
}, 5, TimeUnit.SECONDS);
}
}

;
});
}

下载代码 rar 压缩包

请我喝杯咖啡吧~