netty基础--基本收发

时间:2022-05-20 08:58:59

使用maven构建一个基本的netty收发应用,作为其他应用的基础。客户端使用packet sender工具。

1  添加netty依赖

1  maven netty依赖

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.0.0.Final</version>
</dependency>

2  添加ServerBootstrap启动函数

package io.netty.example.basic;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
* main class
* @author Sylar
* @Time 2017-01-02
*/
public class NettyBaisc {

private int port;
    public NettyBaisc(int port) {
        this.port = port;
    }

public void run() throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
           
            /*创建一个新的 ServerBootstrap 来创建和绑定新的 Channel
            指定 EventLoopGroups 从 ServerChannel 和接收到的管道来注册并获取 EventLoops
            指定 Channel 类来使用
            设置处理器用于处理接收到的管道的 I/O 和数据
            通过配置的引导来绑定管道
            ChannelInitializer 负责设置 ChannelPipeline
            实现 initChannel() 来添加需要的处理器到 ChannelPipeline。一旦完成了这方法 ChannelInitializer 将会从 ChannelPipeline 删除自身。*/
           
            ServerBootstrap b = new ServerBootstrap(); // (2)
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class) // (3)
             .childHandler(new ChannelInitializer<SocketChannel>() { // (4)
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ch.pipeline().addLast(new NettyBaiscHandler());
                 }
             })
             .option(ChannelOption.SO_BACKLOG, 128)          // (5)
             .childOption(ChannelOption.SO_KEEPALIVE, true); // (6)

// Bind and start to accept incoming connections.
            ChannelFuture f = b.bind(port).sync(); // (7)

// Wait until the server socket is closed.
            // In this example, this does not happen, but you can do that to gracefully
            // shut down your server.
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

public static void main(String[] args) throws Exception {
        int port;
        if (args.length > 0) {
            port = Integer.parseInt(args[0]);
        } else {
            port = 8080;
        }
        new NettyBaisc(port).run();
    }
}

3  添加通道handler

package io.netty.example.basic;

import java.io.UnsupportedEncodingException;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;
/**
* handler class
* @author Sylar
* @Time 2017-01-02
*/
public class NettyBaiscHandler extends ChannelInboundHandlerAdapter { // (1)
     @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println(">>>>>>>>connect in>>>>>>>>");
        }
     @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            System.out.println(">>>>>>>>connect out>>>>>>>>");
        }
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ByteBuf buf = (ByteBuf) msg;
       
        /*byte[] req = new byte[buf.readableBytes()];
        buf.readBytes(req);
        String body = new String(req);       
        System.out.println("Server received: " + body);*/
       
        System.out.println("Client received: " + buf.toString(CharsetUtil.UTF_8));
        ctx.writeAndFlush(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8));
        /*ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8));
        ctx.flush();*/
    }
   /* public void channelRead(ChannelHandlerContext ctx, Object msg) { // (2)
        // Discard the received data silently.
        //((ByteBuf) msg).release(); // (3)
        ByteBuf in = (ByteBuf) msg;
        try {
            while (in.isReadable()) { // (1)
                System.out.print((char) in.readByte());
                System.out.flush();
            }
        } finally {
            ReferenceCountUtil.release(msg); // (2)
        }
    }*/

@Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)
        // Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}

4  参考

  • netty官网的echo示例

http://netty.io/wiki/user-guide-for-4.x.html

  • channel不能发送string的问题说明

(我在去年底的测试中是可以直接发送字符串的,有些奇怪!)

http://*.com/questions/25760764/netty-channel-write-not-writing-message

netty基础--基本收发的更多相关文章

  1. Netty基础系列&lpar;3&rpar; --彻底理解NIO

    前言 上一节中我们提到了同步异步与阻塞非阻塞的区别,知道了同步并不等于阻塞.而本节的主角NIO是一种同步非阻塞的I/O模型,并且是I/O多路复用模型.NIO在java中被称为 New I/O.它并不能 ...

  2. Netty基础系列&lpar;4&rpar; --堆外内存与零拷贝详解

    前言 到目前为止,我们知道Nio当中有三个最最核心的组件,分别是:Selelctor,Channel,Buffer.在Netty基础系列(3) --彻底理解NIO 这一篇文章中只是进行了大致的介绍. ...

  3. Netty基础系列&lpar;1&rpar; --linux网路I&sol;O模型

    引言 我一直认为对于java的学习,掌握基础的性价比要远远高于使用框架,而基础知识中对于网络相关知识的掌握也是重中之重.对于一个java程序来说,无论是工作中还是面试,对于Netty的掌握都是及其重要 ...

  4. Netty基础点滴

    编写一个应答服务器 编写一个应答服务器 写一个Netty服务器主要由两部分组成: 配置服务器功能,如线程.端口 实现服务器处理程序,它包含业务逻辑,决定当有一个请求连接或接收数据时该做什么 启动服务器 ...

  5. Netty基础系列&lpar;2&rpar; --彻底理解阻塞非阻塞与同步异步的区别

    引言 在进行I/O学习的时候,阻塞和非阻塞,同步和异步这几个概念常常被提及,但是很多人对这几个概念一直很模糊.要想学好Netty,这几个概念必须要掌握清楚. 同步和异步 同步与异步的区别在于,异步基于 ...

  6. 2、Netty基础

    一.前言 主要包含下面内容: 初识 Netty: 使用 Java NIO 搭建简单的客户端与服务端实现网络通讯: 使用 Netty 搭建简单的客户端与服务端实现网络通讯: Netty 底层操作与 Ja ...

  7. netty 基础

    Netty是一个高性能.异步事件驱动的NIO框架,提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户 ...

  8. Python微信公众号教程基础篇——收发文本消息

    1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...

  9. Netty基础-BIO&sol;NIO&sol;AIO

    同步阻塞IO(BIO): 我们熟知的Socket编程就是BIO,每个请求对应一个线程去处理.一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作).阻塞的原因在于:操 ...

随机推荐

  1. iis不支持下载apk的解决办法

    添加mime类型即可 扩展名:".apk", MIME类型:"application/vnd.android.package-archive"

  2. js获取手机联网状态

    window.addEventListener("offline", function() { alert('offline') }, false); window.addEven ...

  3. ArcGIS 10&period;1 中的style和serverstyle及制作方法

    图层的符号都是随机的,动态变化的,所以不利于图层的美观.还有一点就是符号有增加电子地图可读性的功能. Desktop的符号文件 把要用的符号用desktop的style manage制作相应符号,并把 ...

  4. JQuery 绑定事件时传递参数的实现方法

    如题,比如我想在$(":text").bind("keyup",funcionName);将当前的文本框作为参数传递给 functionName所代表的函数,应 ...

  5. udp 不需要 listen

    accept()不是监听,accept()是接受新连接.listen()是进入监听状态,表示愿意接收连接请求.listen之后有连接请求就将其放到队列中,accept()时把新连接请求从队列中取出,建 ...

  6. &dollar;in的方法总结

    Ad.find({"_id":{$in:datas}},function(err,item){ if(err) console.log(err); //console.log(it ...

  7. BZOJ3577&colon;玩手机&lpar;最大流&comma;二维ST表&rpar;

    Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接 ...

  8. 总结&amp&semi;&num;183&semi;展望

    学了算法也有半年了.也是学期末,确实是该总结了.半年来说不上多努力,毕竟不如高中那时候早晨5点起晚上12点睡,但也确实学到不少东西(尽管眼下来说根本用不到并且我也不确定以为会不会去用.毕竟专业放在那里 ...

  9. Go Example--通道非阻塞

    package main import ( "fmt" ) func main() { messages := make(chan string) signals := make( ...

  10. Android设置全局Context

    新建一个java继承Application类 import android.app.Application; import android.content.Context; /** * 编写自定义Ap ...