WebSocket安卓客户端实现详解(二)--客户端发送请求

  WebSocket安卓客户端实现详解(二)–客户端发送请求

  本篇接着上一篇讲解WebSocket客户端发送请求和服务端主动通知消息,还没看过第一篇的小伙伴,这里附上第一篇链接WebSocket安卓客户端实现详解(一)–连接建立与重连.

  本篇依旧干货十足内容很多所以我们还是先热身下

  客户端发送请求

  为了方便我们协议使用json格式,当然你也可以替换成ProtoBuffer.

  这里先展示下发送请求的流程图,大体流程在第一篇已经讲过了这里不再赘述,直接搂细节.

  

  既然是请求,那么得有一个请求协议.这里我们不直接展示协议,而是通过http请求,引导到websocket请求协议.

  一般http请求我们会需要如下几个参数

  url

  请求参数

  回调

  而websocket是一个长连接,我们所有的请求都是通过这个连接发送的,也就是说我们没法像http那样通过一个url来区分不同请求,那么我们请求协议中就必须要有一个类似url的东西去区分请求,这里我用action字段来表示url,为了方便协议的扩展,我们在加一个参数req_event,由action和req_event共同组成url,下面是一个简单的例子.

  {

  "action": " login",

  "req_event": 0

  }12341234

  由于请求是异步的所以当我们请求的时候需要把回调加入集合保存起来,等到服务端响应的时候我们需要从集合中找到对应回调调用对应的方法,那么为了能够找到对应回调我们需要给每个请求增加一个唯一标识,这里我用的seq_id字段表示,当请求的时候我们把客户端自己生成的seq_id传给服务端,然后当服务端响应的时候在回传给我们,这样我们就能通过seq_id作为key找到对应的回调,那么现在协议将变成下面这样.

  {

  "action": " login",

  "req_event": 0,

  "seq_id":0

  }1234512345

  在加上每个请求都有的请求参数,这里我用req字段表示,最终协议如下.

  {

  "action": " login",

  "req_event": 0,

  "seq_id":0,

  "req":{

  "aaa":"aaa",

  "bbb":0

  }

  }123456789123456789

  协议有了,那我们谈谈代码的实现,对于请求方法我们对外暴露如下参数.

  Action

  这里我把action、req_event、响应实体统一用一个枚举类Action来存储,调用者只需根据不同请求传入对应Action即可.

  Req

  请求参数

  Callback

  回调

  timeout(可选参数,默认给的10秒)

  请求超时时间.

  show code

  Action一个枚举类,把action、req_event、响应实体统一封装在一起,action和req_event用来组装url,响应实体在反序列化的时候会用到.调用者只需根据不同请求传入对应Action即可.

  public enum Action {

  LOGIN("login", 1, null);

  private String action;

  private int reqEvent;

  private Class respClazz;

  Action(String action, int reqEvent, Class respClazz) {

  this.action = action;

  this.reqEvent = reqEvent;

  this.respClazz = respClazz;

  }

  public String getAction() {

  return action;

  }

  public int getReqEvent() {

  return reqEvent;

  }

  public Class getRespClazz() {

  return respClazz;

  }

  }123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930

  ui层回调

  public interface ICallback {

  void onSuccess(T t);

  void onFail(String msg);

  }12345671234567

  协议对应的请求实体类Request,这里还额外添加了一个没有参加序列化的参数reqCount来表示该请求的请求次数,在后面请求失败情况下对该请求的处理会用上.

  public class Request {

  @SerializedName("action")

  private String action;

  @SerializedName("req_event")

  private int reqEvent;

  @SerializedName("seq_id")

  private long seqId;

  @SerializedName("req")

  private T req;

  private transient int reqCount;

  public Request(String action, int reqEvent, long seqId, T req, int reqCount) {

  this.action = action;

  this.reqEvent = reqEvent;

  this.seqId = seqId;

  this.req = req;

  this.reqCount = reqCount;

  }

  ....

  //这里还有各个参数对应get、set方法,为节省篇幅省略了

  public static class Builder {

  private String action;

  private int reqEvent;

  private long seqId;

  private T req;

  private int reqCount;

  public Builder action(String action) {

  this.action = action;

  return this;

  }

  public Builder reqEvent(int reqEvent) {

  this.reqEvent = reqEvent;

  return this;

  }

  public Builder seqId(long seqId) {

  this.seqId = seqId;

  return this;

  }

  public Builder req(T req) {

  this.req = req;

  return this;

  }

  public Builder reqCount(int reqCount) {

  this.reqCount = reqCount;

  return this;

  }

  public Request build() {

  return new Request(action, reqEvent, seqId, req, reqCount);

  }

  }

  }




宁波整容医院 http://www.yestarnb.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值