性能測試之微信小程式websocket協議

  • 2019 年 12 月 27 日
  • 筆記

最近複習性能測試,也想看看小程式聊天頁面中的資訊底層是怎麼實現的,今天試著寫了寫。

WebSocket協議,客戶端和服務端都可以主動的推送消息,只要建立鏈接就能推送消息。

前置條件,需要安裝小程式編譯器。

頁面效果:

後端程式碼,大家一看就知道,主要這是springboot工程,你懂的怎麼配置與啟動。

  /**   * @author liwen   * @Title: Mywebsocket   * @Description: 服務端   * @date 2019/12/24 / 13:00   */  @ServerEndpoint("/chatWebsocket")  @Component  public class Mywebsocket {        @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")      private Date sendDate;        public Date getSendDate() {          sendDate = new Date();          return sendDate;      }        private static final Logger logger = LoggerFactory.getLogger(Mywebsocket.class);        /**       * 當前在線連接數       */      private static AtomicInteger onlineSize = new AtomicInteger(0);        private static Set<Mywebsocket> webSocketSet = new ConcurrentSet<Mywebsocket>();        private Session session;        @OnOpen      public void onOpen(Session session) {            this.session = session;          webSocketSet.add(this);          addOnlineSize();          logger.info("有客戶端連接 當前在線人數:" + getOnlineSize());          try {              Msg msg = new Msg();              sendMessage("你已成功連接"+"code:200");          } catch (IOException e) {              e.printStackTrace();          }      }        @OnClose      public void onClose() {          logger.info("關閉");          webSocketSet.remove(this);          subOnlineSize();          logger.info("有客戶端關閉連接,當前在線人數為:" + getOnlineSize());      }        @OnMessage      public void onMessage(String message, Session session) {            logger.info("接收客戶端消息 :" + message);          if (session.isOpen()) {              //群發消息              for (Mywebsocket item : webSocketSet) {                  try {                      Thread.sleep(1000);                  } catch (InterruptedException e) {                      e.printStackTrace();                  }                  //群發                  synchronized (session) {                      item.sendInfoToAll(message);                  }              }          }        }        @OnError      public void onError(Session session, Throwable error) {          error.printStackTrace();      }        public void sendMessage(String message) throws IOException {          if (session.isOpen()) {              this.session.getAsyncRemote().sendText(message);          }      }        public void sendInfoToAll(String message) {            webSocketSet.parallelStream().forEach(item -> {              try {                  if (session.isOpen()) {                        HashMap<String, Object> hashMap = new HashMap<>();                      hashMap.put("content", "7DGroup歡迎您的到來");                      hashMap.put("data", getSendDate());                      hashMap.put("message", message);                      item.sendMessage(JSON.toJSONString(hashMap));                  }              } catch (IOException e) {                  e.printStackTrace();              }              logger.info("群發消息 " + message);          });        }        public int getOnlineSize() {          return onlineSize.get();      }        public void addOnlineSize() {          onlineSize.addAndGet(1);      }        public void subOnlineSize() {          onlineSize.addAndGet(-1);      }  

小程式程式碼:

主要邏輯程式碼為:

Page({      // 初始頁面數據      data: {          scrollTop: 0,          list: []      },      // 監聽頁面載入      id: 0,      onLoad: function () {          wx.connectSocket({              url: 'ws://127.0.0.1:8081/chatWebsocket'          });          wx.onSocketMessage(msg => {              var data = JSON.parse(msg.data.toString());              data.id = this.id++;              data.role = 'server';              var list = this.data.list;              list.push(data);              this.setData({                  list: list              });              this.rollingBottom()          })      },      // 發送內容      count: 0,      massage: '',      send: function () {          // 判斷發送內容是否為空          if (this.message) {            wx.sendSocketMessage({              data: this.message,            });              // 我自己的消息              console.log(this.data.list);              var list = this.data.list;              list.push({                  id: this.count++,                  content: this.message,                  role: 'me'              });              this.setData({                  list: list              });              this.rollingBottom()          } else {              // 彈出提示框              wx.showToast({                  title: '消息不能為空哦~',                  icon: 'none',                  duration: 2000              })          }      },      // 監聽input值的改變      bindChange(res) {          this.message = res.detail.value      },      // 頁面卸載,關閉連接      onUnload() {          wx.onSocketClose();          wx.showToast({              title: '連接已斷開~',              icon: 'none',              duration: 2000          })      },      // 聊天內容始終顯示在最低端      rollingBottom(e) {          wx.createSelectorQuery().selectAll('.list').boundingClientRect(rects => {              rects.forEach(rect => {                  this.setData({                      scrollTop: rect.bottom                  })              })          }).exec()      }  });

頁面布局

<view class="container">    <!-- 聊天輸入 -->    <view class="message">      <form>        <input type="text" cursor-spacing="50" placeholder="請輸入聊天內容..." bindinput="bindChange"></input>      </form>    </view>      <button type="primary" bindtap="send" formType="reset" size="small" button-hover="blue">發送</button>      <view wx:if="{{show}}">{{text}}</view>      <!--<view wx:wx:elif="{{}}"></view>-->      <view class="wrap">          <scroll-view scroll-y class="chat" scroll-top="{{scrollTop}}">              <view class="list">                  <view class="chat-news" wx:for="{{list}}" wx:key="{{item.id}}">                      <!-- 根據角色判斷 -->                      <block wx:if="{{item.role === 'me'}}">                          <!-- 自己的消息顯示在右側 -->                          <view class="news-lf">                              <text class="new-txt">{{item.content}}</text>                              <image class="new-img" src="/images/0.png"></image>                          </view>                      </block>                      <!-- 對方的消息顯示在左側 -->                      <block wx:else>                          <view>                              <image class="new-img" src="/images/1.png"></image>                              <text class="new-txt new-text">{{item.content}}</text>                          </view>                      </block>                  </view>              </view>          </scroll-view>      </view>    </view>

通過上面程式碼就能把小程式聊天頁面跑起來;

打開Jmeter新建WebSocket Sampler(如果沒有就安裝下)

編寫腳本:

增加結果查看數

增加監聽器Summary Report

總結:

做性能測試程式碼能力還需要有一些,否則自己想做一點東西搞不定,挺難過的,做性能測試相信你們比我強。