0%

java | channel 连接与处理

连接建立的细节。

sync

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
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.redisc;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;

import java.io.IOException;
import java.net.InetSocketAddress;

public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
ChannelFuture channelFuture = new Bootstrap()
.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
nioSocketChannel.pipeline().addLast(new StringEncoder());

}
})
// 连接服务器
// 异步非阻塞,调用线程是 main 线程
// 真正执行连接的是另一个线程,是一个 NIO 线程
.connect(new InetSocketAddress("localhost", 8000));
// 建立连接的过程是相对较慢的
// 如果没有 sync ,那么会直接执行下面那一行代码
// 再没有连接成功后,就发送数据了
// 所以 sync 是等待连接
channelFuture.sync(); // 阻塞住
Channel channel = channelFuture.channel();
channel.writeAndFlush("123");
}
}

addListener

这个也是解决连接后的,不过,addListener 相当于是一个回调。

也就是 sync 是同步处理结果,addListener 是异步处理结果。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.redisc;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;

import java.io.IOException;
import java.net.InetSocketAddress;

public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
ChannelFuture channelFuture = new Bootstrap()
.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
nioSocketChannel.pipeline().addLast(new StringEncoder());

}
})
// 连接服务器
// 异步非阻塞,调用线程是 main 线程
// 真正执行连接的是另一个线程,是一个 NIO 线程
.connect(new InetSocketAddress("localhost", 8000));
channelFuture.addListener(new ChannelFutureListener() {
@Override
// 在 nio 线程连接好,调用
public void operationComplete(ChannelFuture channelFuture) throws Exception {
Channel channel = channelFuture.channel();
channel.writeAndFlush("123");
}
});
}
}
请我喝杯咖啡吧~