Netty (2) - el servidor y el proceso de inicio del cliente

A. iniciar el análisis de proceso de servidor

1. Cuatro atributo debe

Desde un simple servidor busca de demostración

  • NIOServer
public class NIOServer {
    public static void main(String[] args) {
        ServerBootstrap serverBootstrap = new ServerBootstrap(); // 启动引导器
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // 监听组
        NioEventLoopGroup workerGroup = new NioEventLoopGroup(); // 工作组

        serverBootstrap.group(bossGroup, workerGroup)  // 指定线程模型:监听组和工作组
                .channel(NioServerSocketChannel.class) // IO模型:NIO模式
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    // 初始化channel:连接后的读写逻辑
                    protected void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new StringDecoder());
                        ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                            @Override
                            protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
                                System.out.println(String.format("服务端接收到消息:%s", msg));
                            }
                        });
                    }
                }).bind(8000);  //启动端口
    }
}

Para iniciar el servidor de Netty, debe especificar los atributos cuatro categorías deben, a saber:

  1. modelo de subprocesos
  2. modelo IP
  3. Después de la lógica de lectura y escritura conectado
  4. puerto de inicio

Aquí Insertar imagen Descripción

2. Guía de inicio: serverBootstrap

Todos los servicios se registran y se configuran en el motor de arranque.

3. Modelo del hilo: bossGroup y workerGroup

Creó dos NioEventLoopGroup, dos objetos pueden ser vistos como dos grupos de modelo de programación tradicional rosca IO, bossGroupindica que el puerto de escucha, accepthilo nuevo conjunto de conexiones, workerGroupque representa el grupo de hilos de cada conexión de datos a leer y escribir. Después de recibir una conexión bossGroup irá al proceso de workerGroup. Por último, .group(bossGroup, workerGroup)especificar el modelo de hilos para ir.

modelo 4.IO: NioServerSocketChannel y OioServerSocketChannel

Por .channel(NioServerSocketChannel.class)especificando modelo IP, por supuesto, también hay otras opciones, si desea especificar el modelo IO para la BIO, esta configuración OioServerSocketChannel.classde tipo no puede generalmente designado como BIO modelo de hilos, porque Netty ventaja es que NIO.

5. lógica de escritura conectado

.childHandler()El método, para crear una clase de esta guía ChannelInitializer, en donde los datos principales se define en cada lectura posterior y el acceso a escritura, servicio de procesamiento de la lógica. También puede crear una nueva clase y hereda ChannelInboundHandlerAdapterde leer y escribir la lógica.

6. Los otros parámetros del método guía

  • childHandler (): para guiar las definiciones de clase para crear datos ChannelInitializer lectura y escritura posteriores cada conexión, la lógica de procesamiento de servicio, parámetros genéricos es NioSocketChannel Netty abstracto tipo NIO de conexión, pero también abstracta tipo NioServerSocketChannel de conexión de NIO

  • bind (): vuelve a asíncrona ChannelFuture, a ChannelFuture añadir el detector GenericFutureListener, puerto de escucha está obligado dentro GenericFutureListener método exitoso de operationComplete

  • childHandler (): el procesamiento de la lógica para la lectura y escritura de datos para especificar un nuevo proceso de conexión, controlador on () se utiliza para especificar proceso de inicio del servidor de la lógica

  • attr (): es decir, NioServerSocketChannel atributos especifican a medida para canalizar parte del lado del servidor, () extraído por el channel.attr atributo, para mantener un mapa NioServerSocketChannel

  • childAttr (): cada uno de ellos conectado a especificar atributos personalizados () extraídos por el atributo channel.attr

  • childOption (): para cada uno de la conexión TCP subyacente establecer algunas propiedades relacionadas:

       ChannelOption.SO_KEEPALIVE表示是否开启TCP底层心跳机制,true为开启
       ChannelOption.SO_REUSEADDR表示端口释放后立即就可以被再次使用,因为一般来说,一个端口释放后会等待两分钟之后才能再被使用
       ChannelOption.TCP_NODELAY表示是否开始Nagle算法,true表示关闭,false表示开启,通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭,如果需要减少发送次数减少网络交互就开启
    
  • opción (): establece algunas propiedades relacionadas con el canal de servidor TCP subyacente:

       ChannelOption.SO_BACKLOG表示系统用于临时存放已完成三次握手的请求的队列的最大长度,如果连接建立频繁,服务器处理创建新连接较慢,适当调大该参数
    

II. El análisis de procesos de inicio del cliente

Desde un simple cliente Netty ve Demostración

  • NIOClient
public class NIOClient {
    public static void main(String[] args) throws InterruptedException {
        Bootstrap bootstrap = new Bootstrap(); // 引导启动类
        NioEventLoopGroup group = new NioEventLoopGroup(); // 工作组

        bootstrap
        .group(group) // 添加线程模型
        .channel(NioSocketChannel.class) // 添加IO模型
        .handler(new ChannelInitializer<SocketChannel>() {// 添加连接后的读写逻辑
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                ch.pipeline().addLast(new StringEncoder());
            }
        });

        Channel channel = bootstrap.connect("127.0.0.1", 8000).channel(); // 建立连接
        while (true) {
            String message = String.format("HelloWorld From %s", new SimpleDateFormat("hh:mm:ss").format(new Date()));
            // 通过连接向服务端发送消息
            channel.writeAndFlush(message);
            Thread.sleep(2000);
        }
    }
}

Para el inicio del cliente, el inicio y el final del servicio se sigue necesitar enhebrar modelo, modelos de IO, y la lógica de procesamiento de negocios y conexión a la conexión de puerto serie, cuatro parámetros similares, grandes, comienzan el proceso es el siguiente:
Aquí Insertar imagen Descripción

Otros métodos similares al servidor

Publicados 309 artículos originales · ganado elogios 205 · Vistas de 300.000 +

Supongo que te gusta

Origin blog.csdn.net/pbrlovejava/article/details/104159817
Recomendado
Clasificación