Android 基于Netty的消息推送方案之字符串的接收和发送(三)
在上一篇文章中《Android 基于Netty的消息推送方案之概念和工作原理(二)》 ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffer的东东。
ChannelBuffer
Netty中的消息传递,都必须以字节的形式,以ChannelBuffer为载体传递。简单的说,就是你想直接写个字符串过去,对不起,抛异常。虽然,Netty定义的writer的接口参数是Object的,这可能也是会给新上手的朋友容易造成误会的地方。Netty源码中,是这样判断的。
- SendBuffer acquire(Object message) {
- if (message instanceof ChannelBuffer) {
- return acquire((ChannelBuffer) message);
- } else if (message instanceof FileRegion) {
- return acquire((FileRegion) message);
- }
- throw new IllegalArgumentException(
- "unsupported message type: " + message.getClass());
- }
接下来我们写一个Demo来学习它。
服务端代码如下
- public class MessageServer {
- public static void main(String args[]){
- //服务启动器
- ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));
- //设置一个处理客户端消息和各种消息事件的类(Handler)
- bootstrap.setPipelineFactory(new ChannelPipelineFactory(){
- @Override
- public ChannelPipeline getPipeline() throws Exception {
- return Channels.pipeline(new BusinessHandler());
- }
- });
- //开放8000端口供客户端连接
- bootstrap.bind(new InetSocketAddress(8000));
- }
- private static class BusinessHandler extends SimpleChannelHandler{
- // 服务端收到客户端发送过来的消息时,触发此方法
- @Override
- public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
- ChannelBuffer buffer = (ChannelBuffer)e.getMessage();
- System.out.println("Receive:"+buffer.toString(Charset.defaultCharset()));
- String msg = buffer.toString(Charset.defaultCharset()) + "has been processed!";
- ChannelBuffer buffer2 = ChannelBuffers.buffer(msg.length());
- buffer2.writeBytes(msg.getBytes());
- e.getChannel().write(buffer2);
- }
- }
- }
客户端代码如下
- public class MessageClient {
- public static void main(String args[]) {
- ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
- bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
- @Override
- public ChannelPipeline getPipeline() throws Exception {
- return Channels.pipeline(new MessageClientHandler());
- }
- });
- bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
- }
- private static class MessageClientHandler extends SimpleChannelHandler {
- /**
- * 当绑定到服务端的时候触发,给服务端发消息。
- */
- @Override
- public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
- // 将字符串,构造成ChannelBuffer,传递给服务端
- String msg = "Hello, I'm client.";
- ChannelBuffer buffer = ChannelBuffers.buffer(msg.length());
- buffer.writeBytes(msg.getBytes());
- e.getChannel().write(buffer);
- }
- }
- }
先启动服务端,再启动客户端,可以看到服务端打印如下字符串
- Receive:Hello, I'm client.
如果你感兴趣,请继续阅读《Android 基于Netty的消息推送方案之对象的传递(四)》
Android 基于Netty的消息推送方案之字符串的接收和发送(三)的更多相关文章
- Android 基于Netty的消息推送方案之对象的传递(四)
在上一篇文章中<Android 基于Netty的消息推送方案之字符串的接收和发送(三)>我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuf ...
- Android 基于Netty的消息推送方案之概念和工作原理(二)
上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...
- Android 基于Netty的消息推送方案之Hello World(一)
消息推送方案(轮询.长连接) 轮询 轮询:比较简单的,最容易理解和实现的就是客户端去服务器上拉信息,信息的及时性要求越高则拉信息的频率越高.客户端拉信息的触发可以是一些事件,也可以是一个定时器,不断地 ...
- android基于XMPP的消息推送机制
关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的 ...
- Android 几种消息推送方案总结
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- Knative 实战:基于 Kafka 实现消息推送
作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...
- 基于FCM的消息推送功能
需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...
- android通过服务实现消息推送
这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架 android项目中,有时会有这样一种需求:客户每隔 ...
随机推荐
- Windows 设置时间同步
1.Windows Server 2008 r2 注:{}内是你要同步的外部服务器地址,例如复旦的时间同步服务器地址为:ntp.fudan.edu.cn,则完整命令如下: w32tm /config ...
- WPFPath素材
放在Viewbox中可固定比例 <!--五角星--> <Canvas Width="100" Height="100"> <Pat ...
- Max Min Middle
/*三者中的中间数*/#define Max(a,b) (a>b?a:b) #define Min(a,b) (a<b?a:b) int MiddleOfThree(int a, int ...
- java+tomcat 在 linux下的部署
一.配置JAVA运行环境 1.安装jdk. 从sun公司网站www.sun.com下载linux版本的jdk, 建议使用jdk1.6版本.地址http://java.sun.com/javase/do ...
- [转载] 与WIN不同,linux替换文件夹会删除原文件夹下的全部内容!
今天差点把源码给覆盖掉了><...555... 虚惊一场!!看了一篇博客分析这种情况.我的环境是CentOS5.5,不会出现文件夹直接被覆盖的情况,但是在Linux下不要用Win下的一些直 ...
- 国内开源html5游戏引擎全收录
本文引自<国内开源html5游戏引擎全收录> 游戏开发这潭水太深,英文水平太差,不敢看国外的, 而且这几年国内技术水平也挺高了不少,特别是JS方面.(我个人感觉) 最近看了几个国产的js游 ...
- Android-第一个Android程序
Android项目的目录结构及功能 目录 功能 gen 自动生成的文件,不要修改 assets 项目中自定义的需要用到的资源,Android平台不能识别 res 工程资源,Android平台能够识别, ...
- jquery判断滚动条到底
$(document).scroll(function(){ var dHeight = $(document).height(); var wHeight = $(window).height(); ...
- thrift的简单实现
1.使用windows实现,首先在apache官网下载一个thrift的编译工具,在项目中建一个文件叫add.thrift的文件,内容如下: namespace java com.vipshop.sa ...
- JAVA - 多线程的同步
多线程的同步 1. 锁对象. 应用场景:当某个数据可能被其他线程修改时,给涉及到数据的方法上锁,保证同一时刻只有拥有这个锁的线程能访问该数据,其他要调用这个方法的线程被阻塞.注意:必须是不同线程访问同 ...