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

在android中使用netty框架通信

 
阅读更多

    最近在做一个项目,基于android版本的一个物联网应用,涉及到了关于socket通信方面的内容,在google上搜了一下,发现Netty框架可以快速的实现socket通信。而且使用起来十分方便。

1.建立socket连接

public class CmdClient {
	private ClientBootstrap bootstrap;
	private ChannelFuture channelFuture;
	private Channel channel;
	private static final CmdClient client = new CmdClient(); //单例实现,用来取channel
	private CmdClient(){
		
	}
	
	public static CmdClient getInstance(){
		return client;
	}
	
	public Channel getChannel() {
		return channel;
	}

	public void setChannel(Channel channel) {
		this.channel = channel;
	}

	public ClientBootstrap getBootstrap() {
		return bootstrap;
	}

	public void setBootstrap(ClientBootstrap bootstrap) {
		this.bootstrap = bootstrap;
	}

	public ChannelFuture getChannelFuture() {
		return channelFuture;
	}

	public void setChannelFuture(ChannelFuture channelFuture) {
		this.channelFuture = channelFuture;
	}

	public int start(String ip,int port) {
		System.setProperty("java.net.preferIPv4Stack", "true");
		System.setProperty("java.net.preferIPv6Addresses", "false");
		bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(
				Executors.newCachedThreadPool(),
				Executors.newCachedThreadPool()));
		bootstrap.setPipelineFactory(new CmdPipelineFactory());
		bootstrap.setOption("tcpNoDelay", true);
		bootstrap.setOption("keepAlive", true);
		channelFuture = bootstrap.connect(new InetSocketAddress(ip, port));
		channelFuture.awaitUninterruptibly();
		channel = channelFuture.awaitUninterruptibly().getChannel();
		return 1;
	}

	public void stop() {
		channelFuture.awaitUninterruptibly();
		if (!channelFuture.isSuccess()) {
			channelFuture.getCause().printStackTrace();
		}
		channelFuture.getChannel().getCloseFuture().awaitUninterruptibly();
		bootstrap.releaseExternalResources();
	}

 2.CmdPipelineFactory代码

public class CmdPipelineFactory implements ChannelPipelineFactory {
	@Override
	public ChannelPipeline getPipeline() throws Exception {
		ChannelPipeline pipeline = Channels.pipeline();
		pipeline.addLast("cmdDecoder", new CmdDecoder());
		pipeline.addLast("handler", new CmdClientHandler());
		return pipeline;
	}
	
}

 3.netty使用的是filter方式实现packet解析,这边我加入了一个CmdDecoder用来解析协议包头

public class CmdDecoder extends FrameDecoder {

    @Override
    protected Object decode(ChannelHandlerContext ctx, Channel channel,
            ChannelBuffer buffer) throws Exception {
        if (buffer.readableBytes() < 1) {
            return null;
        }
        buffer.markReaderIndex();
        ChannelBuffer magicBuff = buffer.readBytes(1);
        int magic = DataConvert.byteArrayToSignedInt(magicBuff
                .array());
        if (magic == 0x77) {
            if (buffer.readableBytes() < 19) {
                return null;
            }
            buffer.markReaderIndex();
            ChannelBuffer lenBuff = buffer.readBytes(19);
            PacketParse parse = new PacketParse(null);
            byte[] lenByte = parse.getPackForTwoByte(lenBuff.array(), 17, 2);
            int len = DataConvert.byteArrayToSignedInt(lenByte);
            if (buffer.readableBytes() < len) {
                buffer.resetReaderIndex();
                return null;
            }
            ChannelBuffer frame = buffer.readBytes(len);
            return frame;
        }
        buffer.clear();
        return null;
    }

这个需要根据自己所定义的协议来处理

分享到:
评论
1 楼 maotou1988 2016-05-18  
android基于netty的发送图片与文字demo,楼主共勉
http://lison.cc/508.html

相关推荐

    Android基于Netty框架实现通信

    Android基于Netty框架实现通信

    Android与Netty的结合通信

    近期正好研究Netty框架,写了简单易学的Android利用Netty框架实现的通信框架,服务器为Java工程,客户端为Android。希望大家一起学习。

    Android-netty和socket通信的demo

    Netty是基于Java NIO client-server的网络应用框架,使用Netty可以快速开发网络应用

    netty5.0通信jar和客户端服务器demo

    netty5.0通信框架实现客户端和服务器端demo 的数据对象传输,控制的比较完美,里面包括了netty5.0通信框架jar包

    基于Netty的Android点对点聊天软件-源码

    基于Netty的Android点对点聊天软件-源码 Netty是基于NIO的JAVA异步通讯框架,比Mina在性能上更具有优势,其作者也正是Mina的原作者之一。

    YIM是基于netty框架下的推送系统.zip

    YIM是基于netty框架下的推送系统,我们平常使用第三方的推送SDK,如极光推送,百度推送,小米推送,以及腾讯信鸽等来支撑自己的移动端的业务,或许有一些用户自己实现即时通讯系统的需求,那么YIM为您提供了一个解决...

    一款Android平台UDP双向通信源码

    本源码是《NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战》文中的代码,详见:http://www.52im.net/thread-388-1-1.html

    Android代码-sofa-bolt

    这些年我们在微服务与消息中间件在网络通信上解决过很多问题,积累了很多经验,并持续的进行着优化和完善,我们希望能把总结出的解决方案沉淀到 SOFABolt 这个基础组件里,让更多的使用网络通信的场景能够统一受益。...

    MobileIMSDK是一套专为移动端开发的原创IM通信层框架

    MobileIMSDK是一套专为移动端开发的原创IM通信层框架: 历经10年、久经考验; 超轻量级、高度提炼,lib包50KB以内; 精心封装,一套API优雅支持UDP 、TCP 、WebSocket 三种协议(可能是全网唯一开源的); 客户端...

    java开源包3

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    NettySocketDemo.rar

    本demo包括封装好的与后台通信的Socket(使用于netty框架),以及多串口之间通信,本demo已经用于一个项目,并且稳定运行(串口通信一般用mqtt通信,socket用的比较少,我上传的资源有mqtt,使用mqtt的可以去下载)...

    MobileIMSDK-master.zip

    MobileIMSDK是一套专为移动端开发的原创IM通信层框架:超轻量级、高度提炼,lib包50KB以内;精心封装,一套API优雅支持UDP 、TCP 、WebSocket 三种协议(可能是全网唯一开源的);客户端支持iOS、Android、标准Java...

    java开源包8

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    baomidou-SpringWind-spring-mvc_java_

    一个原创移动端IM通信层框架,轻量级、高度提炼,历经8年、久经考验。可能是市面上唯一同时支持UDP+TCP两种协议的同类框架,支持iOS、Android、Java,服务端基于Netty。

    java开源包1

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包11

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包2

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包6

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包5

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

Global site tag (gtag.js) - Google Analytics