当前位置: 首页 > 编程日记 > 正文

mina、netty消息边界问题(采用换行符)

在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息。理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次read。但是,现实不总是按照剧本来走。

MINA官方文档节选:

TCP guarantess delivery of all packets in the correct order. But there is no guarantee that one write operation on the sender-side will result in one read event on the receiving side. One call of IoSession.write(Object message) by the sender can result in multiple messageReceived(IoSession session, Object message) events on the receiver; and multiple calls of IoSession.write(Object message) can lead to a single messageReceived event.

Netty官方文档节选:

In a stream-based transport such as TCP/IP, received data is stored into a socket receive buffer. Unfortunately, the buffer of a stream-based transport is not a queue of packets but a queue of bytes. It means, even if you sent two messages as two independent packets, an operating system will not treat them as two messages but as just a bunch of bytes. Therefore, there is no guarantee that what you read is exactly what your remote peer wrote.

上面两段话表达的意思相同:TCP是基于字节流的协议,它只能保证一方发送和另一方接收到的数据的字节顺序一致,但是,并不能保证一方每发送一条消息,另一方就能完整的接收到一条信息。有可能发送了两条对方将其合并成一条,也有可能发送了一条对方将其拆分成两条。

对此,MINA的官方文档提供了以下几种解决方案:

1、use fixed length messages

使用固定长度的消息。比如每个长度4字节,那么接收的时候按每条4字节拆分就可以了。

2、use a fixed length header that indicates the length of the body

使用固定长度的Header,Header中指定Body的长度(字节数),将信息的内容放在Body中。例如Header中指定的Body长度是100字节,那么Header之后的100字节就是Body,也就是信息的内容,100字节的Body后面就是下一条信息的Header了。

3、using a delimiter; for example many text-based protocols append a newline (or CR LF pair) after every message

使用分隔符。例如许多文本内容的协议会在每条消息后面加上换行符(CR LF,即"\r\n"),也就是一行一条消息。当然也可以用其他特殊符号作为分隔符,例如逗号、分号等等。

mina server

   IoAcceptor acceptor = new NioSocketAcceptor();  // 添加一个Filter,用于接收、发送的内容按照"\r\n"分割  acceptor.getFilterChain().addLast("codec",   new ProtocolCodecFilter((ProtocolCodecFactory) new TextLineCodecFactory(Charset.forName("UTF-8"), "\r\n", "\r\n")));  acceptor.setHandler((IoHandler) new TcpServerHandle2());  acceptor.bind(new InetSocketAddress(8080)); 

netty server

    ServerBootstrap b = new ServerBootstrap();  b.group(bossGroup, workerGroup)  .channel(NioServerSocketChannel.class)  .childHandler(new ChannelInitializer<SocketChannel>() {  @Override  public void initChannel(SocketChannel ch)  throws Exception {  ChannelPipeline pipeline = ch.pipeline();  // LineBasedFrameDecoder按行分割消息  pipeline.addLast(new LineBasedFrameDecoder(80));  // 再按UTF-8编码转成字符串  pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));  pipeline.addLast(new TcpServerHandler2());  }  });  ChannelFuture f = b.bind(8080).sync();  f.channel().closeFuture().sync(); 

client

socket = new Socket("localhost", 8080);  out = socket.getOutputStream();  // 请求服务器  String lines = "床前明月光\r\n疑是地上霜\r\n举头望明月\r\n低头思故乡\r\n";  byte[] outputBytes = lines.getBytes("UTF-8");  out.write(outputBytes);  out.flush();  

但是这样是有问题的,如果消息内容本身就有换行符,这个肯定是不对的

原文地址:http://www.cnblogs.com/wucao/p/3936559.html

转载于:https://www.cnblogs.com/xiaoblog/p/5640661.html

相关文章:

关于延时操作的使用

延时操作主要有4种方式 1.sleep方式 [NSThread sleepForTimeInterval:1.0f]; [self delayMethod]; 使用sleep方式在主线程和子线程中均可执行,但是这是中阻塞线程的方式,所以建议放到子线程中使用,以免卡住主线程使界面卡住. 没有发现取消执行的方法. 2.NSTimer定时器方式 …

CGpoint,CGSize,CGRect,NSRange

NSRange (范围);(location,位置 length&#xff0c;长度; NSPoint /CGpoint&#xff08;点&#xff09;; NSSize /CGSize&#xff08;大小&#xff09; CGPoint p1 CGPointZero CGPointMake(0, 0)代表原点 CGSizeZero CGSizeMake(0, 0);代表大小为0 CGRect rec CGRectMake…

Linux之socket套接字编程20160704

介绍套接字之前&#xff0c;我们先看一下传输层的协议TCP与UDP&#xff1a; TCP协议与UDP协议的区别 首先咱们弄清楚&#xff0c;TCP协议和UCP协议与TCP/IP协议的联系&#xff0c;很多人犯糊涂了&#xff0c;一直都是说TCP/IP协议与UDP协议的 区别&#xff0c;我觉得这是没有从…

WebViewJavascriptBridge的简单使用

- (void)viewDidLoad { UIWebView* webView [[UIWebView alloc] initWithFrame:self.view.bounds]; webView.backgroundColor [UIColor whiteColor]; [self.view addSubview:webView]; // 打开输出日志[WebViewJavascriptBridge enableLogging]; // 设置关联…

区块链架构详解

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 准备工作 区块链不是一种技术实现&#xff0c;而是一个系统的架构设计&#xff0c;使用一系列的技术组合用于完成去中心化的数据存储。比特…

Git详解之九 Git内部原理

以下内容转载自&#xff1a;http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章&#xff0c;还是读完了其余各章一直到这&#xff0c;你都将在本章见识 Git 的内部工作原理和实现方式。我个人发现学习这些内容对于理解…

Hadoop2.6.0伪分布环境搭建

用到的软件&#xff1a; 一、安装jdk&#xff1a; 1、要安装的jdk&#xff0c;我把它拷在了共享文件夹里面。 &#xff08;用优盘拷也可以&#xff09; 2、我把jdk拷在了用户文件夹下面。 &#xff08;其他地方也可以&#xff0c;不过路径要相应改变&#xff09; 3、执行复制安…

ios 设置tableview左滑删除按钮的相关属性

自定义cell时在layoutSubviews处理 - (void)layoutSubviews { [super layoutSubviews]; [self dealDeleteButton]; } - (void)dealDeleteButton{ for (UIView *subView in self.subviews) { if ([subView isKindOfClass:NSClassFromString("…

区块链基础:理论和术语

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 一、区块链&#xff1a; 1.百度百科上对区块链的定义是&#xff1a;区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机 技…

Python Socket编程基础篇

Socket网络编程 socket通常也称作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文…

redis使用epoll

redis使用epoll的代码在ae_epoll.c文件中。 epoll_create&#xff1a;redis服务器在启动时&#xff0c;创建事件循环&#xff0c;调用epoll_create方法创建epoll实例。 static int aeApiCreate(aeEventLoop *eventLoop) {aeApiState *state zmalloc(sizeof(aeApiState));if (!…

贝塞尔结合CAShapeLayer绘制路线,CABasicAnimation实现的小动画

最近项目需求,做的一个标识正在直播的小动画,代码如下: #import "YGIsOnLiveAnmationView.h" interface YGIsOnLiveAnmationView () property (strong, nonatomic) CAShapeLayer * progressLayer; property (strong, nonatomic) CAShapeLayer * triangleLayer; p…

区块链和可持续性

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链和可持续性 在区块链算法和区块链平台方面&#xff0c;可持续性可以有多种解释。一方面&#xff0c;任何听说过比特币网络能源需求的…

eclipse中maven打包

第一种方式&#xff1a;将依赖包打包进一个jar包中。 <build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target><encoding>${pro…

2014年国内最热门的.NET开源平台

http://developer.51cto.com/art/201501/464292.htm转载于:https://www.cnblogs.com/littlehb/p/5646300.html

从 PoS 进化 SPoS:无能耗共识机制

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 从 PoS 进化 SPoS&#xff1a;无能耗共识机制 我们为 V SYSTEMS 区块链平台设计了了一个注重高扩展性的权益证明&#xff08;PoS&#xff…

Linux运维跳槽必备的40道面试精华题

过一次年&#xff0c;结婚、存款、父母养老&#xff0c;一系列向钱看的事都在碾压我们本来还挺简单的神经&#xff0c;但难过没有出路&#xff0c;唯有找到好的方法和事业方向&#xff0c;才能实现一步一个脚印的逆袭。 下面是一名资深Linux运维求职数十家公司总结的Linux运维面…

Oracle Sales Cloud 实施(二)

Oracle Sales Cloud 实施&#xff08;二&#xff09; 从第一个任务列表开始&#xff1a; Review Company Profile&#xff08;公司的主要信息&#xff09; 第一个任务&#xff1a;Manage Enterprise HCM Information &#xff08;管理公司HCM信息&#xff09; 名字可以修改&a…

修改系统tabbar的高度

项目中用到了不规整的tabbar, 但是如果使用自定义又会有tabbar动画方面的问题 找到了一个折中的办法, 修改系统tabbar的高度 - (void)viewDidLoad { [super viewDidLoad]; [self.tabBar setShadowImage:[UIImage new]]; self.tabBar.backgroundImage [UIIm…

区块链技术的标准化和颠覆性

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 区块链技术的标准化和颠覆性 区块链技术的实施是企业财务战略上的明智之举。它不仅在加密货币方面&#xff0c;而且在数据标准化软件方面&…

RHEL/CentOS通用性能优化、安全配置参考

RHEL/CentOS通用性能优化、安全配置参考 本文的配置参数是笔者在实际生产环境中反复实践总结的结果&#xff0c;完全适用绝大多数通用的高负载、安全性要求的网络服务器环境。故可以放心使用。 若有异议&#xff0c;欢迎联系zhangxugg163.com探讨。 提示&#xff1a;强烈建议使…

关于Cocoa Pods的升级安装和使用说明

前段时间要使用Cocoa Pods ,安装时发现Ruby版本过低导致安装失败, 查找教程解决后又出现Cocoa Pods新版本导致的问题, 以下给出解决办法: 一 . 升级Ruby 1.安装RVM RVM是用于Ruby的版本管理 安装命令行: $ curl -L get.rvm.io | bash -s stable $ source ~/.rvm/scripts/rvm 等…

Linux使用netstat命令查看并发连接数

我们的网站部署在linux的服务器上&#xff0c;特别是web服务器&#xff0c;我们可能有时候做为运维人员&#xff0c;肯定是要查看网站的并发连接数是不是达到瓶颈等&#xff0c;所以在linux下&#xff0c;我们如何查看服务器的并发连接数呢&#xff1f;使用以下命令即可分组查看…

深入挖掘Hyperledger Fabric中的私有数据

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 深入挖掘Hyperledger Fabric中的私有数据 私有数据是fabric中讨论最多的特性&#xff0c;在v1.2中发布。它在多个参与者之间引入了数据隐私…

几种任务调度的 Java 实现方法与比较

综观目前的 Web 应用&#xff0c;多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的 Java 实现方法&#xff0c;包括 Timer&#xff0c;Scheduler, Quartz 以及 JCron Tab&#xff0c;并对其优缺点进行比较&#xff0c;目的在于给需要开发任务调度的程序员提供有…

7.Mongodb复制(副本集)

1、复制 什么是复制 复制提供了数据的冗余备份&#xff0c;并在多个服务器上存储数据副本&#xff0c;提高了数据的可用性&#xff0c;并可以保证数据的安全性复制还允许从硬件故障和服务中断中恢复数据为什么要复制 数据备份数据灾难恢复读写分离高&#xff08;24* 7&#xff…

关于iOS10的适配

每一次的iOS升级, 都伴随着各种坑的出现, 今年iOS10也不例外 本着一定要紧随最新科技的开发态度, 最近将手机升级到了iOS10, xcode升级到了8.0 但是紧随而来的就是各种崩溃, 各种坑, 现列举如下: 一 . 用户隐私权限的访问 公司是做视频直播的, 所有在用户隐私权限上面还是有…

分布式系统中节点之间的同步形成区块链

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义&#xff0c;“分布式系统是一组独立的计算机&#xff0c;在”分布式…

hdu 2199 Can you solve this equation? 二分

1.精度问题 由于是double类型&#xff0c;rmid 而不是rmid-12.如果首位两端&#xff08;f&#xff08;0&#xff09;和f&#xff08;100&#xff09;&#xff09;同号&#xff0c;证明解不在[1,100]区间内 这是我之所以TE的原因&#xff0c;没有预先判断3.若在这个区间内&#…

iOS iTunes Connect协议更新导致无法构建新版本

最近公司项目发新版本时遇到不能构建新的版本的情况, 了解后才知道 必须同意更新后的协议才能构建新版本、创建内购App&#xff0c;提交新的App 点击其中的蓝色文字进入相关界面 这样就可以构建新版本了 参考博客: http://blog.sina.com.cn/s/blog_134451adb0102wger.html