概述
服务端需要经过socket、bind、accept、read、write等步骤,客户端需要经过socket、connect、read、write等步骤,后续此系列文章会对每一个步骤如何发生进行分析。
- netty4源码分析-线程的创建
- netty4源码分析-socket
- netty4源码分析-bind
-
Netty4源码分析-NioEventLoop实现的线程运行逻辑
- netty4源码分析-connect
- netty4源码分析-accept
- netty4源码分析-write
- netty4源码分析-flush
- netty4源码分析-read
- 通信总结
以下是服务端和客户端的测试代码,后面的分析以这份代码为基础,目前使用的Netty的版本是4.0.4.Final及以上
- 服务端:
- /*
- * Copyright 2012 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
- package io.netty.example.echo;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelOption;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.channel.socket.nio.NioServerSocketChannel;
- import io.netty.handler.logging.LogLevel;
- import io.netty.handler.logging.LoggingHandler;
- /**
- * Echoes back any received data from a client.
- */
- public class EchoServer {
- private final int port;
- public EchoServer(int port) {
- this.port = port;
- }
- public void run() throws Exception {
- // Configure the server.
- EventLoopGroup bossGroup = new NioEventLoopGroup();
- EventLoopGroup workerGroup = new NioEventLoopGroup();
- try {
- ServerBootstrap b = new ServerBootstrap();
- b.group(bossGroup, workerGroup)
- .channel(NioServerSocketChannel.class)
- .option(ChannelOption.SO_BACKLOG, 100)
- .handler(new LoggingHandler(LogLevel.INFO))
- .childHandler(new ChannelInitializer<SocketChannel>() {
- @Override
- public void initChannel(SocketChannel ch) throws Exception {
- ch.pipeline().addLast(
- //new LoggingHandler(LogLevel.INFO),
- new EchoServerHandler());
- }
- });
- // Start the server.
- ChannelFuture f = b.bind(port).sync();
- // Wait until the server socket is closed.
- f.channel().closeFuture().sync();
- } finally {
- // Shut down all event loops to terminate all threads.
- bossGroup.shutdownGracefully();
- workerGroup.shutdownGracefully();
- }
- }
- public static void main(String[] args) throws Exception {
- int port;
- if (args.length > 0) {
- port = Integer.parseInt(args[0]);
- } else {
- port = 8080;
- }
- new EchoServer(port).run();
- }
- }
- /*
- * Copyright 2012 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
- package io.netty.example.echo;
- import io.netty.channel.ChannelHandler.Sharable;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- /**
- * Handler implementation for the echo server.
- */
- @Sharable
- public class EchoServerHandler extends ChannelInboundHandlerAdapter {
- private static final Logger logger = Logger.getLogger(
- EchoServerHandler.class.getName());
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- ctx.write(msg);
- }
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
- ctx.flush();
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
- // Close the connection when an exception is raised.
- logger.log(Level.WARNING, "Unexpected exception from downstream.", cause);
- ctx.close();
- }
- }
- 客户端:
- /*
- * Copyright 2012 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
- package io.netty.example.echo;
- import io.netty.bootstrap.Bootstrap;
- import io.netty.channel.ChannelFuture;
- import io.netty.channel.ChannelInitializer;
- import io.netty.channel.ChannelOption;
- import io.netty.channel.EventLoopGroup;
- import io.netty.channel.nio.NioEventLoopGroup;
- import io.netty.channel.socket.SocketChannel;
- import io.netty.channel.socket.nio.NioSocketChannel;
- /**
- * Sends one message when a connection is open and echoes back any received
- * data to the server. Simply put, the echo client initiates the ping-pong
- * traffic between the echo client and server by sending the first message to
- * the server.
- */
- public class EchoClient {
- private final String host;
- private final int port;
- private final int firstMessageSize;
- public EchoClient(String host, int port, int firstMessageSize) {
- this.host = host;
- this.port = port;
- this.firstMessageSize = firstMessageSize;
- }
- public void run() throws Exception {
- // Configure the client.
- EventLoopGroup group = new NioEventLoopGroup();
- try {
- Bootstrap b = new Bootstrap();
- b.group(group)
- .channel(NioSocketChannel.class)
- .option(ChannelOption.TCP_NODELAY, true)
- .handler(new ChannelInitializer<SocketChannel>() {
- @Override
- public void initChannel(SocketChannel ch) throws Exception {
- ch.pipeline().addLast(
- //new LoggingHandler(LogLevel.INFO),
- new EchoClientHandler(firstMessageSize));
- }
- });
- // Start the client.
- ChannelFuture f = b.connect(host, port).sync();
- // Wait until the connection is closed.
- f.channel().closeFuture().sync();
- } finally {
- // Shut down the event loop to terminate all threads.
- group.shutdownGracefully();
- }
- }
- public static void main(String[] args) throws Exception {
- // Print usage if no argument is specified.
- if (args.length < 2 || args.length > 3) {
- System.err.println(
- "Usage: " + EchoClient.class.getSimpleName() +
- " <host> <port> [<first message size>]");
- return;
- }
- // Parse options.
- final String host = args[0];
- final int port = Integer.parseInt(args[1]);
- final int firstMessageSize;
- if (args.length == 3) {
- firstMessageSize = Integer.parseInt(args[2]);
- } else {
- firstMessageSize = 256;
- }
- new EchoClient(host, port, firstMessageSize).run();
- }
- }
- /*
- * Copyright 2012 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
- package io.netty.example.echo;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.ChannelInboundHandlerAdapter;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- /**
- * Handler implementation for the echo client. It initiates the ping-pong
- * traffic between the echo client and server by sending the first message to
- * the server.
- */
- public class EchoClientHandler extends ChannelInboundHandlerAdapter {
- private static final Logger logger = Logger.getLogger(
- EchoClientHandler.class.getName());
- private final ByteBuf firstMessage;
- /**
- * Creates a client-side handler.
- */
- public EchoClientHandler(int firstMessageSize) {
- if (firstMessageSize <= 0) {
- throw new IllegalArgumentException("firstMessageSize: " + firstMessageSize);
- }
- firstMessage = Unpooled.buffer(firstMessageSize);
- for (int i = 0; i < firstMessage.capacity(); i ++) {
- firstMessage.writeByte((byte) i);
- }
- }
- @Override
- public void channelActive(ChannelHandlerContext ctx) {
- ctx.writeAndFlush(firstMessage);
- }
- @Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
- ctx.write(msg);
- }
- @Override
- public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
- ctx.flush();
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
- // Close the connection when an exception is raised.
- logger.log(Level.WARNING, "Unexpected exception from downstream.", cause);
- ctx.close();
- }
- }
最后
以上就是粗暴蜜粉为你收集整理的netty 4.x源码分析的全部内容,希望文章能够帮你解决netty 4.x源码分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复