传智播客郑州校区深入解读WebSocket协议

扫码阅读手机版

来源: 天极网 2017-09-13 17:49:42

  对于所有基于服务端的C/S应用,传智播客的老师们认为:http请求仅支持请求-响应模式,限制太大,服务器无法主动发送消息给客户端,WebSocket协议既可以由服务端发起消息,也可以由客户端发起请求。

  对此,传智播客郑州校区的老师整理出了HTTP协议与WebSocket协议声明周期的比较示意图:

  websocket是基于http协议的扩展,支持长连接。服务器端需要tomcat7以上

  协议请求地址测试public static final String WEBSOCKET = "ws://qp.hystudio.cn:9000";

  网页测试地址:http://qp.hystudio.cn:9000/service/service.htm

  如果多个客户端同时使用支持WEBSOCKET的服务端,该如何连接?传智播客郑州校区为大家整理的连接方式如下:

  传智播客为使用WEBSOCKET提供的步骤如下:

  1/创建一个websocket连接对象

  mConnection = new WebSocketConnection();

  2/创建监听器继承WebSocketConnectionHandler

  public class WebSocketConnectListener extends WebSocketConnectionHandler {}

  3/需要和服务器创建消息通道,用于和服务器的数据交互,可以发送和接收数据

  public void connect() {

  if (!isConnect()) {

  connectListener = new WebSocketConnectListener(context,mConnection, message, listener);

  try {

  mConnection.connect(WebSocket+path, connectListener);

  } catch (WebSocketException e) {

  e.printStackTrace();

  }

  }

  }

  4/与服务器发送消息前需要判断是否连接

  public boolean isConnect() {

  if (mConnection == null) return false;

  return mConnection.isConnected();

  }

  5/客户端与服务器连接成功后测试发送消息接口

  public void sendTextMessage(String sendText) {

  if (mConnection == null) {

  return;

  }

  connect();

  mConnection.sendTextMessage(sendText);

  }

  6/由于是基于http协议。也可以作为普通的request请求使用

  //连接建立成功

  @Override

  public void onOpen() {

  super.onOpen();

  LogUtils.d("%s", "WebSocketConnectListener connect");

  connection.sendTextMessage(message);

  }

  //连接断开(一般情况下是由于网络断开,或者请求参数出错)

  @Override

  public void onClose(int code, String reason) {

  super.onClose(code, reason);

  LogUtils.d("%s", "WebSocketConnectListener lost");

  if (this.listener != null) {

  this.listener.onClose(code, reason);

  }

  }

  //收到服务器消息时使用

  @Override

  public void onTextMessage(String payload) {

  super.onTextMessage(payload);

  LogUtils.d("%s", "payload = " + payload);

  if (this.listener != null) {

  this.listener.onSuccess(payload);

  }

  }

  作为一个普通的请求方式,类似http请求方式。这里自定义协议对象,封装请求参数后进行请求

  IRequest tokenRequest = new TokenRequest(context, App.getInstance().getDeviceId(), new IRequestListener() {

  @Override

  public void onSuccess(String payload) {

  TokenResponse response = JsonUtils.fromJson(payload, TokenResponse.class);

  if (response.isRequestSuccssful()) {

  DBAdapter.getInstance().addToken(response.toToken());

  App.getInstance().setToken(response.toToken());

  setToken(response.toToken().getToken());

  request.request();

  } else {

  SnackbarUtils.show((Activity) context, R.string.device_unauth);

  }

  }

  @Override

  public void onClose(int code, String reason) {

  }

  });

  tokenRequest.request();

  这里TokenRequest对象仅仅是封装了协议请求参数。详细如下

  @Path(Constants.Path.TOKENPATH)

  public class TokenRequest extends IRequest {

  private String deviceId;

  public TokenRequest(Context context, String deviceID, IRequestListener listener) {

  super(context, listener);

  this.deviceId = deviceID;

  }

  @Override

  protected String prapareMsg() {

  return "{" + "deviceId:" + deviceId + "}";

  }

  }

  以上是WEBSOCKET协议完成了一次普通的http请求。它最大的优势是和服务端建立的双向通道,既可以由客户端发起请求,也可以由服务端发起请求。之前的自主研发消息推送基本上都是基于客户端轮询的方式,效率低并且浪费资源。此外,HTTP请求的请求头很长,虽然和服务器建立连接时可能发送的是一个很少的数据,但这样也占用了服务器资源。然而,WEBSOCKET在服务端和客户端之间的标头信息很小,而且还可以降低服务端的资源浪费。

  所以,传智播客郑州校区也希望大家在工作中能够抓住相关问题的关键,了解编程技术的本质,那么在以后的工作中就会很轻松。

  新闻纠错:022-23601735

下载前沿客户端关注更多精彩

推荐新闻

我来说两句

关于北方网 | 广告服务 | 诚聘英才 | 联系我们 | 网站律师 | 设为首页 | 关于小狼 | 违法和不良信息举报电话:022-23602087 | 举报邮箱:jubao@staff.enorth.cn | 举报平台

Copyright (C) 2000-2016 Enorth.com.cn, Tianjin ENORTH NETNEWS Co.,LTD.All rights reserved
本网站由天津北方网版权所有