zoukankan      html  css  js  c++  java
  • Netty实现简单UDP服务器

    本文参考《Netty权威指南》

    文件列表:

    ├── ChineseProverbClientHandler.java
    ├── ChineseProverbClient.java
    ├── ChineseProverbServerHandler.java
    └── ChineseProverbServer.java
    
    package com.xh.netty.test12;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioDatagramChannel;
    
    /**
     * Created by root on 1/11/18.
     */
    public class ChineseProverbServer {
        public void run(int port) {
            EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
            try {
                Bootstrap bootstrap = new Bootstrap();
                bootstrap.group(eventLoopGroup).channel(NioDatagramChannel.class)
                        .option(ChannelOption.SO_BROADCAST, true)
                        .handler(new ChineseProverbServerHandler());
    
                bootstrap.bind(port).sync().channel().closeFuture().sync();
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                eventLoopGroup.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) {
            ChineseProverbServer server = new ChineseProverbServer();
            server.run(8080);
        }
    }
    
    package com.xh.netty.test12;
    
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.channel.socket.DatagramPacket;
    import io.netty.util.CharsetUtil;
    import io.netty.util.internal.ThreadLocalRandom;
    
    /**
     * Created by root on 1/11/18.
     */
    public class ChineseProverbServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
    
        private static String[] DIRC = {"哈哈哈哈", "呵呵呵", "嘻嘻嘻"};
    
        public void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
            String req = packet.content().toString(CharsetUtil.UTF_8);
            System.out.println(req);
            if (req.equalsIgnoreCase("QUERY")) {
                ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("RESULT:" + nextQuote(), CharsetUtil.UTF_8), packet.sender()));
    
    
            }else {
                ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("RESULT:" + "ERR", CharsetUtil.UTF_8), packet.sender()));
            }
        }
    
        private String nextQuote() {
            int quote = ThreadLocalRandom.current().nextInt(DIRC.length);
            return DIRC[quote];
        }
    }
    
    package com.xh.netty.test12;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.Channel;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.DatagramPacket;
    import io.netty.channel.socket.nio.NioDatagramChannel;
    import io.netty.util.CharsetUtil;
    
    import java.net.InetSocketAddress;
    
    /**
     * Created by root on 1/11/18.
     */
    public class ChineseProverbClient {
        public void run(int port) {
            EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
            Bootstrap bootstrap = new Bootstrap();
            try {
                bootstrap.group(eventLoopGroup).channel(NioDatagramChannel.class)
                        .option(ChannelOption.SO_BROADCAST, true)
                        .handler(new ChineseProverbClientHandler());
                Channel channel = bootstrap.bind(7070).sync().channel();
                channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("QUERY", CharsetUtil.UTF_8), new InetSocketAddress("255.255.255.255", port))).sync();
                if (!channel.closeFuture().await(15000)) {
                    System.out.println("out of time");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                eventLoopGroup.shutdownGracefully();
            }  
        }
    
        public static void main(String[] args) {
            new ChineseProverbClient().run(8080);
        }
    
    }
    
    package com.xh.netty.test12;
    
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    import io.netty.channel.socket.DatagramPacket;
    import io.netty.util.CharsetUtil;
    
    /**
     * Created by root on 1/11/18.
     */
    public class ChineseProverbClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {
        protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
            String result = packet.content().toString(CharsetUtil.UTF_8);
            System.out.println("client>>>" + result);
            ctx.close();
        }
    }
    
  • 相关阅读:
    uwsgi 的启动停止重启
    项目部署(Python3 + ubuntu 16.04(ali server) + Nginx + uWSGI + Django 1.11)
    阿里云连接上Mysql数据库(10061 errors)
    本地数据库上传到阿里云Mysql
    Django 用户的修改密码接口
    django 的忘记密码接口
    Git光速入门
    缓存问题:一致性、穿击、穿透、雪崩、污染
    redis进阶-高可用:主从复制详解
    Redis分片技术(Redis Cluster)
  • 原文地址:https://www.cnblogs.com/lanqie/p/8267498.html
Copyright © 2011-2022 走看看