1.1理解通信协议的概念
通信协议的两个特点:1.通信的流程 首先要能连接上服务器,连接上后,双方必须遵守严格约定的消息发送顺序,否则就无法保持双方的交流。
2.通信消息格式的定义 客户端在连接通道上向服务器发送消息时,服务器必须知道凭什么来界定收到的数据算是“一条”消息?
打电话时,我们听到的一句话是根据中文的语法基础决定的。当两台机器通信时,这个规则必须定义明确,且双方遵守。多人聊天室开发过程中,大家容易犯这样的错误:如果客户端发送的消息不加上“\r\n”做一条消息的标识符,服务器就无法读到这条消息。
根据这个思路,可以和服务器约定:将用户名和密码用一条消息发送,它们之间用#号隔开。这个约定就是一种消息格式的定义。
故,通信协议可以理解为:规定通信双方的通信流程和数据格式的规则,要参与通信的双方都只有按照这个规则发送,数据才可以正常通信。
1.2 定义文件传输协议并实现 1.定义文件传输协议 FTP 无论用户从界面上输入的是什么,到了对端的InputStream流上读取时,依然是一个一个字节读取的。我们规定服务器和客户端之间传送的消息格式如下:
(1)两种消息类型。
一种是聊天文本信息,一条聊天消息必须包含这条消息的文本内容和将要发送给用户的名字。
另一种是文件消息,文件消息除了包含将要发送给用户的名字外,还必须有文件名和文件内容的数据,其中文件内容的数据只能是以字节格式传送。
(2)每一种(聊天文本/文件)消息由两部分组成。 分别是消息头和消息体。所有消息的消息头结构格式是固定的,消息体结构的格式则因不同消息而异。
消息头部分结构如下:
(3)每个消息的消息头由三部分组成。
- 消息总长totalLen:用一个int(4个字节)表示这一条消息(无论是聊天文本还是文件)一共有多少个字节,这个长度包含了消息总长度定义的4个字节。
- 消息类型type:用一个字节表示,可以定义1代表聊天文本信息,2代表传送文件消息。还可以根据系统需要再扩展其定义。
- 接收者账号destNum:为简单起见,接收者的号都是一个int型数字(由4个字节组成)。
消息体 如果是聊天文本消息,即type为1时,消息体部分非常简单,只是聊天的内容MsgContent.
消息头的总长度减去消息头部分所占的9个字节,余下的就是组成聊天内容的字节数。
如果type为2,则消息为一条传送文件的消息,消息体如图:
一条完整的消息必须由消息头和消息体组成。消息在网络上传送时,对应字段的次序、格式、长度定义
必须符合以上协议的规定。
2.协议说明发送方发送消息时,必须按照顺序和格式将数据依次写入输出流对象中。
服务器端在读取时:
(1)首先读取一个int型数据,即消息的总长度。
(2)再读取一个byte数据,即消息类型值,根据其值判定这条消息是文本还是文件。
(3)如果消息类型值是1,则认为是文本聊天信息。然后读取一个int型,作为接收方的号码。根据协议的 规则,总长度=(消息长度的4个字节)+类型的1个字节+接收号码的4个字节+消息内容字节长度,余下的长度则是聊天内容的字节个数,假设是MsgLen。最后读取MsgLen个字节,组成一个字符串,就是用户聊天的内容。
(4)如果类型是2,则是文件消息。读取接收方号码后,再读取256个字节组成一个字符串当做文件名。
如果发送时文件名师abc.gif,长度还是256个字节。因为根据协议,这个字段的固定长度是256个字节。发送时,不足256个字节则补足二进制0('0')。对方接收后,只要去掉所读取字节转成的字符串末尾的空格,得到的就是发送的文件名。最后,用总长度减掉前面每个字段的长度,余下的数字就是要读取的文件内容的字节长度,将这些字节读入,存放到文件中,即完成文件的传送。
阅读(2131) | 评论(0) | 转发(1) |