[Android初级]android与netty4初体验

博主曾经对netty4的helloword很感兴趣,也曾单纯的写过一个小小的聊天室java代码,现在重新来看看,浏览了这位牛人的博客 点击去看看

我觉得受益匪浅,故拿来分享。

这次是在android上使用netty作为客户端,来与服务端相互通讯的小事例,纯粹的helloworld,效果就是在android程序中发送一个消息到服务端,然后服务端也回一个消息给客户端,很简单的demo,.大牛看了可不要吐槽啊!

1.demo结构

2.服务端代码:

Server.java

package org.jan.netty.demo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class MyHelloServer {

	private static final int PORT = 7878;

	public static void main(String[] args) {
		EventLoopGroup parentGroup = new NioEventLoopGroup();
		EventLoopGroup childrenGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap serverBootstrap = new ServerBootstrap();
			serverBootstrap.group(parentGroup, childrenGroup);
			serverBootstrap.channel(NioServerSocketChannel.class);
			//添加工作线程
			serverBootstrap.childHandler(new MyHelloServerInitializer());
			// 服务器绑定端口监听
			ChannelFuture cf = serverBootstrap.bind(PORT).sync();
			// 监听服务器关闭监听
			cf.channel().closeFuture().sync();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			parentGroup.shutdownGracefully();
			childrenGroup.shutdownGracefully();
		}
	}
}

MyHelloServerHandler.java

package org.jan.netty.demo;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;

import java.net.InetAddress;
import java.nio.charset.Charset;

public class MyHelloServerHanler extends SimpleChannelInboundHandler<String> {

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, String msg)
			throws Exception {
		String recStr = new String(msg.getBytes(), Charset.forName("UTF-8"));
		//收到消息直接打印输出
		System.out.println(ctx.channel().remoteAddress()+" say :"+recStr);
		//返回客户端
		ctx.writeAndFlush("Received your message!\n");
	}

	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println("RamoteAddress: "+ctx.channel().remoteAddress()+" active!");
//		ctx.writeAndFlush("Welcome to " + InetAddress.getLocalHost().getHostName() + "'s service!\n");
		ctx.writeAndFlush("我是服务端,我是服务端!\n");
		super.channelActive(ctx);
	}
}

3.android客户端代码:

package org.jan.nio.exapmle;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

import java.net.InetSocketAddress;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class ClientActivity extends Activity {
	private static final String TAG = "MainActivity";
	public static final String HOST = "192.168.50.110";
	public static int PORT = 7878;
	private NioEventLoopGroup group;
	private Button sendButton;
	private static Context context;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;
		sendButton = (Button) findViewById(R.id.netty_send_button);
		sendButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				connected();
			}
		});
	}

	// 连接到Socket服务端
	private void connected() {
		new Thread() {
			@Override
			public void run() {
				 group = new NioEventLoopGroup();
				try {
					// Client服务启动器 3.x的ClientBootstrap
					// 改为Bootstrap,且构造函数变化很大,这里用无参构造。
					Bootstrap bootstrap = new Bootstrap();
					// 指定channel类型
					bootstrap.channel(NioSocketChannel.class);
					// 指定Handler
					bootstrap.handler(new MyClientInitializer(context));
					// 指定EventLoopGroup
					bootstrap.group(group);
					// 连接到目标IP的8000端口的服务端
					Channel channel = bootstrap.connect(new InetSocketAddress(HOST,
											PORT)).sync().channel();
					channel.writeAndFlush("我是客户端,我是客户端!\r\n");
					channel.read();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		if(group!=null){
			group.shutdownGracefully();
		}
	}

}

4.实现效果:

去下载demo

时间: 2024-11-01 16:34:07

[Android初级]android与netty4初体验的相关文章

[Android初级]android模拟器中的串口Serialport测试

最近项目要使用到串口通讯,在搭载android系统的主板上监听COM口的数据,这块之前没接触过,我搜索了一下找到一个开源项目:android-serialport-api,通过这个开源项目,我可以轻松的在android应用层监听和请求所需要的设备端口的数据. 使用前,考虑到没有硬件的条件下,我先做个虚拟测试.在电脑上虚拟建立2个com口,(com2<-------->com3),他们是互通的,我要这么做,通过android应用监听com2,接收来自com2的数据并显示,然后再往com2发送数据

[Android初级]android单元测试之Activity单独测试

有种情况,我们开发人员可能要对已经完成的应用做维护,其中某个界面可能存在bug,所以为了测试某个可能存在问题的功能界面而从入口一直开始跳至该界面,这个情况,我们测试人员可以自己不停的跳过一些非测试目的界面,浪费了时间.这里有个小的方式,是android提供的系统测试方案,可以来试试,今天我试了试Activity的单独测试方式,感觉还不错,在这里分享给各位. 首先模拟一个我们要被测的项目:TestActivity和主要测试的登陆界面 需要测试的功能是,模拟用户输入,并登陆操作,以及重置功能的操作验

【Android开发经验】Android Studio1.0正式版初体验——常用功能使用指南

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 上一篇文章中,我们把Android Studio的平台都搭建起来了,这一篇文章,将介绍Android Studio的一些常用的功能介绍.下面要介绍的功能是最常用的,但是肯定不全,如果你有什么其他的疑问,可以给我留言,解决之后我会告诉你. 1.如何导入Eclipse项目创建的项目 我们之前的项目基本都是Eclipse创建的,如果我现在想用Android Studio来管理,我们应该怎么做呢? 首先,在Ecl

android防反编译技术初体验——混淆

这几天做项目要做混淆,所以搜集资料学习了下,这次主要记录混淆的步骤,如有需要改正和完善的地方,还麻烦能够指出,大家共同进步o(* ̄▽ ̄*)ブ 1.项目防反编译技术步骤: a) 加密. b) 混淆. c) 加壳(加固); 2.加密:对信息进行摘要计算,然后摘要值用私钥进行验签,重要数据使用rsa非对称加密: 3.混淆:Android Studio开发工具自身集成了Java语言的ProGuard技术,对java代码有压缩.优化.混淆.预检的功能,AcFlash项目的Android端使用了ProGua

【Android开发经验】Android Studio1.0正式版初体验——Mac/Window双平台安装指南

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 自从谷歌在2013年的I/O大会上推出Android Studio(下称AS)之后, 测试版一直在不断更新,我也一直在关注着这款开发工具的动态.在前几天谷歌终于发布了AS的正式版,并且鼓励Android开发者从Eclipse转向这款新的开发工具.对于国内的开发者来说,由于使用习惯和团队工作的关系,可能短期内不会转向AS,但是从长远来看,我感觉AS一定会取代Eclipse的,因为Eclipse的占用内存大.

Android Studio初体验之启动AVD模拟器异常:cannot set up guest memory &#39;pc.ram&#39;

启动AVD模拟器异常:Cannot set up guest memory 'pc.ram' 错误信息: HAX is working and emulator runs in fast virt mode Cannot set up guest memory 'pc.ram': Invalid argument Error accepting connect 分析 各种查资料,没有发现网上有同样问题的,在一篇相关文章中找到类似的解决方法. 从语意看,应该是hax安装后没有启动.(不懂hax是什

Android Studio 初体验

Google在I/O2013大会上公布了Android新的开发工具Android Studio,趁周末时间做了一下尝试.有须要的能够 在http://developer.android.com/sdk/installing/studio.html下载,当前版本号是V0.1.官方解释:Android Studio is a new Android development environment based on IntelliJ IDEA. Similar to Eclipse with the

使用Kotlin开发Android应用初体验

使用Kotlin开发Android应用初体验 昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之前,很多同学一定有很多疑问,Kotlin到底有啥好处,怎么和现有的项目共存呢?Java那么些特性Kotlin都有吗?嗯,让我们一一来看. 以下内容摘自:Kotlin的官方网站:https://www.kotlincn.net/docs/reference/android-overview.html

Android中socket初体验

最近要做一个Android的项目,用到socket和服务器之间交互,研究了一个小demo.主要遇到了以下几个问题: 1.客户端创建socket对象时一直失败NetworkOnMainThreadException,查了一下,原因是4.0之后在主线程中执行http请求会报这个错.解决办法是将代码放到了一个新线程中,问题就解决了. 2.服务器接收到客户端信息后反馈给客户端信息,将该信息表示在客户端UI上时报“android.view.ViewRoot$CalledFromWrongThreadExc