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)); 
原文地址:https://www.cnblogs.com/gjq1126-web/p/15078497.html