从bio到nio到netty实现原理浅析
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
public class SocketServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已经启动!");
// 接收客户端发送的信息
Socket socket = server.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println(info);
}
// 向客户端写入信息
OutputStream os = socket.getOutputStream();
String str = "欢迎登陆到server服务器!";
os.write(str.getBytes());
// 关闭文件流
os.close();
br.close();
is.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Bio {
public static void main(String[] args) {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已经启动!");
// 接收客户端发送的信息
while(true){
Socket socket = null;
try {
socket = server.accept();
} catch (IOException e) {
e.printStackTrace();
}
new Thread(() ->{
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println(info);
}
// 向客户端写入信息
OutputStream os = socket.getOutputStream();
String str = "欢迎登陆到server服务器!";
os.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
public class Nio {
// 本地字符集
private static final String LocalCharSetName = "UTF-8";
// 本地服务器监听的端口
private static final int Listenning_Port = 8888;
// 缓冲区大小
private static final int Buffer_Size = 1024;
// 超时时间,单位毫秒
private static final int TimeOut = 3000;
public static void main(String[] args) throws IOException {
// 创建一个在本地端口进行监听的服务Socket信道.并设置为非阻塞方式
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(Listenning_Port));
serverChannel.configureBlocking(false);
// 创建一个选择器并将serverChannel注册到它上面
Selector selector = Selector.open();
//设置为客户端请求连接时,默认客户端已经连接上
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// 轮询监听key,select是阻塞的,accept()也是阻塞的
if (selector.select(TimeOut) == 0) {
System.out.println(".");
continue;
}
// 有客户端请求,被轮询监听到
Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
while (keyIter.hasNext()) {
SelectionKey key = keyIter.next();
if (key.isAcceptable()) {
SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();
clientChannel.configureBlocking(false);
//意思是在通过Selector监听Channel时对读事件感兴趣
clientChannel.register(selector, SelectionKey.OP_READ,
ByteBuffer.allocate(Buffer_Size));
}
else if (key.isReadable()) {
SocketChannel clientChannel = (SocketChannel) key.channel();
// 接下来是java缓冲区io操作,避免io堵塞
ByteBuffer buffer = (ByteBuffer) key.attachment();
buffer.clear();
long bytesRead = clientChannel.read(buffer);
if (bytesRead == -1) {
// 没有读取到内容的情况
clientChannel.close();
} else {
// 将缓冲区准备为数据传出状态
buffer.flip();
// 将获得字节字符串(使用Charset进行解码)
String receivedString = Charset
.forName(LocalCharSetName).newDecoder().decode(buffer).toString();
System.out.println("接收到信息:" + receivedString);
String sendString = "你好,客户端. 已经收到你的信息" + receivedString;
buffer = ByteBuffer.wrap(sendString.getBytes(LocalCharSetName));
clientChannel.write(buffer);
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
}
keyIter.remove();
}
}
}
}
public class Netty {
public void start(int port) throws Exception
{
ServerBootstrap strap = new ServerBootstrap();
//主线程
EventLoopGroup bossGroup = new NioEventLoopGroup();
//从线程
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
strap.group(bossGroup, workerGroup).
//主线程监听通道
channel(NioServerSocketChannel.class).
option(ChannelOption.SO_BACKLOG, 1024).
//定义从线程的handler链,责任链模式
childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyServerHandler());
}
});
ChannelFuture future=strap.bind(port).sync();
future.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
System.out.println("start server");
new Netty().start(8000);
}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/qq_20597727/article/details/80789272
粉丝福利:Java从入门到入土学习路线图
👇👇👇
👆长按上方微信二维码 2 秒
感谢点赞支持下哈
评论