• Netty 简单的通信


    1.创建Maven项目

    2.pom.xml的引入

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty</artifactId>
        <version>3.10.6.Final</version>
    </dependency>

     3.服务端代码

    package com.example.demo.netty;
    
    import org.jboss.netty.bootstrap.ServerBootstrap;
    import org.jboss.netty.channel.*;
    import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
    import org.jboss.netty.handler.codec.string.StringDecoder;
    import org.jboss.netty.handler.codec.string.StringEncoder;
    
    import java.net.InetSocketAddress;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @program: demo
     * @description:
     * @author: Gaojq
     * @create: 2021-07-30 08:55
     **/
    public class NettyServer {
    
        public static void main(String[] args) {
            // 1.创建服务对象
            ServerBootstrap bootstrap = new ServerBootstrap();
    
            // 2.创建两个线程池 监听端口和NIO监听
            ExecutorService bossExecutor = Executors.newCachedThreadPool();// 监听端口
            ExecutorService workerExecutor = Executors.newCachedThreadPool();// NIO监听
    
            // 3.将线程池放入工厂 此处是NioServerSocketChannelFactory方法 客户端不同
            bootstrap.setFactory(new NioServerSocketChannelFactory(bossExecutor,workerExecutor));
    
            // 4.设置管道工程
            bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
                @Override
                public ChannelPipeline getPipeline() throws Exception {
                    ChannelPipeline pipeline = Channels.pipeline();
                    pipeline.addLast("decoder",new StringDecoder());
                    pipeline.addLast("encoder",new StringEncoder());
                    pipeline.addLast("serverHandler", new ServerHandler());
                    return pipeline;
                }
            });
    
            bootstrap.bind(new InetSocketAddress(8080));
            System.out.println("netty 服务端启动成功~");
    
        }
    
    }
    
    /**
     *
     */
    class ServerHandler extends SimpleChannelHandler{
    
        // 接收 客户端数据
        @Override
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
            super.messageReceived(ctx, e);
            System.out.println("messageReceived~服务端接收到客户端的消息:"+e.getMessage());
            Channel channel = ctx.getChannel();
            channel.write("你好啊");// 返回客户端消息
        }
    
    
        // 接收出现异常
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
            super.exceptionCaught(ctx, e);
            System.out.println("exceptionCaught");
        }
    
        // 必须要建立连接 关闭通道的时候才会触发
        @Override
        public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
            super.channelDisconnected(ctx, e);
            System.out.println("channelDisconnected");
        }
    
        // 通道关闭的时候才会触发
        @Override
        public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
            super.channelClosed(ctx, e);
            System.out.println("channelClosed");
        }
    }

    4.客户端代码

    package com.example.demo.netty;
    
    import org.jboss.netty.bootstrap.ClientBootstrap;
    import org.jboss.netty.channel.*;
    import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
    import org.jboss.netty.handler.codec.string.StringDecoder;
    import org.jboss.netty.handler.codec.string.StringEncoder;
    
    import java.net.InetSocketAddress;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @program: demo
     * @description:
     * @author: Gaojq
     * @create: 2021-07-30 08:55
     **/
    public class NettyClient {
    
        public static void main(String[] args) {
            ClientBootstrap clientBootstrap = new ClientBootstrap();
    
            ExecutorService bossExecutor = Executors.newCachedThreadPool();
            ExecutorService workExecutor = Executors.newCachedThreadPool();
          clientBootstrap.setFactory(
    new NioClientSocketChannelFactory(bossExecutor,workExecutor)); clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline channelPipeline = Channels.pipeline(); channelPipeline.addLast("decoder",new StringDecoder()); channelPipeline.addLast("encoder",new StringEncoder()); channelPipeline.addLast("clientHandler", new ClientHandler()); return channelPipeline; } }); ChannelFuture connect = clientBootstrap.connect(new InetSocketAddress("127.0.0.1", 8080)); Channel channel = connect.getChannel(); channel.write("nice");// 向服务器发送消息 } } class ClientHandler extends SimpleChannelHandler{ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { super.messageReceived(ctx, e); System.out.println("messageReceived~客户端接收到服务端返回的消息:"+e.getMessage()); } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { super.exceptionCaught(ctx, e); System.out.println("exceptionCaught"); } @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { super.channelDisconnected(ctx, e); System.out.println("channelDisconnected"); } @Override public void childChannelClosed(ChannelHandlerContext ctx, ChildChannelStateEvent e) throws Exception { super.childChannelClosed(ctx, e); System.out.println("childChannelClosed"); } }

     5.客户端与服务端主要的区别就是:

    • 创建的服务不同 客户端是 ClientBootstrap ,而服务器创建的服务是 ServerBootstrap 
    • 第三步 对工程的设置不同 客户端是clientBootstrap.setFactory(new NioClientSocketChannelFactory,服务端为bootstrap.setFactory(new NioServerSocketChannelFactory 
    • 配置管道的处理服务不同  客户端是channelPipeline.addLast("clientHandler", new ClientHandler());,服务端为  pipeline.addLast("serverHandler", new ServerHandler()); 
    • 最后就是建立socket的部分 客户端是 clientBootstrap.connect(new InetSocketAddress("127.0.0.1", 8080));,服务端为  bootstrap.bind(new InetSocketAddress(8080)); 
  • 相关阅读:
    node03- FS内置模块
    node03- CommonJS
    删除当前目录下的所有文件夹和文件
    解决 idea 项目中Error:java: 无效的标记
    Raid0,Raid1,Raid5,Raid10 总结
    Tcpdump命令
    ClassNotFoundException 和 NoClassDefFoundError 区别
    Dart-List里面常用的属性和方法
    CSS实现等分布局的4种方式
    iOS项目添加CocoaPods
  • 原文地址:https://www.cnblogs.com/gjq1126-web/p/15078497.html
走看看 - 开发者的网上家园