客户端:

  1. package com.client;
  2.  
  3. import java.net.InetSocketAddress;
  4. import java.util.Scanner;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import org.jboss.netty.bootstrap.ClientBootstrap;
  8. import org.jboss.netty.channel.Channel;
  9. import org.jboss.netty.channel.ChannelFuture;
  10. import org.jboss.netty.channel.ChannelPipeline;
  11. import org.jboss.netty.channel.ChannelPipelineFactory;
  12. import org.jboss.netty.channel.Channels;
  13. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
  14. import com.cn.codc.RequestEncoder;
  15. import com.cn.codc.ResponseDecoder;
  16. import com.cn.model.Request;
  17. import com.cn.module.fuben.request.FightRequest;
  18. /**
  19. * netty客户端入门
  20. */
  21. public class Client {
  22.  
  23. public static void main(String[] args) throws InterruptedException {
  24.  
  25. //服务类
  26. ClientBootstrap bootstrap = new ClientBootstrap();
  27.  
  28. //线程池
  29. ExecutorService boss = Executors.newCachedThreadPool();
  30. ExecutorService worker = Executors.newCachedThreadPool();
  31.  
  32. //socket工厂
  33. bootstrap.setFactory(new NioClientSocketChannelFactory(boss, worker));
  34.  
  35. //管道工厂
  36. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  37.  
  38. @Override
  39. public ChannelPipeline getPipeline() throws Exception {
  40. ChannelPipeline pipeline = Channels.pipeline();
  41. pipeline.addLast("decoder", new ResponseDecoder());//Response解码器
  42. pipeline.addLast("encoder", new RequestEncoder());//Request编码器
  43. pipeline.addLast("hiHandler", new HiHandler());//通过ResponseDecoder解码的是一个Response对象。
  44. return pipeline;
  45. }
  46. });
  47.  
  48. //连接服务端
  49. ChannelFuture connect = bootstrap.connect(new InetSocketAddress("127.0.0.1", 10101));
  50. Channel channel = connect.sync().getChannel();
  51.  
  52. System.out.println("client start");
  53.  
  54. Scanner scanner = new Scanner(System.in);
  55. while(true){
  56. System.out.println("请输入");
  57. int fubenId = Integer.parseInt(scanner.nextLine());
  58. int count = Integer.parseInt(scanner.nextLine());
  59.  
  60. FightRequest fightRequest = new FightRequest();
  61. fightRequest.setFubenId(fubenId);
  62. fightRequest.setCount(count);
  63.  
  64. Request request = new Request();
  65. request.setModule((short) 1);//请求第一个模块的
  66. request.setCmd((short) 1);
  67. request.setData(fightRequest.getBytes());//fightRequest是数据体data
  68. //发送请求
  69. channel.write(request);
  70. }
  71. }
  72.  
  73. }
  1. package com.client;
  2.  
  3. import org.jboss.netty.channel.ChannelHandlerContext;
  4. import org.jboss.netty.channel.ChannelStateEvent;
  5. import org.jboss.netty.channel.ExceptionEvent;
  6. import org.jboss.netty.channel.MessageEvent;
  7. import org.jboss.netty.channel.SimpleChannelHandler;
  8.  
  9. import com.cn.model.Response;
  10. import com.cn.model.StateCode;
  11. import com.cn.module.fuben.request.FightRequest;
  12. import com.cn.module.fuben.response.FightResponse;
  13. /**
  14. * 消息接受处理类
  15. */
  16. public class HiHandler extends SimpleChannelHandler {
  17.  
  18. /**
  19. * 接收消息
  20. */
  21. @Override
  22. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  23. Response message = (Response)e.getMessage();//解码出来的之后是Response对象,然后进行业务处理
  24.  
  25. if(message.getModule() == 1){
  26.  
  27. if(message.getCmd() == 1){
  28. FightResponse fightResponse = new FightResponse();
  29. fightResponse.readFromBytes(message.getData());
  30.  
  31. System.out.println("gold:" + fightResponse.getGold());
  32.  
  33. }else if(message.getCmd() == 2){
  34.  
  35. }
  36.  
  37. }else if (message.getModule() == 1){
  38.  
  39. }
  40. }
  41.  
  42. /**
  43. * 捕获异常
  44. */
  45. @Override
  46. public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
  47. System.out.println("exceptionCaught");
  48. super.exceptionCaught(ctx, e);
  49. }
  50.  
  51. /**
  52. * 新连接
  53. */
  54. @Override
  55. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  56. System.out.println("channelConnected");
  57. super.channelConnected(ctx, e);
  58. }
  59.  
  60. /**
  61. * 必须是链接已经建立,关闭通道的时候才会触发
  62. */
  63. @Override
  64. public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  65. System.out.println("channelDisconnected");
  66. super.channelDisconnected(ctx, e);
  67. }
  68.  
  69. /**
  70. * channel关闭的时候触发
  71. */
  72. @Override
  73. public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  74. System.out.println("channelClosed");
  75. super.channelClosed(ctx, e);
  76. }
  77. }

服务端:

  1. package com.server;
  2.  
  3. import java.net.InetSocketAddress;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6.  
  7. import org.jboss.netty.bootstrap.ServerBootstrap;
  8. import org.jboss.netty.channel.ChannelPipeline;
  9. import org.jboss.netty.channel.ChannelPipelineFactory;
  10. import org.jboss.netty.channel.Channels;
  11. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
  12. import org.jboss.netty.handler.codec.string.StringDecoder;
  13. import org.jboss.netty.handler.codec.string.StringEncoder;
  14.  
  15. import com.cn.codc.RequestDecoder;
  16. import com.cn.codc.ResponseEncoder;
  17. /**
  18. * netty服务端入门
  19. */
  20. public class Server {
  21.  
  22. public static void main(String[] args) {
  23.  
  24. //服务类
  25. ServerBootstrap bootstrap = new ServerBootstrap();
  26.  
  27. //boss线程监听端口,worker线程负责数据读写
  28. ExecutorService boss = Executors.newCachedThreadPool();
  29. ExecutorService worker = Executors.newCachedThreadPool();
  30.  
  31. //设置niosocket工厂
  32. bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker));
  33.  
  34. //设置管道的工厂
  35. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
  36.  
  37. @Override
  38. public ChannelPipeline getPipeline() throws Exception {
  39.  
  40. ChannelPipeline pipeline = Channels.pipeline();
  41. pipeline.addLast("decoder", new RequestDecoder());//Request的解码器
  42. pipeline.addLast("encoder", new ResponseEncoder());//Response的编码器
  43. pipeline.addLast("helloHandler", new HelloHandler());
  44. return pipeline;
  45. }
  46. });
  47. bootstrap.bind(new InetSocketAddress(10101));
  48. System.out.println("start!!!");
  49. }
  50. }
  1. package com.server;
  2.  
  3. import org.jboss.netty.channel.ChannelHandlerContext;
  4. import org.jboss.netty.channel.ChannelStateEvent;
  5. import org.jboss.netty.channel.ExceptionEvent;
  6. import org.jboss.netty.channel.MessageEvent;
  7. import org.jboss.netty.channel.SimpleChannelHandler;
  8.  
  9. import com.cn.model.Request;
  10. import com.cn.model.Response;
  11. import com.cn.model.StateCode;
  12. import com.cn.module.fuben.request.FightRequest;
  13. import com.cn.module.fuben.response.FightResponse;
  14. /**
  15. * 消息接受处理类
  16. */
  17. public class HelloHandler extends SimpleChannelHandler {
  18.  
  19. /**
  20. * 接收消息
  21. */
  22. @Override
  23. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
  24.  
  25. Request message = (Request)e.getMessage();
  26.  
  27. if(message.getModule() == 1){
  28.  
  29. if(message.getCmd() == 1){
  30.  
  31. FightRequest fightRequest = new FightRequest();
  32. fightRequest.readFromBytes(message.getData());
  33.  
  34. System.out.println("fubenId:" +fightRequest.getFubenId() + " " + "count:" + fightRequest.getCount());
  35.  
  36. //回写数据
  37. FightResponse fightResponse = new FightResponse();
  38. fightResponse.setGold(9999);
  39.  
  40. Response response = new Response();
  41. response.setModule((short) 1);
  42. response.setCmd((short) 1);
  43. response.setStateCode(StateCode.SUCCESS);
  44. response.setData(fightResponse.getBytes());
  45. ctx.getChannel().write(response);
  46. }else if(message.getCmd() == 2){
  47. }
  48. }else if (message.getModule() == 1){
  49. }
  50. }
  51.  
  52. /**
  53. * 捕获异常
  54. */
  55. @Override
  56. public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
  57. System.out.println("exceptionCaught");
  58. super.exceptionCaught(ctx, e);
  59. }
  60.  
  61. /**
  62. * 新连接
  63. */
  64. @Override
  65. public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  66. System.out.println("channelConnected");
  67. super.channelConnected(ctx, e);
  68. }
  69.  
  70. /**
  71. * 必须是链接已经建立,关闭通道的时候才会触发
  72. */
  73. @Override
  74. public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  75. System.out.println("channelDisconnected");
  76. super.channelDisconnected(ctx, e);
  77. }
  78.  
  79. /**
  80. * channel关闭的时候触发
  81. */
  82. @Override
  83. public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
  84. System.out.println("channelClosed");
  85. super.channelClosed(ctx, e);
  86. }
  87. }

网络传的是字节数据不是字符。

Netty之自定义数据包协议:
give me a coffee give me a tea (2条信息)

give me a coffeegive me a tea 粘包现象(2条信息粘在一起)

give me
a coffeegive me a tea 分包现象(第一条消息分开了,第一条后部分又粘到了第二条消息)

粘包和分包出现的原因是:没有一个稳定数据结构(没有确定一个请求传递哪些数据)

分割符:
give me a coffee|give me a tea|
give me a coffee|
give me a tea|

长度 + 数据:
16give me a coffee13give me a tea(读取16个就封装成一个请求,投递到业务层去)
16give me a coffee
13give me a tea

netty9---使用编码解码器的更多相关文章

  1. libZPlay 音频编码解码器库

    libZPlay 音频编码解码器库 http://www.oschina.net/p/libzplay libZPlay 播放音乐并显示 FFT 图形 :http://www.oschina.net/ ...

  2. [转]用C#实现的条形码和二维码编码解码器

    条形码的标准: 条形码的标准有ENA条形码.UPC条形码.二五条形码.交叉二五条形码.库德巴条形码.三九条形码和128条形码等,而商品上最常使用的就是EAN商品条形码.EAN商品条形码亦称通用商品条形 ...

  3. 用C#实现的条形码和二维码编码解码器

    本文主要介绍可以在C#中使用的1D/2D编码解码器.条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码:二维码也开始应用到很多场合,如火车票有二维码识别.网易的首页有二维码图标,用户只需 ...

  4. CVE-2010-2553 Microsoft Windows Cinepak 编码解码器解压缩漏洞 分析

      Microsoft Windows是微软发布的非常流行的操作系统.         Microsoft Windows XP SP2和SP3,Windows Vista SP1和SP2,以及Win ...

  5. 13-H.264编码解码器的无线应用:1080P60 3D无线影音传输器

    H.264编码解码器的无线应用:1080P60 3D无线影音传输器 一.应用领域 家庭媒体娱乐中心 新闻现场采访 无线3D投影机 高清视频会议终端无线延长器 教学,医疗示教 考古,高档商业区域,监狱等 ...

  6. netty系列之:自定义编码解码器

    目录 简介 自定义编码器 自定义解码器 添加编码解码器到pipeline 计算2的N次方 总结 简介 在之前的netty系列文章中,我们讲到了如何将对象或者String转换成为ByteBuf,通过使用 ...

  7. netty系列之:netty中的懒人编码解码器

    目录 简介 netty中的内置编码器 使用codec要注意的问题 netty内置的基本codec base64 bytes compression json marshalling protobuf ...

  8. netty系列之:netty中常用的字符串编码解码器

    目录 简介 netty中的字符串编码解码器 不同平台的换行符 字符串编码的实现 总结 简介 字符串是我们程序中最常用到的消息格式,也是最简单的消息格式,但是正因为字符串string太过简单,不能附加更 ...

  9. netty系列之:netty中常用的对象编码解码器

    目录 简介 什么是序列化 重构序列化对象 序列化不是加密 使用真正的加密 使用代理 Serializable和Externalizable的区别 netty中对象的传输 ObjectEncoder O ...

  10. DIOCP之注册编码解码器与ClientContext

    FTcpServer.registerCoderClass(TIOCPStreamDecoder, TIOCPStreamEncoder);//注册编码器与解码器 FTcpServer.registe ...

随机推荐

  1. ios开发之--NSMutableParagraphStyle与NSParagraphStyle的使用

    在ios6以后,苹果官方建议用“- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options ...

  2. ios开发之 --调用系统的页面,显示中文

    在开发的过程中,我们会接入很多的sdk,比如相机,相册,是否允许获取位置等,大多数的情况下是默认显示英文, 在plist文件里面添加一个key就可以了,如下图: key:Localization na ...

  3. Android 网卡地址Mac Wifi文件

    1./system/etc/firmware/ti-connectivity/wl1271-nvs.bin的文件 2./data/etc/wifi/fw文件 3./data/nvram/APCFG/A ...

  4. JB开发之问题汇总 [jailbreak,越狱技术]

    1.升级到Mac 10.9.1,Xcode 升级到5出现的问题: 1)升级前要做的事情: ①升级/重新安装iOSOpenDev,在终端输入 xcode-select --switch (xcode_d ...

  5. Linux命令之乐--curl

    参数: -I   获取头部信息 -s/--silent      Silent mode. Don't output anything 沉默模式 --connect-timeout <secon ...

  6. 指针与C++基本原理

    面向对象编程与传统的过程性编程的区别在于,OOP强调的是在运行阶段(而不是编译阶段)进行决策.运行阶段指的是程序正在运行时,编译阶段指的是编译器将程序组合起来时.运行阶段决策就好比度假时,选择参观那些 ...

  7. 扩展jquery scroll事件,支持 scroll start 和 scroll stop

    效果预览: github: https://besswang.github.io/webapp-scroll/ 参考地址: http://www.ghugo.com/special-scroll-ev ...

  8. Linux Tar 命令简明教程

    Tar 命令经常用但是它的各种参数又总是记不住,因此彻底梳理了一下,再也不会忘记. Tar 是 Linux 中的(压缩)归档工具. 归档的意思与打包相同,就是把文件或目录或者多个文件和目录打包为一个文 ...

  9. 170419、Centos7下完美安装并配置mysql5.6

    首先跟各位说声抱歉,原计划说每天一篇博文,最近由于实在太忙,封闭式开发一个项目,没有时间写博文,望大家见谅!!! 由于公司要搭建分布式服务,我把最近我所用到或者学习的技术或者遇到的问题跟大家分享一下! ...

  10. 160422、Highcharts后台获取数据

    而我这次做的是趋势图,涉及到动态刷新,做的过程还是花了一番功夫的,也补充和巩固了一点js的知识,为了纪念,把过程记录一下: 首先,是引入HIghcharts绘图相关的js文件和jQuery.js. 接 ...