Netty客户端和服务器简单的例子

来源:小虎哥的技术博客 发布时间:2018-11-21 15:48:28 阅读量:1064

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序,阿里腾讯都有用到,这里是个简单的服务器和客户端的例子

代码目录

服务端 NettyServerBootstrap类 NettyServerHandler类

客户端NettyClient类 NettyClientHandler类

服务端

NettyServerBootstrap 类,建立服务端

public class NettyServerBootstrap {

    private int port;

    public NettyServerBootstrap(int port) {

        this.port = port;

        bind();

    }

    private void bind() {

        EventLoopGroup boss = new NioEventLoopGroup();

        EventLoopGroup worker = new NioEventLoopGroup();

        try {

            ServerBootstrap bootstrap = new ServerBootstrap();

            bootstrap.group(boss, worker);

            bootstrap.channel(NioServerSocketChannel.class);

            bootstrap.option(ChannelOption.SO_BACKLOG, 1024); 

            bootstrap.option(ChannelOption.TCP_NODELAY, true); 

            bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); 

            bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {

                @Override

                protected void initChannel(SocketChannel socketChannel) throws Exception {

                    ChannelPipeline p = socketChannel.pipeline();

                    p.addLast(new NettyServerHandler());

                }

            });

            ChannelFuture f = bootstrap.bind(port).sync();

            if (f.isSuccess()) {

                Log.logD("启动Netty服务成功,端口号:" + this.port);

            }

            // 关闭连接

            f.channel().closeFuture().sync();


        } catch (Exception e) {

            Log.logE("启动Netty服务异常,异常信息:" + e.getMessage());

            e.printStackTrace();

        } finally {

            boss.shutdownGracefully();

            worker.shutdownGracefully();

        }

    }


    public static void main(String[] args) throws InterruptedException {

        NettyServerBootstrap server = new NettyServerBootstrap(6666);

    }


}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

服务端处理类NettyServerHandler

public class NettyServerHandler extends ChannelHandlerAdapter {


    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        // TODO Auto-generated method stub

        //发送信息

        ctx.writeAndFlush(getSendByteBuf("服务器-->客户端 你好"));

    }


    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) {

        //收到消息

        ByteBuf buf = (ByteBuf) msg;// 获取客户端传来的Msg

        String recieved = getMessage(buf);

        System.out.println("------收到信息------"+recieved );   

    }


    /*

     * 从ByteBuf中获取信息 使用UTF-8编码返回

     */

    private String getMessage(ByteBuf buf) {

        byte[] con = new byte[buf.readableBytes()];

        buf.readBytes(con);

        try {

            return new String(con, utils.Constant.UTF8);

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

            return null;

        }

    }


    /*

     * 将Sting转化为UTF-8编码的字节

     */

    private ByteBuf getSendByteBuf(String message) throws UnsupportedEncodingException {

        byte[] req = message.getBytes("UTF-8");

        ByteBuf pingMessage = Unpooled.buffer();

        pingMessage.writeBytes(req);

        return pingMessage;

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

客户端

NettyClient类

public class NettyClient {

    private int port;

    private String host;

    private SocketChannel socketChannel;


    public NettyClient(int port, String host) throws InterruptedException {

        this.port = port;

        this.host = host;

        start();

    }


    private void start() throws InterruptedException {

           EventLoopGroup eventLoopGroup = new NioEventLoopGroup();

        try {

            Bootstrap bootstrap = new Bootstrap();

            bootstrap.channel(NioSocketChannel.class);

            bootstrap.option(ChannelOption.SO_KEEPALIVE, true);

            bootstrap.group(eventLoopGroup);

            bootstrap.remoteAddress(host, port);

            bootstrap.handler(new ChannelInitializer<SocketChannel>() {

                @Override

                protected void initChannel(SocketChannel socketChannel) throws Exception {

                    socketChannel.pipeline().addLast(new NettyClientHandler());

                    socketChannel.pipeline().addLast(new HeartLinkHandler());

                }

            });

            ChannelFuture future = bootstrap.connect(host, port).sync();

            if (future.isSuccess()) {

                socketChannel = (SocketChannel) future.channel();

                System.out.println("------connect server success------");

            }

            future.channel().closeFuture().sync();

        } finally {

            eventLoopGroup.shutdownGracefully();    

        }

    }


    public static void main(String[] args) throws InterruptedException {

        NettyClient client = new NettyClient(6666, "localhost");

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

客户端处理类NettyClientHandler

public class NettyClientHandler extends ChannelHandlerAdapter {


    @Override

    public void channelActive(ChannelHandlerContext ctx) throws Exception {

        // TODO Auto-generated method stub

        //发送信息

        ctx.writeAndFlush(getSendByteBuf("客户端-->服务端 你好"));



    @Override

    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        // TODO Auto-generated method stub

        ByteBuf buf = (ByteBuf) msg;// 获取服务端传来的Msg

        String recieved = getMessage(buf);

        System.out.println("------收到信息------"+recieved ); 

     }


     /*

     * 将字节UTF-8编码返回字符串

     */

    private String getMessage(ByteBuf buf) {

        byte[] con = new byte[buf.readableBytes()];

        buf.readBytes(con);

        try {

            return new String(con, utils.Constant.UTF8);

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

            return null;

        }

    }


    /*

     * 将Sting转化为UTF-8编码的字节

     */

    private ByteBuf getSendByteBuf(String message) throws UnsupportedEncodingException {

        byte[] req = message.getBytes("UTF-8");

        ByteBuf pingMessage = Unpooled.buffer();

        pingMessage.writeBytes(req);

        return pingMessage;

    }

}

--------------------- 



标签: 服务器搭建
分享:
评论:
你还没有登录,请先