当前位置: 首页 > news >正文

家装设计网站排行榜前十名网站备案查询姓名

家装设计网站排行榜前十名,网站备案查询姓名,交互效果好的移动端网站,泰安网络推广平台处理消息边界 为什么要处理边界 因为会存在半包和粘包的问题 1.客户端和服务端约定一个固定长度 优点:简单 缺点:可能造成浪费 2.客户端与服务端约定一个固定分割符 *缺点 效率低 3.先发送长度,再发送数据 TLV格式: type…

处理消息边界

为什么要处理边界

因为会存在半包和粘包的问题

1.客户端和服务端约定一个固定长度

  • 优点:简单

  • 缺点:可能造成浪费

2.客户端与服务端约定一个固定分割符

*缺点 效率低

3.先发送长度,再发送数据

TLV格式: type类型,length长度,Value数据,类型和长度已知的情况下,就可以方便获取消息大小

http1.1是TLV格式
http2.0是LTV格式

4.自动扩容解决消息边界问题

在这里插入图片描述

第一次read事件未能读完全部的输入,那么会产生第二个读事件,那么在第一次读的时候进行扩容,
并复制之前的内容至新的buffer中,
在第二个读事件触发以后使用扩容后的buffer,读取剩余的数据

buffer应当和各自的channel绑定,如何绑定,需要用到附件attachment,
attachment需要在注册时放到selectionKey中。

// 绑定附件
SelectionKey scKey = channel.register(selector,0,byteBuffer);// 获取附件
scKey.attachment();// 指定新的附件(覆盖附件)
scKey.attach(bytebuffer);

示例代码:

package com.ysf;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;public class BorderSelectorServer {/*** 读取到 '\n'时打印* @param byteBuffer 缓冲字节*/public static void handle(ByteBuffer byteBuffer) {byteBuffer.flip();for (int i = 0; i < byteBuffer.limit(); i++) {if (byteBuffer.get(i) == '\n') {int length = i + 1 - byteBuffer.position();ByteBuffer allocate = ByteBuffer.allocate(length);for (int j=0;j<length;j++){allocate.put(byteBuffer.get());}allocate.flip();System.out.println(Charset.defaultCharset().decode(allocate));}}byteBuffer.compact();}public static void main(String[] args) throws IOException {// 声明一个选择器Selector selector = Selector.open();// 声明一个serverServerSocketChannel ssc = ServerSocketChannel.open();ssc.bind(new InetSocketAddress(11027));ssc.configureBlocking(false);// 注册这个server到selectorSelectionKey sscKey = ssc.register(selector, 0, null);// 添加sscKey关心的事件,因为是serverChannel,所以应当关心accept事件sscKey.interestOps(SelectionKey.OP_ACCEPT);while (true) {selector.select();Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();iterator.remove();if (key.isAcceptable()) {ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();SocketChannel socketChannel = serverChannel.accept();socketChannel.configureBlocking(false);// 声明一个buffer缓冲区和socketChannel绑定ByteBuffer byteBuffer = ByteBuffer.allocate(16);SelectionKey scKey = socketChannel.register(selector, 0, byteBuffer);scKey.interestOps(SelectionKey.OP_READ);} else if (key.isReadable()) {// 当客户端异常断开链接是需要处理IOExceptiontry {SocketChannel channel = (SocketChannel) key.channel();ByteBuffer byteBuffer = (ByteBuffer) key.attachment();int read = channel.read(byteBuffer);if (read == -1) {// 客户端close()了key.cancel();}else{// 调用处理逻辑handle(byteBuffer);if (byteBuffer.position() == byteBuffer.limit()){// buffer满了,需要扩容ByteBuffer bufferEx = ByteBuffer.allocate(byteBuffer.capacity() * 2);byteBuffer.flip();bufferEx.put(byteBuffer);key.attach(bufferEx);}}}catch (IOException e){
//                        e.printStackTrace();key.cancel();}}}}}
}
http://www.yayakq.cn/news/218306/

相关文章:

  • 网站开发图片压缩上传报酬上海网站建设哪家口碑好
  • 广东网站设计哪家好长春网站建设联系吉网传媒优
  • 免费建网站哪个平台好用word制作网页
  • 招聘网站套餐上海公司注销
  • 安卓做网站教程网站建设设计企业
  • 东平网站制作哪家好精美驾校企业网站模板
  • 南充市房地产网官方网站接效果图做网站
  • 连云港市网站设计网站导入链接
  • 付网站建设费如果做账广州开发区人才工作集团有限公司
  • 梧州网站建设设计网上制作
  • 怎么把几个网站做互通做dw网站图片怎么下载地址
  • 北流科技网站建设开淘宝店做网站开发
  • 互联网家装平台有哪些英文seo外链发布工具
  • 南京seo公司教程seo推广优化收费
  • 行业门户网站开源泰安有什么互联网公司
  • 网站开发core文件作用wordpress 轻云
  • 优惠的网站建设定制柜子品牌排行榜前十名
  • 蚌埠市建设管理局官方网站微信电商小程序有哪些
  • 目前网站在初级建设阶段 需要大量数据丰富企业猫源码网
  • 网站开发市场分析网上制作公章
  • 宁波正规网站建设方式注册公司流程步骤
  • 品牌手机网站开发站长工具精品
  • 濮阳网站优化公司哪家好wordpress 描述插件
  • 武威市凉州区建设局网站商务网站建设
  • 对外贸营销型网站建设的几点建议seo做关键词怎么收费的
  • 网站首页排名没了wordpress rt 15主题
  • 百度收录的网站多久更新一次长春火车站有几个
  • 个人建设网站成本学雷锋做美德少年网站
  • 做辅食网站网站模板预览与编辑器
  • 微信微网站教程怎么自己制作属于自己的网站