网站制作营销型制作闹钟网站
自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用
编写服务器及客户端代码
文章目录
- 基于TCP的自定义应用层协议
 - 一、请求
 - 1.请求格式
 - 2.创建Request类
 
- 二、响应
 - 1.响应格式
 - 2.创建Response类
 
- 三、客户端-服务器交互
 - 四、type
 - 五、请求payload
 - 1.BasicAruguments(方法公共参数)
 - 2.每个方法的参数
 - ExchangeDelareArguments
 - ExchangeDeleteArguments
 - QueueDeclareArguments
 - QueueDeleteArguments
 - QueueBindArguments
 - QueueUnbindArguments
 - BasicPublishArguments
 - BasicConsumeArguments
 - BasicAckArguments
 
- 六、响应payload
 - 1.BasicReturns(返回结果公共参数)
 - 2.SubscribeReturns
 
- 编写服务器代码
 - 一、创建BrokerServer
 - 二、初始化ServerSocket
 - 三、开启服务器
 - 四、停止服务器(便于测试)
 - 五、处理连接
 - 1.读取请求并解析
 - 2.根据请求计算响应
 - 3.将响应返回给客户端
 - 4.清除有关断开连接的socket对应的会话信息
 
- 编写客户端代码
 - 一、ConnectionFactory 连接工厂
 - 创建Connection对象
 
- 二、Connection 一次TCP连接
 - 1.Connection 属性
 - 2.初始化
 - 3.写入请求
 - 4.读取响应
 - 5.创建channel
 - 6.处理响应
 - 7.关闭连接
 
- 三、Channel 逻辑上的连接
 - 1.属性
 - 2.API(远程调用服务器的)
 - 创建channel
 - 销毁channel
 - 创建交换机
 - 删除交换机
 - 创建队列
 - 删除队列
 - 创建绑定
 - 删除绑定
 - 发布消息
 - 订阅消息
 - 确认消息
 
- 3.实现阻塞等待服务器的响应
 - waitResult
 - putResult
 
- 编写Demo
 - 1.生产者客户端
 - 2.消费者客户端
 - 测试
 - 1. 启动服务器
 - 2.启动生产者
 - 3.启动消费者
 
基于TCP的自定义应用层协议
一、请求
1.请求格式

 type:哪个方法
 length:payload的长度
 payload:调用的方法的参数
2.创建Request类

二、响应
1.响应格式

type:哪个方法
 length:payload的长度
 payload:调用的方法的结果
2.创建Response类

三、客户端-服务器交互

四、type
- 0X1 创建channel
 - 0X2 销毁channel
 - 0X3 创建交换机 exchangeDeclare
 - 0X4 删除交换机 exchangeDelete
 - 0X5 创建队列 queueDeclare
 - 0X6 删除队列 queueDelete
 - 0X7 创建绑定 queueBind
 - 0X8 删除绑定 queueUnbind
 - 0X9 发布消息 basicPublish
 - 0Xa 订阅消息 basicConsume
 - 0xb 确认消息 basicAck
 - 0xc 服务器给客户端推送消息(响应独有)
 
五、请求payload
1.BasicAruguments(方法公共参数)
- rid(一次请求/响应)
 - channelId(一次逻辑上的连接)
 
2.每个方法的参数
需要继承BasicArguments
ExchangeDelareArguments

ExchangeDeleteArguments

QueueDeclareArguments

QueueDeleteArguments

QueueBindArguments

QueueUnbindArguments

BasicPublishArguments

BasicConsumeArguments

BasicAckArguments

以ExchangeDeclare方法为例,具体的请求格式如下:
 
六、响应payload
1.BasicReturns(返回结果公共参数)
- rid (一次请求/响应)
 - channelId (一次逻辑上的连接)
 - ok (方法运行结果)
 
以exchangeDeclare为例,具体的响应格式:
 
 其他的方法返回的响应payload都是BasicReturns序列化后的结果,除了0xc,是响应独有的。
2.SubscribeReturns
服务器通过Consumer接口实现推送消息给客户端(队列收到消息的时候会调用回调方法)

 响应具体格式:
 
编写服务器代码
一、创建BrokerServer

二、初始化ServerSocket
给Serversocket初始化,监听一个端口
 
三、开启服务器
- 接受客户端的连接请求
 - 线程池处理连接
 

四、停止服务器(便于测试)
- runnable设置成false
 - 抛弃线程池的所有任务
 - 关闭ServerSocket服务器连接
 

五、处理连接
- 读取请求并解析
 - 根据请求计算响应
 - 将响应返回给客户端
 - 关闭客户端连接
 - 清除断开连接的socket的会话信息(channelId-socket)
 

1.读取请求并解析

2.根据请求计算响应

3.将响应返回给客户端

4.清除有关断开连接的socket对应的会话信息

编写客户端代码
一、ConnectionFactory 连接工厂
- 服务器地址
 - 创建connecion对象
 
创建Connection对象

二、Connection 一次TCP连接
- socket对象 socket=new socket(host,port)
 - 多个channel 对象 (创建channel对象)
 - 写入请求
 - 读取响应
 - 处理响应
 
1.Connection 属性

2.初始化

3.写入请求

4.读取响应

5.创建channel

6.处理响应
此处在构造方法中,补充创建一个扫描线程,当连接未断开时,不停的扫描(读取)服务器返回的响应。处理响应。
如果是SubScirbleReturns,使用线程池执行消费者的回调。
如果是BasicReturns,将响应的basicReturns放入对应channel的basicReturnsMap中。

 
7.关闭连接

三、Channel 逻辑上的连接
- 对应API,实现客户端对服务器的远程调用
 
1.属性

2.API(远程调用服务器的)
- 构造请求
 - 写入请求
 - 阻塞等待服务器的响应结果
 
生成rid:
 
创建channel

销毁channel

创建交换机

删除交换机

创建队列

删除队列

创建绑定

删除绑定

发布消息

订阅消息

确认消息

3.实现阻塞等待服务器的响应
waitResult
根据rid,在basicReturnsMap集合中找;如果找到了,就返回,找不到阻塞等待。
 
putResult
将rid-basicReturns 放入basicReturnsMap集合中
 
编写Demo
实现消息队列生产者-消费者模型。
1.生产者客户端

2.消费者客户端

测试
1. 启动服务器

 
2.启动生产者

3.启动消费者

