Java Socket 发送/接收数据

在上一篇了解过 Java Socket 的两种形式(TCP、UDP)后,本文将继续介绍如何利用 Java Socket 发送和接收数据及其内部原理的实现。
Java Socket 的目的在于实现与其他程序的信息交互,包括发送和接收信息两种主要操作。进行信息交互的前提在于相互之间具有共同的协议,协议规定了程序之间交互信息的规范和标准。比如 IPv4 和 IPv6 就是定义了如何传输数据的标准,头部的基本结构等信息。

下面将从一个 Demo 入手讲解如何根据需求设计传输协议,实现程序交互。

1. 协议设计与实现

背景信息:为一个学生管理系统设计传输协议。该系统包括客户端和服务端两部分,客户端根据需求发送增、删、改、查相关命令,而服务端根据命令完成相应操作,并反馈信息。学生存储基本信息如下表所示。

项目 类型
id int
姓名 string
性别 “man” or “woman”
年龄 int

学生最大范围为 0 ~ 65535,列表每页个数为 5 ~ 10 个。

1.1 需求分析

1.1.1 功能需求分析

  • :客户端传入学生姓名、性别和年龄,服务端解析信息,并执行新增操作。
  • :客户端传入学生 id,服务端解析信息,根据 id 执行删除操作。
  • :客户端传入学生 id 和待修改信息,服务端解析信息,根据 id 和修改项执行修改操作。
  • 查询列表:客户端传入 pageNo 和 pageSize ,服务端解析信息,根据 pageNo 和 pageSize 执行分页查找操作。
  • 查询信息:客户端传入 学生 id,服务端解析信息,根据 id 执行查询操作。

1.1.2 性能需求分析

在这个问题中,暂不考虑性能需求,但实际业务中需考虑到频繁请求的业务并给出可能边界,具体问题具体分析。

1.2 协议设计

在该问题中可能的操作有 5 种,需要的二进制位至少需要 3 位(23 = 8 > 5)。但在此考虑可能的功能扩展,若使用 3 位存储所需功能,那只剩下 3 个不同功能扩展,后期可能会出现问题,因此考虑设置 4 位,这个放大根据实际情况考虑即可,原则是后期扩展不会出现问题。

1.2.1 新增

新增功能时,需要传输学生的姓名、性别、年龄。
姓名:考虑采用 GBK 编码,每个中文占 2 个字节,名字的最大长度为 4 个汉字(不考虑少数民族,以汉族为例),因此一共占用 8 个字节,不足补 0。
性别:类别数据,仅含有两类 man 和 woman,故可采用 0 / 1 来分别表示男 / 女,只需要 1 位。
年龄:年龄的范围 1 ~ 120,因此考虑 7 位二进制数即可。
由此,一个新增学生的传输格式可表示如下:

操作类型 姓名 性别 年龄
4 bit 64 bit 1 bit 7 bit

1.2.2 删除

删除功能时,需要传输学生的 id,系统用户数的预估为 65535 个,因此,占用 16 位,最多可存储 65536 个用户。
由此,一个删除学生的传输格式可表示如下:

操作类型 id
4 bit 16 bit

1.2.3 修改

修改功能时,需传输学生的 id,待修改的项和内容。id 的传输方式同 1.2.2 删除一节中描述的传输格式。
对于待修改项和内容的设置可以考虑采用标记位的形式进行。修改的项目包括姓名、性别和年龄三个字段,可分别设置姓名修改标记位、性别修改标记位和年龄修改标记位,当标记位设为 1 时,才读取相应位置的数据并实现修改操作,当标记位设为 0 时,相应位置全部置 0 ,不进行任何操作。
而对于学生信息的操作,则套用新增命令中的格式,即可实现对单个学生修改的传输。
此时,修改学生信息的传输格式可表示如下:

操作类型 id 姓名标记位 性别标记位 年龄标记位 姓名 性别 年龄
4 bit 16 bit 1 bit 1 bit 1 bit 64 bit 1 bit 7 bit

1.2.4 查询列表

查询列表功能时,需传输 pageNo 和 pageSize 参数,其中 pageNo 表示需要查询的页码,pageSize 表示需要查询每页的个数。由于列表每页个数为 5 ~ 10 个,因此 pageSize 的值为 5 ~ 10,即需要4位存储,pageNo 的值为 6554 ~ 13107,即需要 14 位(16384)存储。
分页查询传输格式可表示如下:

操作类型 pageNo pageSize
4 bit 14 bit 4 bit

1.2.5 查询信息

查询信息功能时,需传输 id 信息,传输格式如 1.2.2 删除节所示,在此不再赘述。

1.3 代码实现

未完待续…

你可能感兴趣的:(java)