Netty实现UDP通信

Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。本文则是基于udp通信讲解。

1.服务端

public class UdpServer {
    private static final String TAG = UdpServer.class.getSimpleName();

    private static UdpServer instance=new UdpServer();

    private Bootstrap bootstrap;
    private EventLoopGroup worker;
    private RemoteContext mContext;
    private UdpOperationDecoder od;
    private UdpPacketEncoder pe;

    public static UdpServer getInstance(){
        return instance;
    }

    private UdpServer() {
        od=new UdpOperationDecoder();
        pe=new UdpPacketEncoder();
    }

    public void start(){
        mContext=new RemoteContext();
        worker=new NioEventLoopGroup();
        bootstrap=new Bootstrap()
                .group(worker)
                .channel(NioDatagramChannel.class)
                .option(ChannelOption.SO_BROADCAST, true)
                .option(ChannelOption.SO_REUSEADDR, true)
                .handler(new ChannelInitializer<Channel>() {
                    @Override
                    protected void initChannel(Channel ch) throws Exception {
                        LogUtils.e("udp有客户端连接上来:");
                        ch.pipeline()
                                .addLast(pe)
                                .addLast(od)
                                .addLast(new OperationHandler(mContext));
                    }
                }).localAddress(ConfigInfo.UDP_PORT);
        bootstrap.bind();
    }

    public void stop(){
        worker.shutdownGracefully();
        worker=null;
        mContext=null;
        bootstrap=null;
    }
}
@ChannelHandler.Sharable
public class UdpOperationDecoder extends MessageToMessageDecoder<DatagramPacket> {
    private static final String TAG = UdpOperationDecoder.class.getSimpleName();

    @Override
    protected void decode(ChannelHandlerContext ctx, DatagramPacket msg, List<Object> out) throws Exception {
        ByteBuf buf=msg.content();
        short type=buf.readUnsignedByte();
        Log.e("youdianxiaoshuai","decoded+type===="+type);
        Operation op;
        switch (type){
            case Packet.REMOTE_CONTROL:
                op = new RemoteControl(msg.sender()).init(buf);
                break;
            case Packet.CLIENT_TCP_CONNECT:
                op = new ClientTcpConnect(msg.sender()).init(buf);
                break;
            default:
                throw new RemoteException(RemoteException.UNKNOWN_TYPE, "未知命令");
        }
        if(buf.refCnt() >= 1){
            buf.release();
        }
       out.add(op);
    }
}

2.客户端

public class UdpClient {
    private static final String TAG = UdpClient.class.getSimpleName();

    private static final String POST = "localhost";

    private static UdpClient instance=new UdpClient();

    private Bootstrap bootstrap;
    private EventLoopGroup worker;
    private RemoteContext mContext;
    private UdpOperationDecoder od;
    private UdpPacketEncoder pe;
    private Channel channel;

//    private ExecutorService executorService = Executors.newFixedThreadPool(5);

    public static UdpClient getInstance(){
        return instance;
    }

    private UdpClient() {
        od=new UdpOperationDecoder();
        pe=new UdpPacketEncoder();
    }

    public void start(){
        mContext=new RemoteContext();
        worker=new NioEventLoopGroup();
        bootstrap=new Bootstrap()
                .group(worker)
                .channel(NioDatagramChannel.class)
                .option(ChannelOption.SO_BROADCAST, true)
                .handler(new ChannelInitializer<Channel>() {
                    @Override
                    protected void initChannel(Channel ch) throws Exception {
                        Log.e("joryuan","UDP连接成功"+ch.remoteAddress() + "==ch.local==="+ch.localAddress());
                        ch.pipeline()
                                .addLast(pe)
                                .addLast(od)
                                .addLast(new OperationHandler(mContext));
                    }
                });
        channel = bootstrap.bind(ConfigInfo.PHONE_UDP_PORT).syncUninterruptibly().channel();
    }

    public void sendRequest(int request, final int remoteControlCode){
        switch (request){
            case Packet.REMOTE_CONTROL:
                RemoteControl.getInstance().setRemoteControlCode(remoteControlCode).sendRequest(channel);
                break;
            case Packet.CLIENT_TCP_CONNECT:
                ClientTcpConnect.getInstance().sendRequest(channel);
                break;
            default:
        }
    }

    public void stop(){
        if(channel != null){
            channel.disconnect();
            channel.close();
            channel = null;
        }
        if(worker != null){
            worker.shutdownGracefully();
            worker=null;
        }
        mContext=null;
        bootstrap=null;
    }
}

@ChannelHandler.Sharable
public class UdpOperationDecoder extends MessageToMessageDecoder<DatagramPacket> {
    private static final String TAG = "UdpOperationDecoder";

    @Override
    protected void decode(ChannelHandlerContext ctx, DatagramPacket msg, List<Object> out) throws RemoteException {
        ByteBuf buf=msg.content();
        short type=buf.readUnsignedByte();
        Log.e("joryuan","type====="+type);
        Operation op;
        switch (type){
            case Packet.REMOTE_CONTROL:
//                op = new RemoteControl().init(buf);
                op = RemoteControl.getInstance().init(buf);
                break;
            case Packet.CLIENT_TCP_CONNECT:
                op = ClientTcpConnect.getInstance().setInetSocketAddress(msg.sender()).init(buf);
//                op = new ClientTcpConnect(msg.sender()).init(buf);
                break;
            default:
                throw new RemoteException(RemoteException.UNKNOWN_TYPE, "未知命令");
        }
        out.add(op);
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Netty是一种基于Java NIO技术的网络通信框架,能够很好地解决高并发的网络通信问题。Android Netty的特点是轻量级、跨平台、性能高、易于使用、可扩展性强。它可以支持多种协议的网络通信,例如HTTP、TCP、UDP等,同时也支持长连接、断线重连、心跳检测等多种实用功能。 在Android应用开发中,Android Netty可以很好地用于实现客户端和服务端的通信。通过使用Android Netty,我们可以在客户端和服务端之间轻松地传递消息,从而实现实时通信、数据传输和网络交互等功能。同时,Android Netty也是一种优秀的服务器开发框架,我们可以用它来构建高性能、高可靠性的服务器端架构。 总之,Android Netty是一种功能强大、易于使用的网络通信框架,可以显著提高网络通信效率和稳定性,帮助我们更加高效地进行Android应用开发和服务器端开发。 ### 回答2: Android Netty是一个用于开发客户端和服务器端网络应用的高性能框架,它基于Java NIO技术开发。Netty可以方便地实现单线程处理多个连接的模式,能够优化网络性能,提高系统的并发能力,同时也改进了异步编程的易用性和可重用性。 Android Netty提供的主要功能包括:线程模型、传输、协议、事件和助手类。线程模型支持多种I/O操作方式,包括阻塞、非阻塞、多路复用、零拷贝等。传输支持多种网络协议和传输方式,包括TCP、UDP、HTTP、WebSocket等。协议支持多种编解码方式,包括字符串、XML、JSON、二进制等。事件模型契合异步编程的实现方式。助手类则可用于加速网络应用的开发,如编写TCP客户端和服务器端、HTTP客户端和服务器端、WebSockets客户端和服务器端、SSL/TLS客户端和服务器端等。 Android Netty已被广泛应用于各种互联网应用中,如Web服务器、游戏服务器、消息推送服务器、物联网、金融交易等。其性能优越、可拓展性好,已成为开发高性能网络应用的首选框架之一。 ### 回答3: Android Netty是一个基于异步事件驱动的网络编程框架,在Android平台上实现了快速、可靠的数据传输功能。它提供了对TCP、UDP、HTTP及WebSocket等传输协议的支持,可以实现从客户端接收和发送消息,同时还能够支持多种编码和解码方式。 使用Android Netty可以轻松地实现长连接,在保持与服务器的稳定连接的同时,可以进行高效地数据交换。利用Netty的NIO技术,可以将连接维持在非常低的资源使用情况下,让Android设备的CPU、内存等关键资源始终保持优化。 此外,Android Netty还可以实现多并发的网络连接,同时还能够将服务器端返回的数据进行负载均衡处理,从而实现应用程序与服务器端之间的高效沟通。 总之,Android Netty为Android应用开发者提供了强大的网络编程功能,使得开发者能够快速实现可靠、高效的网络通信。不仅如此,它还提供了丰富的API和事件处理机制,使得网络编程变得简单、直观,并大力推动了Android应用程序的快速发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值