- 浏览: 242028 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
maotou1988:
android基于netty的发送图片与文字demo,楼主共勉 ...
在android中使用netty框架通信 -
ZSRTFAT:
学习了,谢谢分享
android 基于surfaceview 的多点触控实现 -
charlotte:
学习了!!!!!
Java nio 客户端连接Server -
nilo:
您好, 本人菜鸟, 正在学习设计模式. 当我学习完简单工厂模式 ...
策略模式 -
fokman:
一江春水邀明月 写道缺少SocketInfoUtils Th ...
Java nio 客户端连接Server
今日将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
发表评论
-
获得手机相关信息的实现方法
2015-04-04 00:55 820本文介绍了如何通过android提供的servi ... -
android判断当前sdk版本以及是否是平板
2013-11-19 13:53 1326最近做了一个项目中需要使用appWidget,但是 ... -
android 程序检查当前应用是否在运行
2012-11-09 17:05 1121最近做一个项目,需要知道当前的android 程序是 ... -
netty 找不到org.jboss.netty.bootstrap.ClientBootstrap解决
2012-09-25 14:20 4083今天碰到一个莫名其妙的问题,在做socket连接的时候发 ... -
定义文本样式
2012-09-06 14:19 1092android程序中的按钮经常需要定义文字的大小,是否加粗,居 ... -
点击按钮显示不同的状态
2012-09-06 14:05 1026android给我们提供的UI还比较丰富,但是基本上都 ... -
android 两个listView 共存的显示问题
2012-08-07 09:55 2537如果在一个layout里面需要定义有两个listvie ... -
定义带箭头的Button 样式
2012-08-02 10:58 11216定义一个圆角的Button 样式 <style ... -
android UI入门三 自定义背景样式
2012-08-01 15:23 1407在android 开发应用中,大部份的开发人员 ... -
android UI入门二 定义图片横竖屏切换正确显示
2012-07-30 13:20 3246android开发的时候通常会使用到横竖屏切换,但是 ... -
android UI入门一
2012-07-24 12:20 951在ios系统中,常常看到绚丽的画面让人心动不已。然而在 ... -
android spinner 实现国码选择
2012-07-13 15:33 3979android 中得Spinner相当于是一个下拉框 ... -
在自己的android应用中调用打电话实现
2012-07-13 15:10 1087最近在做一个项目,需要在自己写的应用中调用打电话给别人 ... -
android 定义圆角Button
2012-06-30 15:31 5078定义styles.xml <?xml version= ... -
android 自定义导航控件
2012-06-26 15:19 7888在编写android应用程序的过程中,经常会使用到导航 ... -
android observer 处理handler消息
2012-06-12 09:41 2085在开发android网络应用程序,通常都会使用han ... -
android wifi 处理
2012-06-12 09:35 3227在android应用程序中可以很方便的使用wifi来处理不同的 ... -
android canvas 使用
2012-04-06 09:38 7683Canvas 又称为画布,在游戏开发过程中是一个经常使用的类。 ... -
android 基于surfaceview 的多点触控实现
2012-04-06 08:55 12469hello,各位朋友。最近接到一个功能需要实现多 ... -
给android imageView(图片) 添加超链接
2012-03-29 09:29 8095hi ,各位好朋友,最近忙于开发没有时间更新博客。 有很多朋 ...
相关推荐
这个压缩包中的"Netty简单应答程序"示例,旨在展示如何使用Netty构建一个基本的通信系统,其中客户端能够向服务器发送消息,并接收到服务器的回应。 首先,我们要理解Netty的基本组件。Netty的核心是其Channel...
从最简单的Socked编程,到目前为止已经有了开源的框架,那就是Netty,它Jobss开发的一个网络异步应用框架,能高快捷的实现网络客户端和服务器端的优秀框架,而本实例就是基于这个框架实现的聊天程序,希望对你有用
使用netty 4.x 编写的聊天室程序,实现client-client client-server server-client 全双工通信
读书笔记:netty权威指南自己编写的样例
Netty即时通讯程序是基于Java开发的一个高效、高性能的网络应用程序框架,主要用于构建高度可定制化的服务器和客户端应用,尤其适合处理并发连接和大规模数据传输。这个程序的目的是实现类似于微信、QQ这样的即时...
《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...
Java进阶技术-netty进阶之路
Netty是Java领域的一款高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。...Netty的强大之处在于它的高度定制性,可以轻松处理多种网络协议和复杂的应用场景。
在基于Netty编写的socket服务端中,首先需要定义一个`ChannelHandler`,这个处理器负责处理接收到的网络事件,如连接建立、数据读取、连接关闭等。`ChannelHandlerContext`则是`ChannelHandler`和`ChannelPipeline`...
Netty进阶之路 跟着案例学Netty 整本书无密码,Netty进阶之路 跟着案例学Netty
《Netty进阶之路:跟着案例学Netty》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...
Netty和Socket.IO是两种常用于构建实时通信系统的框架,它们在在线聊天程序、客服模块以及广告推送等应用场景中有着广泛的应用。让我们深入探讨这两个技术及其在构建在线聊天程序中的运用。 **Netty** Netty是由...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本入门程序中,我们将深入探讨如何结合 Maven 和 Eclipse 创建一个简单的 Netty 项目。 首先,让我们了解 ...
在“Netty与ActiveMQ的程序代码范例”中,我们可以预期找到的是如何将这两个强大的工具结合使用的实例。Netty通常用作网络层的基石,处理TCP/IP协议栈中的低级任务,如套接字管理、数据缓冲和高效的I/O操作。而...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨Netty的基本概念,通过“Hello World”范例来理解其工作原理。 首先,让我们理解...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个项目中,我们将深入理解如何利用 Netty 4 来编写服务器和客户端,实现自定义的消息编解码,并进行通信...
Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty之UDP协议开发”的项目中,我们将探讨如何使用Netty实现基于UDP(用户数据报协议)的应用。 UDP...
Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种分布式系统、微服务架构以及高并发场景。 在Netty的学习过程中,首先需要理解的是它的基础概念。Netty基于NIO(非阻塞I/O)模型,提供了高效、...