IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 光棍天堂TCP协议进行消息发送时,对消息分帧 -> 正文阅读

[网络协议]光棍天堂TCP协议进行消息发送时,对消息分帧

成帧技能(光棍天堂)是处理如安在接纳端定位音讯的首尾方位的问题。在进行数据收发时,有必要指定音讯接纳者怎样供认何时音讯现已接纳无缺。

在TCP协议中,音讯是依照字节来传输的,并且TCP协议中是没有音讯距离的概念的。由于当client和server两头建立TCP联接后,两头能够清闲发送字节数据。

为了能够在音讯传输中供认音讯的距离,需求引入额定的信息来标明音讯距离。常用的办法有两种:

根据定界符与根据显式音讯长度

根据定界符

咱们在音讯的完毕增加一个仅有符号作为音讯完毕符,这个仅有的符号一般是一个字节或许一组字节序列,并且在音讯中不能呈现这个符号。

根据定界符的办法一般用于以文本办法编码的音讯中,定义一个特别的字符作为分隔符来标明音讯完毕。但是这个分隔符也有或许作为一般字符或许会呈现在音讯中,导致音讯解分呈现过失。为了让音讯中不呈现分隔符,需求引入填充(stuff)技能,在发送端对音讯进行扫描,假定碰到分隔符,就将这个分隔符用一个替换符和其他符号(比如将原始字符二进制中的第三位取反得到一个新的字节作为)替换,相同的,假定扫描中遇到替换符,将替换符也用一个替换付和其他符号替换。在音讯的接纳端,相同也对接纳到的音讯进行扫描,当碰到替换符时,阐明该字符不是音讯中的,要将后边一个字符进行恢复得到相应的原始字符,这个才是音讯中实在的字符。当遇到分隔符时,阐明该音讯现已完毕

显式音讯长度

在音讯前面增加一个固定大小的字段(一个字节或许两个字节长度),用于标明音讯包括的字节个数(也便是音讯的长度)。在音讯发送时,核算音讯的长度(字节数),作为音讯的前缀。假定运用一个字节保存长度,则音讯长度最大为28=25628=256个字节,假定是两个字节保存长度,则音讯长度最大为216=65536216=65536个字节

音讯成帧与解析的完毕

在java中,当client和server之间建立tcp联接后,就能够经过输入输出流(I/O stream)来进行音讯传输。发送音讯时,将待发送的音讯写入OutputStream流中,然后发送到接纳端InputStream流;接纳端则从InputStream流中读取出音讯。怎样完毕将音讯按帧发送与接纳,就需求要运用咱们上面说到的办法。

咱们先定义一个Framer接口,来声明两个办法,音讯成帧frameMsg()和音讯抽取nextMsg()

package chapter_3.frame; import java.io.IOException; import java.io.OutputStream; /**
 * @author fulv
 * Framer接口声明晰两个办法,用于音讯成帧和解析将待发送音讯封装成帧并输出到指定流
 */ public interface Framer { /**
     * 将输入的音讯msg封装成帧,然后输出到out流
     *
     * @param msg 输入的音讯
     * @param out 音讯输出流
     */ void frameMsg(byte[] msg, OutputStream out); /**
     * 从指定流中读取下一个音讯帧
     *
     * @return byte[]
     */ byte[] nextMsg() throws IOException;
}

然后别离运用根据分隔符和根据显式音讯光棍天堂长度两种办法来完毕Framer接口

根据分隔符:

在这里,咱们运用字符'\n'作为音讯分隔符,它对应的字节为0x0A;运用的替换符为0x7D。替换的战略是:当扫描到待发送的音讯byte数组中有0x0A时,将其替换为(0x7D,0x2A),假定遇到0x7D,将其替换为(0x7D,0x5D)。这里边第二个字符经过将待替换字符从左向右数第三位取反取得。

在 接纳端,从输入流中读取字节流数据,遇到0x7D时,阐明后边一个字节对应的是特别字节,需求转化得到原始字节。假定遇到0x0A阐明到达音讯帧完毕,完毕了一个音讯帧的读取。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:35:43  更:2021-07-27 16:38:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:41:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码