`
fokman
  • 浏览: 242028 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Netty 之Oio程序编写

 
阅读更多

     今日将android里面使用的socket 方式改成Oio,因为之前使用的是Netty框架,所以直接将Nio替换成Oio,然后修改了一些其他的代码。

    为了维护的方便我定义了一个BaseClient,用来处理停止socket线程。

    

public abstract class BaseClient {
    protected Channel m_channel;
    protected String m_tag;

    public BaseClient(String tag) {
        m_tag = tag;
    }

    public Channel getChannel() {
        return m_channel;
    }

    public void stop(boolean releaseResOnly) {
        this.stopInThread(releaseResOnly);
    }

    protected void createBootstrap() {
        System.setProperty("java.net.preferIPv4Stack", "true");
        System.setProperty("java.net.preferIPv6Addresses", "false");
    }

    protected void stopInThread(Bootstrap bootstrap, boolean releaseResOnly) {
        try {
            final Bootstrap bs = bootstrap;
            final Channel ch = m_channel;
            final boolean resOnly = releaseResOnly;

            m_channel = null;

            Thread t = new Thread(new Runnable() {
                public void run() {
                    try {
                        if (!resOnly) {
                            if (ch != null) {
                                ch.getCloseFuture().addListener(new ChannelFutureListener() {
                                    @Override
                                    public void operationComplete(ChannelFuture cf) throws Exception {
                                        if (bs != null) {
                                            final Bootstrap bs2 = bs;
                                            new Thread(new Runnable() {
                                                public void run() {
                                                    try {
                                                        System.out.println(m_tag
                                                                + "--- netty ch.close and releaseExtraRes-1");
                                                        bs2.releaseExternalResources();
                                                        System.out.println(m_tag
                                                                + "--- netty ch.close and releaseExtraRes-1 done");
                                                    } catch (Throwable th) {
                                                    }
                                                }
                                            }).start();
                                        }
                                    }
                                });
                                ch.close();
                            }
                        } else {
                            if (bs != null) {
                                try {
                                    System.out.println(m_tag + "--- netty releaseExtraRes-2");
                                    bs.releaseExternalResources();
                                    System.out.println(m_tag + "--- netty releaseExtraRes-2 done");
                                } catch (Throwable th) {
                                }
                            }
                        }

                    } catch (Exception ee) {
                        ee.printStackTrace();
                    }
                }
            });
            t.start();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }//stopInThread()

    protected abstract void stopInThread(boolean releaseResOnly);

 

   CxClient继承了BaseClient,增加了一些关于不同的错误编码,方便在日志中查看

 

public class CxClient extends BaseClient {

    private ClientBootstrap m_bootstrap;
    private CxListener m_listener;
    private final Timer timer;

    public CxClient(String tag) {
        super(tag);
        timer = new HashedWheelTimer();
    }

    @Override
    protected void createBootstrap() {
        super.createBootstrap();

        m_bootstrap = new ClientBootstrap(new OioClientSocketChannelFactory(Executors.newCachedThreadPool()));
        final CxClient client = this;
        m_bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            @Override
            public ChannelPipeline getPipeline() throws Exception {
                ChannelPipeline pip = Channels.pipeline();

                pip.addLast("timeout", new ReadTimeoutHandler(timer, 300));
                pip.addLast("decoder", new CxDecoder());
                pip.addLast("handler", new CxHandler(m_listener, client));

                return pip;
            }
        });
        m_bootstrap.setOption("tcpNoDelay", true);
        m_bootstrap.setOption("keepAlive", true);
        m_bootstrap.setOption("reuseAddress", true);
        m_bootstrap.setOption("connectTimeoutMillis", "7000");
    }

    public void start(String host, int port, CxListener li) {

        try {
            m_listener = li;
            createBootstrap();
            System.out.println("CxClient::start() Connecting... " + host + ":" + port);
            ChannelFuture f = m_bootstrap.connect(new InetSocketAddress(host, port));

            f.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture cf) throws Exception {
                    if (m_listener != null) {
                        if (cf.isSuccess()) {
                            m_channel = cf.getChannel();
                            m_listener.connected();
                        } else {
                            Throwable th = cf.getCause();
                            System.out.println("CxClient::start() A 1");
                            int errorCode = CxnetConstants.UNKNOWN_EXCEPTION;
                            if (th != null) {
                                Class<?> c = th.getClass();
                                if (c == java.net.BindException.class)
                                    errorCode = CxnetConstants.BIND_EXCEPTION;
                                else if (c == java.net.ConnectException.class)
                                    errorCode = CxnetConstants.CONNECT_EXCEPTION;
                                else if (c == java.net.MalformedURLException.class)
                                    errorCode = CxnetConstants.MAILFORMEDURL_EXCEPTION;
                                else if (c == java.net.NoRouteToHostException.class)
                                    errorCode = CxnetConstants.NOROUTETOHOST_EXCEPTION;
                                else if (c == java.net.PortUnreachableException.class)
                                    errorCode = CxnetConstants.PORTUNREACHABLE_EXCEPTION;
                                else if (c == java.net.ProtocolException.class)
                                    errorCode = CxnetConstants.PROTOCOL_EXCEPTION;
                                else if (c == java.net.SocketException.class)
                                    errorCode = CxnetConstants.SOCKET_EXCEPTION;
                                else if (c == java.net.SocketTimeoutException.class)
                                    errorCode = CxnetConstants.SOCKETTIMEOUT_EXCEPTION;
                                else if (c == java.net.UnknownHostException.class)
                                    errorCode = CxnetConstants.UNKNOWNHOST_EXCEPTION;
                                else if (c == java.net.UnknownServiceException.class)
                                    errorCode = CxnetConstants.UNKNOWNSERVICE_EXCEPTION;
                                else if (c == java.net.URISyntaxException.class)
                                    errorCode = CxnetConstants.URISYNTAX_EXCEPTION;
                                th.printStackTrace();
                                System.out.println("CxClient::start() A 2 errCode=" + errorCode);
                            }
                            m_listener.disconnected(errorCode);
                        }
                    }
                }
            });
        } catch (Exception e) {
            System.out.println("CxClient::start() excep B 1");
            e.printStackTrace();
            System.out.println("CxClient::start() excep B 2");
            m_listener.disconnected(CxnetConstants.UNKNOWN_EXCEPTION);
        }

    }//start()

    @Override
    protected void stopInThread(boolean releaseResOnly) {
        final Bootstrap bs = m_bootstrap;
        m_bootstrap = null;
        super.stopInThread(bs, releaseResOnly);
    }

}//end cls - CxClient

 

分享到:
评论

相关推荐

    Netty简单应答程序

    这个压缩包中的"Netty简单应答程序"示例,旨在展示如何使用Netty构建一个基本的通信系统,其中客户端能够向服务器发送消息,并接收到服务器的回应。 首先,我们要理解Netty的基本组件。Netty的核心是其Channel...

    基于Netty的聊天程序

    从最简单的Socked编程,到目前为止已经有了开源的框架,那就是Netty,它Jobss开发的一个网络异步应用框架,能高快捷的实现网络客户端和服务器端的优秀框架,而本实例就是基于这个框架实现的聊天程序,希望对你有用

    使用netty编写的聊天室程序

    使用netty 4.x 编写的聊天室程序,实现client-client client-server server-client 全双工通信

    读书笔记:netty权威指南自己编写的样例.zip

    读书笔记:netty权威指南自己编写的样例

    netty即时通讯程序

    Netty即时通讯程序是基于Java开发的一个高效、高性能的网络应用程序框架,主要用于构建高度可定制化的服务器和客户端应用,尤其适合处理并发连接和大规模数据传输。这个程序的目的是实现类似于微信、QQ这样的即时...

    Netty进阶之路-跟着案例学Netty

    《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...

    《Netty进阶之路 跟着案例学Netty》.rar

    Java进阶技术-netty进阶之路

    Netty4详解二:开发第一个Netty应用程序

    Netty是Java领域的一款高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。...Netty的强大之处在于它的高度定制性,可以轻松处理多种网络协议和复杂的应用场景。

    基于netty编写的socket服务端

    在基于Netty编写的socket服务端中,首先需要定义一个`ChannelHandler`,这个处理器负责处理接收到的网络事件,如连接建立、数据读取、连接关闭等。`ChannelHandlerContext`则是`ChannelHandler`和`ChannelPipeline`...

    《Netty进阶之路 跟着案例学Netty》_李林锋_

    Netty进阶之路 跟着案例学Netty 整本书无密码,Netty进阶之路 跟着案例学Netty

    Netty进阶之路:跟着案例学Netty 完整版.pdf

    《Netty进阶之路:跟着案例学Netty》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...

    netty socketio 在线聊天程序

    Netty和Socket.IO是两种常用于构建实时通信系统的框架,它们在在线聊天程序、客服模块以及广告推送等应用场景中有着广泛的应用。让我们深入探讨这两个技术及其在构建在线聊天程序中的运用。 **Netty** Netty是由...

    Netty+maven的入门程序

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本入门程序中,我们将深入探讨如何结合 Maven 和 Eclipse 创建一个简单的 Netty 项目。 首先,让我们了解 ...

    Netty与ActiveMQ的程序代码范例

    在“Netty与ActiveMQ的程序代码范例”中,我们可以预期找到的是如何将这两个强大的工具结合使用的实例。Netty通常用作网络层的基石,处理TCP/IP协议栈中的低级任务,如套接字管理、数据缓冲和高效的I/O操作。而...

    netty之hello world

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty的基本概念,通过“Hello World”范例来理解其工作原理。 首先,让我们理解...

    Netty4编写服务器客户端,自定义编解码,发送自定义消息

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个项目中,我们将深入理解如何利用 Netty 4 来编写服务器和客户端,实现自定义的消息编解码,并进行通信...

    netty之UDP协议开发

    Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty之UDP协议开发”的项目中,我们将探讨如何使用Netty实现基于UDP(用户数据报协议)的应用。 UDP...

    Netty实战.epub_netty实战epub_netty实战epub_netty_

    Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种分布式系统、微服务架构以及高并发场景。 在Netty的学习过程中,首先需要理解的是它的基础概念。Netty基于NIO(非阻塞I/O)模型,提供了高效、...

Global site tag (gtag.js) - Google Analytics