• 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>

  • 相关阅读:
    TURN协议(RFC5766详解)
    css布局相关:涉及到常见页面样式难点
    关于echart的x轴固定为0-24小时显示一天内的数据
    用于实现tab页签切换页面的angular路由复用策略
    Promise相关学习
    js原型链、继承、this指向等老生常谈却依然不熟的知识点——记录解析
    js中有遍历作用相关的方法详解总结
    rgb格式颜色与#000000格式颜色的转换
    input搜索框的搜索功能
    Fastapi学习总结(上)
  • 原文地址:https://www.cnblogs.com/super-admin/p/9662657.html
Copyright © 2020-2023  润新知