在上一篇文章中《Android 基于Netty的消息推送方案之概念和工作原理(二)》 ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffer的东东。

ChannelBuffer

Netty中的消息传递,都必须以字节的形式,以ChannelBuffer为载体传递。简单的说,就是你想直接写个字符串过去,对不起,抛异常。虽然,Netty定义的writer的接口参数是Object的,这可能也是会给新上手的朋友容易造成误会的地方。Netty源码中,是这样判断的。

  1. SendBuffer acquire(Object message) {
  2. if (message instanceof ChannelBuffer) {
  3. return acquire((ChannelBuffer) message);
  4. } else if (message instanceof FileRegion) {
  5. return acquire((FileRegion) message);
  6. }
  7. throw new IllegalArgumentException(
  8. "unsupported message type: " + message.getClass());
  9. }

接下来我们写一个Demo来学习它。

服务端代码如下

  1. public class MessageServer {
  2. public static void main(String args[]){
  3. //服务启动器
  4. ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));
  5. //设置一个处理客户端消息和各种消息事件的类(Handler)
  6. bootstrap.setPipelineFactory(new ChannelPipelineFactory(){
  7. @Override
  8. public ChannelPipeline getPipeline() throws Exception {
  9. return Channels.pipeline(new BusinessHandler());
  10. }
  11. });
  12. //开放8000端口供客户端连接
  13. bootstrap.bind(new InetSocketAddress(8000));
  14. }
  15. private static class BusinessHandler extends SimpleChannelHandler{
  16. // 服务端收到客户端发送过来的消息时,触发此方法
  17. @Override
  18. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  19. ChannelBuffer buffer = (ChannelBuffer)e.getMessage();
  20. System.out.println("Receive:"+buffer.toString(Charset.defaultCharset()));
  21. String msg = buffer.toString(Charset.defaultCharset()) + "has been processed!";
  22. ChannelBuffer buffer2 = ChannelBuffers.buffer(msg.length());
  23. buffer2.writeBytes(msg.getBytes());
  24. e.getChannel().write(buffer2);
  25. }
  26. }
  27. }

客户端代码如下

  1. public class MessageClient {
  2. public static void main(String args[]) {
  3. ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
  4. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  5. @Override
  6. public ChannelPipeline getPipeline() throws Exception {
  7. return Channels.pipeline(new MessageClientHandler());
  8. }
  9. });
  10. bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));
  11. }
  12. private static class MessageClientHandler extends SimpleChannelHandler {
  13. /**
  14. * 当绑定到服务端的时候触发,给服务端发消息。
  15. */
  16. @Override
  17. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
  18. // 将字符串,构造成ChannelBuffer,传递给服务端
  19. String msg = "Hello, I'm client.";
  20. ChannelBuffer buffer = ChannelBuffers.buffer(msg.length());
  21. buffer.writeBytes(msg.getBytes());
  22. e.getChannel().write(buffer);
  23. }
  24. }
  25. }

先启动服务端,再启动客户端,可以看到服务端打印如下字符串

  1. Receive:Hello, I'm client.

如果你感兴趣,请继续阅读《Android 基于Netty的消息推送方案之对象的传递(四)》

Android 基于Netty的消息推送方案之字符串的接收和发送(三)的更多相关文章

  1. Android 基于Netty的消息推送方案之对象的传递(四)

    在上一篇文章中<Android 基于Netty的消息推送方案之字符串的接收和发送(三)>我们介绍了Netty的字符串传递,我们知道了Netty的消息传递都是基于流,通过ChannelBuf ...

  2. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  3. Android 基于Netty的消息推送方案之Hello World(一)

    消息推送方案(轮询.长连接) 轮询 轮询:比较简单的,最容易理解和实现的就是客户端去服务器上拉信息,信息的及时性要求越高则拉信息的频率越高.客户端拉信息的触发可以是一些事件,也可以是一个定时器,不断地 ...

  4. android基于XMPP的消息推送机制

    关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据.但是实现简单,主要缺点:耗电等2.Google的 ...

  5. Android 几种消息推送方案总结

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一张国内Top500 Android应用中它们用到的第三方推送以及所占数量: 现 ...

  6. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  7. Knative 实战:基于 Kafka 实现消息推送

    作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...

  8. 基于FCM的消息推送功能

    需求背景 我方项目需要支持客户端消息推送,iOS终端可以借由苹果本身的apns很方便的实现,但是对于Android来说,必须集成第三方的SDK来处理.考虑到项目需要以及成本,我们选择使用谷歌的FCM框 ...

  9. android通过服务实现消息推送

    这里运用到的andorid知识模块主要有Notification和Service,和一个android-async-http-master开源框架 android项目中,有时会有这样一种需求:客户每隔 ...

随机推荐

  1. 实现SQLServer数据库转成MYSQL数据库

    1.首先需要下载安装工具Navicat Premium. 2.注意:将数据库移至本地SQLServer,我试过直接在局域网上其他SQLServer服务器上想转到本地Mysql好像有问题,想将远程数据库 ...

  2. Ubuntu 11.10开启root用户登陆

    以管理员身份运行 #sudo gedit /etc/lightdm/lightdm.conf 将里面改成 "autologin-user=root" 就可以以root用户登录了

  3. mysql 写数据操作几次硬盘?

    mysql 写数据步骤: 1:写入操作事物日志,持久化操作日志到磁盘,并且只是写在磁盘上一小块区域内的顺序io,不需要像随机io一样 在磁盘多个地方移动磁头 2:内存中事物日志持久化以后  ,写入的数 ...

  4. 单例模式 与lock用法

    在之前没用lock之前:如果我实现单例模式:直接就是下面的代码: public class Singleton    {        private static Singleton instanc ...

  5. Skin++ 皮肤库 CCheckListBox MFC 界面风格

    今天使用CCheckListBox,发现增加进去的字符串无法显示,但是当点击的时候,确有反应. 仔细检查代码,没有问题.之前也是这样用的,完全没有问题. 思前想后,觉得是因为使用了Skin++皮肤库, ...

  6. java 代码第一天练习

    这个是在其他博文中看到的http://blog.sina.com.cn/eltaera,用来记录学习分享 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个 ...

  7. 武汉科技大学ACM :1002: 零起点学算法38——求阶乘和

    Problem Description 输入一个正整数n(n<=10),计算 S=1!+2!+3!+...+n! Input 输入一个正整数n(n<=10)(多组数据) Output 输出 ...

  8. Linux Shell脚本编程--sed命令详解

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  9. Oracle数据库之PL/SQL异常处理

    Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料 ...

  10. 总结一下apply和call的异同点

    call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就 ...