zoukankan      html  css  js  c++  java
  • zbb20180917 nio,netty3服务器端客户端例子

    Netty3服务器

    class ServerHandler extends SimpleChannelHandler {

    /**

     * 通道关闭的时候触发

     */

    @Override

    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

    System.out.println("channelClosed");

    }

    /**

     * 必须是连接已经建立,关闭通道的时候才会触发.

     */

    @Override

    public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

    super.channelDisconnected(ctx, e);

    System.out.println("channelDisconnected");

    }

    /**

     * 捕获异常

     */

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {

    super.exceptionCaught(ctx, e);

    System.out.println("exceptionCaught");

    }

    /**

     * 接受消息

     */

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

    super.messageReceived(ctx, e);

    // System.out.println("messageReceived");

    System.out.println("服务器端收到客户端消息:"+e.getMessage());

    //回复内容

    ctx.getChannel().write("好的");

    }

    }

    // netty 服务器端

    public class NettyServer {

    public static void main(String[] args) {

    // 创建服务类对象

    ServerBootstrap serverBootstrap = new ServerBootstrap();

    // 创建两个线程池 分别为监听监听端口 ,nio监听

    ExecutorService boos = Executors.newCachedThreadPool();

    ExecutorService worker = Executors.newCachedThreadPool();

    // 设置工程 并把两个线程池加入中

    serverBootstrap.setFactory(new NioServerSocketChannelFactory(boos, worker));

    // 设置管道工厂

    serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {

    public ChannelPipeline getPipeline() throws Exception {

    ChannelPipeline pipeline = Channels.pipeline();

    //将数据转换为string类型.

    pipeline.addLast("decoder", new StringDecoder());

    pipeline.addLast("encoder", new StringEncoder());

    pipeline.addLast("serverHandler", new ServerHandler());

    return pipeline;

    }

    });

    // 绑定端口号

    serverBootstrap.bind(new InetSocketAddress(9090));

    System.out.println("netty server启动....");

    }

    }

    Netty3客户端

    package com.itmayiedu;

    import java.net.InetSocketAddress;

    import java.util.Scanner;

    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Executors;

    import org.jboss.netty.bootstrap.ClientBootstrap;

    import org.jboss.netty.channel.Channel;

    import org.jboss.netty.channel.ChannelFuture;

    import org.jboss.netty.channel.ChannelHandlerContext;

    import org.jboss.netty.channel.ChannelPipeline;

    import org.jboss.netty.channel.ChannelPipelineFactory;

    import org.jboss.netty.channel.ChannelStateEvent;

    import org.jboss.netty.channel.Channels;

    import org.jboss.netty.channel.ExceptionEvent;

    import org.jboss.netty.channel.MessageEvent;

    import org.jboss.netty.channel.SimpleChannelHandler;

    import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;

    import org.jboss.netty.handler.codec.string.StringDecoder;

    import org.jboss.netty.handler.codec.string.StringEncoder;

    class ClientHandler extends SimpleChannelHandler {

    /**

     * 通道关闭的时候触发

     */

    @Override

    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

    System.out.println("channelClosed");

    }

    /**

     * 必须是连接已经建立,关闭通道的时候才会触发.

     */

    @Override

    public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

    super.channelDisconnected(ctx, e);

    System.out.println("channelDisconnected");

    }

    /**

     * 捕获异常

     */

    @Override

    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {

    super.exceptionCaught(ctx, e);

    System.out.println("exceptionCaught");

    }

    /**

     * 接受消息

     */

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

    super.messageReceived(ctx, e);

    // System.out.println("messageReceived");

    System.out.println("服务器端向客户端回复内容:"+e.getMessage());

    //回复内容

    // ctx.getChannel().write("好的");

    }

    }

    public class NettyClient {

    public static void main(String[] args) {

    System.out.println("netty client启动...");

    // 创建客户端类

    ClientBootstrap clientBootstrap = new ClientBootstrap();

    // 线程池

    ExecutorService boos = Executors.newCachedThreadPool();

    ExecutorService worker = Executors.newCachedThreadPool();

    clientBootstrap.setFactory(new NioClientSocketChannelFactory(boos, worker));

    clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {

    public ChannelPipeline getPipeline() throws Exception {

    ChannelPipeline pipeline = Channels.pipeline();

    // 将数据转换为string类型.

    pipeline.addLast("decoder", new StringDecoder());

    pipeline.addLast("encoder", new StringEncoder());

    pipeline.addLast("clientHandler", new ClientHandler());

    return pipeline;

    }

    });

    //连接服务端

    ChannelFuture connect = clientBootstrap.connect(new InetSocketAddress("127.0.0.1", 9090));

    Channel channel = connect.getChannel();

    System.out.println("client start");

    Scanner scanner= new Scanner(System.in);

    while (true) {

    System.out.println("请输输入内容...");

    channel.write(scanner.next());

    }

    }

    }

    Maven坐标

    <dependency>

    <groupId>io.netty</groupId>

    <artifactId>netty</artifactId>

    <version>3.3.0.Final</version>

    </dependency>

  • 相关阅读:
    二叉树的序列化与反序列化
    寻找重复的子树
    [ABC216H] Random Robots
    Codeforces Round #741 (Div. 2)
    [Gym 102798K] Tree Tweaking
    CF798E Mike and code of a permutation
    CF1149E Election Promises
    [BZOJ 4311] 向量
    CF1268D Invertation in Tournament
    [做题笔记] 浅谈势能线段树在特殊区间问题上的应用
  • 原文地址:https://www.cnblogs.com/super-admin/p/9662657.html
Copyright © 2011-2022 走看看