了解了Netty的基本概念,开发起来应该会顺手很多。在“Hello World”代码中,我们只是在完成绑定的时候,在各自的本地打印了简单的信息,并没有客户端和服务端的消息传递。这个肯定是最基本的功能。在上代码之前,先补充一个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());}

所以,我们要想传递字符串,那么就必须转换成ChannelBuffer。明确了这一点,接下来我们上代码:

/*** @author lihzh* @alia OneCoder* @blog http://www.coderli.com*/
public class MessageServer {public static void main(String args[]) {// Server服务启动器ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));// 设置一个处理客户端消息和各种消息事件的类(Handler)bootstrap.setPipelineFactory(new ChannelPipelineFactory() {@Overridepublic ChannelPipeline getPipeline() throws Exception {return Channels.pipeline(new MessageServerHandler());}});// 开放8000端口供客户端访问。bootstrap.bind(new InetSocketAddress(8000));}private static class MessageServerHandler extends SimpleChannelHandler {/*** 用户接受客户端发来的消息,在有客户端消息到达时触发* * @author lihzh* @alia OneCoder*/@Overridepublic void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {ChannelBuffer buffer = (ChannelBuffer) e.getMessage();System.out.println(buffer.toString(Charset.defaultCharset()));}}
}
/*** @author lihzh* @alia OneCoder* @blog http://www.coderli.com*/
public class MessageClient {public static void main(String args[]) {// Client服务启动器ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));// 设置一个处理服务端消息和各种消息事件的类(Handler)bootstrap.setPipelineFactory(new ChannelPipelineFactory() {@Overridepublic ChannelPipeline getPipeline() throws Exception {return Channels.pipeline(new MessageClientHandler());}});// 连接到本地的8000端口的服务端bootstrap.connect(new InetSocketAddress("127.0.0.1", 8000));}private static class MessageClientHandler extends SimpleChannelHandler {/*** 当绑定到服务端的时候触发,给服务端发消息。* * @alia OneCoder* @author lihzh*/@Overridepublic 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);}}}

与“Hello World”样例代码不同的是,客户端在channel连通后,不是在本地打印,而是将消息转换成ChannelBuffer传递给服务端,服务端接受到ChannelBuffer后,解码成字符串打印出来。同时,通过对比可以发现,变动的只是Handler里的代码,启动服务和绑定服务的代码没有变化,也就是我们在概念介绍里提到了,关注Handler,在Handler里处理我们自己的业务。所以,以后我们会只给出业务中关键代码,不会在上重复的代码:)

由于在Netty中消息的收发全依赖于ChannelBuffer,所以,下一章我们将会详细的介绍ChannelBuffer的使用。我们一起学习。

netty大白话--字符串的收发(三)相关推荐

  1. java 中利用subString 截取字符串中第三个/后面的内容,并将/用代替

    原文地址为: java 中利用subString 截取字符串中第三个"/"后面的内容,并将/用>代替 private String extractString(String ...

  2. java string分割_java 字符串分割的三种方法(总结)

    最近在项目中遇到一个小问题,一个字符串分割成一个数组,类似String str="aaa,bbb,ccc"; 然后以","为分割符,将其分割成一个数组,用什么方 ...

  3. java的字符串截取函数_java 字符串截取的三种方法(推荐)|chu

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...

  4. java字符串abc反转_JAVA字符串反转的三种方法

    方法一:使用StringBuilder import java.util.Scanner; public class StrReversal { public static void main(Str ...

  5. java截取倒数后六位的字符串_java 字符串截取的三种方法(推荐)

    众所周知,java提供了很多字符串截取的方式.下面就来看看大致有几种. 1.split()+正则表达式来进行截取. 将正则传入split().返回的是一个字符串数组类型.不过通过这种方式截取会有很大的 ...

  6. python中字符串输出的三种简单方式

    python字符串输出的三种简单方式 第一种: 用'+'号进行字符串的拼接,但只限于字符串,不能进行其他类型的拼接.但是可以进行强制类型转换(字符串的强制转换为str(名字)),再用加号进行拼接. 比 ...

  7. netty解析字符串转16进制问题

    netty和许多终端设备通信时, netty使用字符串传递数据, 但有时需要按照16进制来解析数据内容,这种情况极容易出现错误, 因为Java中字符串是以"UTF-8"来解析的, ...

  8. Go语言字符串拼接的三种方式

    Go语言字符串拼接的三种方式 使用bytes.Buffer实现字符串拼接 通过创建一个缓冲byte类型的缓冲器str1,然后通过WriteString方法将传入的字符串放入缓冲器的尾部,已达到拼接的作 ...

  9. 设计科目类Subject,其类的实例表示大学课程科目。一门课程包含课程名(String)、课程编码(code)为六位字符串,前三位字符为字母代表学科领域,后三位字符为数字,课程编码是唯一的。

    求大神帮忙写一个变成 带注释的 我实在是没整明白!! 救救孩子吧 孩子可着急了! 设计科目类Subject,其类的实例表示大学课程科目.一门课程包含课程名(String).课程编码(code)为六位字 ...

最新文章

  1. CodeForces - 1360G A/B Matrix(最大流)
  2. 【Java】计算一组同学一门课程的平均成绩、最高成绩和最低成绩
  3. Objective-C的对象模型
  4. ROS系列:八、图像消息和OpenCV图像之间进行转换-cv_bridge
  5. 系统集成项目管理工程师通过率高吗?
  6. 卡尔曼滤波算法--C语言实现
  7. pageadmin CMS网站制作教程:栏目单页内容如何修改
  8. 如何裁剪图片中不要的部分?这个裁剪方法很好用
  9. 嵌入式Linux C编程学习之路(八)——read/write,lseek函数,cp指令的代码实现
  10. Reids简直存储,key以“\xAC\xED\x00\x05t\x00“开头
  11. 微软魔镜——从“解语花”到“读心树”的神奇魔法
  12. ios开发——AirPlay的琢磨经历
  13. python round()_使用Xcode + Python进行IOS运动轨迹模拟!
  14. 炼丹心得|技术信仰有多重要,我们邀请到了这位大咖来聊聊
  15. bpsk的matlab仿真,用MATLAB仿真BPSK调制
  16. 理解了DirectShow播放原理
  17. unity3d 塔防休闲类游戏《城堡王国-Castle Kingdom Season》截图
  18. AI 神器让专业 PPT 制作触手可得! #Decktopus
  19. 什么是伪多项式时间算法
  20. intellij idea如何右键新建文件中添加jsp格式的文件【初学者适用】

热门文章

  1. kafka 多线程消费
  2. Vue.js之初印象
  3. Kanzi编程基础3 - 图片读取与显示
  4. wordpress如何屏蔽wp-json(禁用REST API)
  5. Objective-C中的@Property详解
  6. java获取资源文件的各种方法
  7. linux修改ip dhcp,Linux下在静态IP与动态DHCP之间切换的脚本
  8. python的符号函数得到的数字类型_python-1:Number数字类型 之二 相关函数 int.from_bytes,int.to_bytes()...
  9. 登峰连接程式改坐标软件_数控仿真软件CIMCOEdit常用的操作,新手必看
  10. eclipse java import_java – Eclipse:将源代码的import文件夹导入...