我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:2019跑狗图高清彩图 > 帧首定界符 >

【Java TCPIP Socket编程】----发送和接收数据消息成帧与解析

归档日期:07-23       文本归类:帧首定界符      文章编辑:爱尚语录

  在程序中使用套接字向其他程序提供信息或者使用其他程序提供的信息,这就需要任何需要交换信息的程序间在信息编码方式上达成共识(包含了信息交换的形式和意义),称为。大部分应用程序协议是根据字段序列组成的离散信息定义的,而每个字段有包含了一段位序列编码的特定信息。应用程序协议中明确定义了信息发送者应该怎么排列和解释这些信息,同时定义接收者应该怎样解析。TCP/IP协议中信息必须在块(8位的倍数)中发送和接收,

  传输信息时,对于一个TCP套接字而言,通过套接字将字节信息写到一个与Socket关联的OutputStream实例中。而UDP套接字会将信息封装到DatagramPacket实例中,然后通过DatagramSocket发送。可见传输的信息的数据是字节和字节数组。Java是强类型语言,需要将其他数据类型转换成字节数组。为了完整传输字节信息,需要发送端和接收端达成一些共识:

  1)传输的每个整数字节大小(size)。如Java中int数据类型由32位表示,所以使用4个字节传输int型的变量或者常量。

  3)传送的数值是有符号的还是无符号的。Java中4种基本整型都是有符号的,编码和解码无符号数需要掩码。掩码是整数值,其中一位或者多位是1,其他为0,与掩码进行“位操作”清空特定一位或者得到特定的一位。

  4)明确符号与整数的映射方式(即编码方式),才能使用文本信息通信。发送者如果和接收者采用不同的字符集,可能会造成乱码的情况,Java中传输文本信息--字节/字节数组,可以调用getBytes()方法,并可以将字符集名称传递getBytes()方法。

  发送端按照规定格式传输数据,接收端必须将接收到的字节序列还原成原始信息,应用程序协议通常处理的是由一组字段组成的离散信息,无论信息以文本、多字节二进制或者两者结合传输,必须指定消息的接收者如何确定何时消息已完整接收。成帧技术解决了接收端如何定位消息的首位位置问题。

  1.使用UDP套接字发送数据,消息负载到DatagramPacket中发送,由于DatagramPacket负载的数据有一个确定的长度,接收者能够准确地知道消息的结束位置。

  2.对于TCP套接字,没有消息边界的概念。如果每个消息有固定数量字段组成,所有字段又有固定的长度,消息的长度就能确定,接收端可将消息长度对应的字节数读取到字节缓冲区中。对于可变消息长度,需要确定消息以及字段的边界问题。

  1)基于定界符:消息的结束由一个唯一的标记指出,即发送者在传输完数据后显式添加的一个特殊字节序列。但要求消息本身不能存在定界符。

  2)显式长度:在变长字段或消息前附加一个固定大小的字段。用来指示该字段或消息包含了多少字节。

  需要注意的一点是:基于定界符使用在TCP连接上传输的最后一个消息上,发送完这个消息后,发送者就简单地关闭(使用shutdownOutput()或者close()方法)发送端的TCP连接,接收者读取万这条消息的最后一个字节后,将接收到一个流结束标记(即read()方法返回-1),该编辑指示出已经读取到达了消息的末尾。

  下面的案例分别使用两中成帧技术来发送消息,接口Framer定义了两个方法,frameMsg()方法定义使用成帧技术将消息添加到流中,而nextMsg()通过判断成帧技术判断消息末尾,读取下一条消息。

  下面的类基于定界符的成帧方法,定界符为“换行”符(\n).frameMsg()方法并没有实现填充,当成帧的字节序列中包含了定界符时,简单地抛出了异常。nextMsg()方法扫描流,知道读取到定界符,并返回定界符前面的所有的字符。如果流为空则返回null,如果累积了一个消息的不少字符,但知道流结束也没有知道定界符,程序将抛出一个异常来只是成帧错误。

  基于长度的成帧方法,适用于长度小于65535字节的消息,发送者首先给出指定消息的长度小于65535字节的消息,发送者首先给出指定消息的长度,并将长信息以big-endian顺序存入两个字节的整数中,再将这两个字节放在完整的消息内容前,连同消息一起写入输出流。在接收端,我们使用DataInputStream读取整型的长度信息,readFully()方法将阻塞等待,直到给定数组完全填满。这种成帧方法,发送者不需要检查成帧的消息内容,只需要检查消息的长度是否超出了限制。

  概述:通过简单投票的例子学习一下,TCP/IP通讯需要注意的那些点,或者这个例子会其他知识,只要是知识就要慢慢捡,捡着捡着就多了。1.它的类的布局如下:总结:1.在设计TCP/IP传输过程中必须定义好...博文来自:m0_37355951的博客

  串口通信解包是比较复杂的,解包的情况是根据发送方发送的各种情况进行正确的解析处理。最开始我想的比较简单,比如假如已知发送方发送完整的一帧,接收方收到后,先进行转义,然后进行CRC校验判断数据是否有误,...博文来自:szx494846955的博客

  一、TCP数据报结构以及三次握手TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开...博文来自:Blucher_Ce的博客

  TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。应用数据被分割成TCP认为最适合发送的数据块。...博文来自:lianliange85的专栏

  授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

  授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周上午根据用户上周的博文发布情况由系统自动颁发。

本文链接:http://passion2017.com/zhengshoudingjiefu/259.html