`
Donald_Draper
  • 浏览: 981130 次
社区版块
存档分类
最新评论

netty 网络通信示例四

阅读更多
netty 网络通信示例一 :http://donald-draper.iteye.com/blog/2383326
netty 网络通信示例二:http://donald-draper.iteye.com/blog/2383328
netty 网络通信示例三:http://donald-draper.iteye.com/blog/2383392
上一篇我们在通过一个实例,来看一个用到编码器与解码器的示例,示例作用为服务器提供客户端计算请求,并将结果返回给客户端。之前实例的编解码器都是我们自己实现的,今天来看一个Netty基于textline编解码器通信示例:
服务端:
package netty.main.telnet;

import java.net.InetSocketAddress;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.SelfSignedCertificate;
import netty.initializer.telnet.TelnetServerInitializer;

/**
 * textline通信server
 * @author donald
 * 2017年6月30日
 * 上午11:07:08
 */
public final class TelnetServer {
	private static final Logger log = LoggerFactory.getLogger(TelnetServer.class);
	private static final boolean SSL = System.getProperty("ssl") != null;
    private static final  String ip = "192.168.31.153";
    private static final int port = Integer.parseInt(System.getProperty("port", SSL? "10010" : "10020"));
    public static void main(String[] args) throws Exception {
        // Configure SSL.
        final SslContext sslCtx;
        if (SSL) {
            SelfSignedCertificate ssc = new SelfSignedCertificate();
            sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
        } else {
            sslCtx = null;
        }
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap serverBoot = new ServerBootstrap();
            serverBoot.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new TelnetServerInitializer(sslCtx));
            InetSocketAddress inetSocketAddress = new InetSocketAddress(ip,port);
            ChannelFuture f = serverBoot.bind(inetSocketAddress).sync();
            log.info("=========Server is start=========");
            f.channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

服务端处理器Initializer:
package netty.initializer.telnet;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.ssl.SslContext;
import netty.handler.telnet.TelnetServerHandler;

/**
 * Creates a newly configured {@link ChannelPipeline} for a new channel.
 */
public class TelnetServerInitializer extends ChannelInitializer<SocketChannel> {
    private static final StringDecoder DECODER = new StringDecoder();
    private static final StringEncoder ENCODER = new StringEncoder();
    private static final TelnetServerHandler SERVER_HANDLER = new TelnetServerHandler();
    private final SslContext sslCtx;
    public TelnetServerInitializer(SslContext sslCtx) {
        this.sslCtx = sslCtx;
    }
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        if (sslCtx != null) {
            pipeline.addLast(sslCtx.newHandler(ch.alloc()));
        }
        // Add the text line codec combination first,
        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        // the encoder and decoder are static as these are sharable
        pipeline.addLast(DECODER);
        pipeline.addLast(ENCODER);
        // and then business logic.
        pipeline.addLast(SERVER_HANDLER);
    }
}

服务端handler:
package netty.handler.telnet;

import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.net.InetAddress;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * @author donald
 * 2017年6月30日
 * 上午11:02:29
 * Sharable表示此对象在channel间共享
 */
@Sharable
public class TelnetServerHandler extends SimpleChannelInboundHandler<String> {
	private static final Logger log = LoggerFactory.getLogger(TelnetServerHandler.class);
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // Send greeting for a new connection.
        ctx.write("Welcome to " + InetAddress.getLocalHost().getHostName() + "!\r\n");
        ctx.write("It is " + new Date() + " now.\r\n");
        ctx.flush();
    }

    @Override
    public void channelRead0(ChannelHandlerContext ctx, String request) throws Exception {
        // Generate and write a response.
        String response;
        boolean close = false;
        log.info("========recieve message from client:"+request);
        if (request.isEmpty()) {
            response = "Please type something.\r\n";
        } else if ("bye".equals(request.toLowerCase())) {
            response = "Have a good day!\r\n";
            close = true;
        } else {
            response = "Did you say '" + request + "'?\r\n";
        }

        // We do not need to write a ChannelBuffer here.
        // We know the encoder inserted at TelnetPipelineFactory will do the conversion.
        ChannelFuture future = ctx.write(response);

        // Close the connection after sending 'Have a good day!'
        // if the client has sent 'bye'.
        if (close) {
            future.addListener(ChannelFutureListener.CLOSE);
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}

客户端:
package netty.main.telnet;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import netty.initializer.telnet.TelnetClientInitializer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * textline通信Client
 * @author donald
 * 2017年6月30日
 * 上午11:26:30
 */
public final class TelnetClient {
	private static final Logger log = LoggerFactory.getLogger(TelnetServer.class);
    static final boolean SSL = System.getProperty("ssl") != null;
    public static final String ip = System.getProperty("host", "192.168.31.153");
    public static final int port = Integer.parseInt(System.getProperty("port", SSL? "10010" : "10020"));

    public static void main(String[] args) throws Exception {
        // Configure SSL.
        final SslContext sslCtx;
        if (SSL) {
            sslCtx = SslContextBuilder.forClient()
                .trustManager(InsecureTrustManagerFactory.INSTANCE).build();
        } else {
            sslCtx = null;
        }

        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .handler(new TelnetClientInitializer(sslCtx));
            InetSocketAddress inetSocketAddress = new InetSocketAddress(ip,port);
            // Start the connection attempt.
            Channel ch = b.connect(inetSocketAddress).sync().channel();
            log.info("=========Client is start=========");
            // Read commands from the stdin.
            ChannelFuture lastWriteFuture = null;
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            for (;;) {
                String line = in.readLine();
                if (line == null) {
                    break;
                }
                // Sends the received line to the server.
                lastWriteFuture = ch.writeAndFlush(line + "\r\n");

                // If user typed the 'bye' command, wait until the server closes
                // the connection.
                if ("bye".equals(line.toLowerCase())) {
                    ch.closeFuture().sync();
                    break;
                }
            }
            // Wait until all messages are flushed before closing the channel.
            if (lastWriteFuture != null) {
                lastWriteFuture.sync();
            }
        } finally {
            group.shutdownGracefully();
        }
    }
}


客户端处理器Initializer:
package netty.initializer.telnet;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.ssl.SslContext;
import netty.handler.telnet.TelnetClientHandler;
import netty.main.telnet.TelnetClient;

/**
 * Creates a newly configured {@link ChannelPipeline} for a new channel.
 */
public class TelnetClientInitializer extends ChannelInitializer<SocketChannel> {
    private static final StringDecoder DECODER = new StringDecoder();
    private static final StringEncoder ENCODER = new StringEncoder();
    private static final TelnetClientHandler CLIENT_HANDLER = new TelnetClientHandler();
    private final SslContext sslCtx;
    public TelnetClientInitializer(SslContext sslCtx) {
        this.sslCtx = sslCtx;
    }
    @Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline pipeline = ch.pipeline();

        if (sslCtx != null) {
            pipeline.addLast(sslCtx.newHandler(ch.alloc(), TelnetClient.ip, TelnetClient.port));
        }
        // Add the text line codec combination first,
        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        pipeline.addLast(DECODER);
        pipeline.addLast(ENCODER);

        // and then business logic.
        pipeline.addLast(CLIENT_HANDLER);
    }
}


客户端处理器:

package netty.handler.telnet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

/**
 * 
 * @author donald
 * 2017年6月30日
 * 上午10:59:47
 * Sharable表示此对象在channel间共享
 */
@Sharable
public class TelnetClientHandler extends SimpleChannelInboundHandler<String> {
    private static final Logger log = LoggerFactory.getLogger(TelnetClientHandler.class);
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
    	log.info("====recieve message from server:"+msg);
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}


启动服务端与客户端,在客户端控制台输入hello server,换行输入bye,
服务端:
[INFO ] 2017-07-06 12:56:52 io.netty.handler.logging.LoggingHandler [id: 0x1ee25138] REGISTERED
[INFO ] 2017-07-06 12:56:52 io.netty.handler.logging.LoggingHandler [id: 0x1ee25138] BIND: /192.168.31.153:10020
[INFO ] 2017-07-06 12:56:52 netty.main.telnet.TelnetServer =========Server is start=========
[INFO ] 2017-07-06 12:56:52 io.netty.handler.logging.LoggingHandler [id: 0x1ee25138, L:/192.168.31.153:10020] ACTIVE
[INFO ] 2017-07-06 12:56:58 io.netty.handler.logging.LoggingHandler [id: 0x1ee25138, L:/192.168.31.153:10020] READ: [id: 0x4c1ab5f9, L:/192.168.31.153:10020 - R:/192.168.31.153:13357]
[INFO ] 2017-07-06 12:56:58 io.netty.handler.logging.LoggingHandler [id: 0x1ee25138, L:/192.168.31.153:10020] READ COMPLETE
[INFO ] 2017-07-06 12:57:13 netty.handler.telnet.TelnetServerHandler ========recieve message from client:hello server
[INFO ] 2017-07-06 12:57:19 netty.handler.telnet.TelnetServerHandler ========recieve message from client:yes
[INFO ] 2017-07-06 12:57:22 netty.handler.telnet.TelnetServerHandler ========recieve message from client:bye
客户端:
[INFO ] 2017-07-06 12:56:58 netty.main.telnet.TelnetServer =========Client is start=========
[INFO ] 2017-07-06 12:56:59 netty.handler.telnet.TelnetClientHandler ====recieve message from server:Welcome to donaldHP!
[INFO ] 2017-07-06 12:56:59 netty.handler.telnet.TelnetClientHandler ====recieve message from server:It is Thu Jul 06 12:56:59 CST 2017 now.
hello server
[INFO ] 2017-07-06 12:57:13 netty.handler.telnet.TelnetClientHandler ====recieve message from server:Did you say 'hello server'?
yes
[INFO ] 2017-07-06 12:57:19 netty.handler.telnet.TelnetClientHandler ====recieve message from server:Did you say 'yes'?
bye
[INFO ] 2017-07-06 12:57:22 netty.handler.telnet.TelnetClientHandler ====recieve message from server:Have a good day!
0
1
分享到:
评论

相关推荐

    netty通信完整示例

    这个“netty通信完整示例”提供了一套完整的Netty使用案例,包括了jar包、服务器端、客户端、编码器和解码器,确保了你能够亲身体验Netty的强大功能。 首先,让我们深入理解Netty的核心概念: 1. **NIO(Non-...

    基于Netty框架的网络通信示例.zip

    基于Netty框架的网络通信示例 内容概要 本项目是一个基于Netty框架的网络通信示例,涵盖了多种网络通信场景,包括TCP、UDP、WebSocket等。项目展示了如何使用Netty进行高性能的异步网络编程,并提供了丰富的示例...

    Netty初始学习示例

    在网络通信中,由于数据包大小不固定,可能会出现粘包或拆包现象。Netty通过自定义的解码器如`LengthFieldBasedFrameDecoder`来解决这个问题,它根据长度字段来分割数据包。 7. **心跳机制**: 为了检测网络连接...

    Android基于Netty框架实现通信

    在Android开发中,为了实现高效的网络通信,开发者常常会选择使用Netty框架。Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于多种协议的服务器和客户端应用。本篇文章将详细探讨如何在Android环境中利用...

    netty 入门Reactor示例

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在深入理解Netty的Reactor模式之前,我们先了解一下什么是Reactor模式。 Reactor模式是一种事件处理模式,它...

    基于netty的即时通信

    在即时通信领域,Netty作为一个高性能、异步事件驱动的网络应用框架,广泛应用于各种复杂的通信系统。本项目“基于Netty的即时通信”旨在演示如何利用Netty构建一个简单的聊天应用,它包括服务端和客户端,实现了多...

    Android-netty和socket通信的demo

    本示例“Android-netty和socket通信的demo”将展示如何在Android平台上利用Netty进行网络通信,与传统的Socket编程相结合,实现更加灵活和高效的通信机制。 首先,理解Netty的基本概念是非常重要的。Netty是一个...

    netty框架,服务端、客户端代码示例

    在这个"Netty框架,服务端、客户端代码示例"中,我们将深入探讨如何使用Netty构建服务端和客户端的通信。 首先,让我们了解Netty的基本架构。Netty的核心是它的“线程模型”和“通道”概念。线程模型采用“事件循环...

    (源码)基于Netty框架的网络通信系统.zip

    # 基于Netty框架的网络通信...4. 丰富的示例代码提供了多种网络通信场景的示例代码,如时间服务器、回声服务器、文件服务器等,帮助开发者快速上手。 5. 多线程处理支持多线程处理网络请求,提高系统的并发处理能力。

    Netty实现简单的客户端服务端通信示例

    总的来说,Netty 的简单客户端-服务端通信示例帮助我们理解了 Netty 的基本架构和工作原理。通过实践这个示例,你可以进一步探索 Netty 如何处理网络连接、数据传输以及自定义处理器的实现,从而更好地掌握 Netty 在...

    android netty cli +probuf示例

    总结来说,“android netty cli +protobuf示例”展示了如何在Android客户端利用Netty的异步网络通信能力和Protobuf的数据序列化特性,构建一个高效的即时通讯系统。这个示例涵盖了从消息定义到网络通信的全过程,...

    Netty通信服务器搭建demo

    通过这个示例,我们可以学习到如何利用Netty创建服务器、处理I/O事件以及解决通信过程中的粘包问题。理解并熟练运用这些知识点,将有助于我们构建更高效、可靠的网络应用程序。在实际项目中,还需要考虑异常处理、...

    基于Netty框架的网络通信项目.zip

    本项目通过多个示例代码,展示了如何使用Netty实现不同类型的网络通信,包括HTTP服务器、WebSocket服务器、Protobuf编解码、Thrift服务等。 项目的主要特性和功能 1. HTTP服务器 实现了一个简单的HTTP服务器,...

    Android使用Netty网络框架实践(客户端、服务端)

    在Android开发中,有时我们需要构建高性能的网络通信应用,这时Netty框架就能派上大用场。Netty是一个异步事件驱动的网络应用程序框架,它为高性能、高可用性的网络服务器和客户端提供了一种简单易用的方式。本实践...

    netty通讯示例

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,...通过深入理解并实践这个“netty通讯示例”,你可以掌握Netty的基本用法,以及如何处理网络通信中的常见问题,这对于构建高并发、高性能的网络应用至关重要。

    netty+4G DTU

    压缩包中的 "netty_iot-master" 可能是一个示例项目,包含了一个使用 Netty 开发的 IoT 应用的源代码,可以作为学习和参考的资源。 总的来说,Netty 与 4G DTU 的结合,为 IoT 应用提供了强大而灵活的通信基础设施...

    netty5.0通信jar和客户端服务器demo

    总结来说,Netty 5.0提供了一套强大且灵活的网络通信框架,通过异步I/O、高效的内存管理以及灵活的Pipeline设计,极大地简化了高性能网络应用的开发。通过"netty_11-07_ok"这样的示例,开发者可以深入理解Netty的...

    java nio&netty系列之三netty网络模型代码以及简化版代码示例

    本篇将主要探讨Netty网络模型的代码实现及简化版代码示例。 首先,Netty的核心是它的事件驱动模型,也称为Reactor模式。在Netty中,BossGroup负责接收新的连接请求,WorkerGroup则处理已连接的SocketChannel上的...

    java netty通信

    通过上述知识点的学习和实践,你可以构建出稳定、高效的网络通信服务。在实际项目中,结合具体的业务需求,灵活运用Netty提供的各种组件和设计模式,能够大大提高开发效率和系统的可靠性。在压缩包文件`test`中,...

    netty-book:netty权威指南示例代码

    《Netty权威指南》是一本深入探讨Java网络编程框架Netty的专业书籍,其示例代码提供了丰富的实践场景,帮助读者更好地理解和应用Netty。Netty是Java领域内广泛使用的高性能、异步事件驱动的网络应用框架,适用于创建...

Global site tag (gtag.js) - Google Analytics