性能工具之JMeter 微信小程序 WebSocket 脚本入门

简介: 【5月更文挑战第12天】性能工具之JMeter 微信小程序 WebSocket 脚本入门

前言

今天试着写了写小程序聊天页面中的信息底层是怎么实现的,而 WebSocke t协议,客户端和服务端都可以主动的推送消息,只要建立链接就能推送消息。

准备 demo

前置条件,需要安装小程序编译器。

页面效果如下图:
image.png

后端代码,大家一看就知道,主要这是springboot工程,你懂的怎么配置与启动。

/**
 * @author 7DGroup
 * @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 压测

打开 JMeter 新建 WebSocket Sampler(如果没有就安装下)
image.png

编写脚本:
image.png

增加结果查看数:
image.png

增加监听器 Summary Report

image.png

总结

这是一个很简单的示例,带着大家入门如何做脚本。

目录
相关文章
|
26天前
|
测试技术 持续交付 Apache
性能怪兽来袭!Python+JMeter+Locust,让你的应用性能飙升🦖
【8月更文挑战第5天】随着互联网应用规模增长,性能测试至关重要。本文介绍如何利用Python结合Apache JMeter和Locust构建高效可定制的性能测试框架。JMeter广泛用于负载测试,通过模拟大量虚拟用户并发访问来评估性能。Locust基于Python,通过编写简单脚本模拟HTTP请求,特别适合Web应用测试,比JMeter更灵活易扩展。Python作为胶水语言简化测试脚本编写并流畅自动化流程。文章提供JMeter命令行测试和Locust脚本示例,并展示如何用Python自动化执行和整合测试结果,最终帮助应用在高负载下稳定运行。
36 1
|
1天前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
8 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
24天前
|
存储 Linux 数据库
性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
【8月更文挑战第7天】性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
37 1
性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
|
14天前
|
监控 小程序 安全
小程序全栈开发中的WebSocket实时通信实践是一种高效的开发模式。
随着移动互联网的发展,小程序成为企业拓展业务的新渠道。WebSocket作为一种实时通信协议,可在小程序中实现如实时聊天、推送、游戏等功能。它支持客户端与服务器间的全双工长连接通信,优于传统HTTP。开发者需注意安全、性能及兼容性等问题,以优化体验并保障稳定运行。掌握WebSocket有助于提升小程序功能性与用户体验。
28 1
|
18天前
|
小程序 Java API
springboot 微信小程序整合websocket,实现发送提醒消息
springboot 微信小程序整合websocket,实现发送提醒消息
|
25天前
|
监控 Java 测试技术
实战派必看!Python性能测试中,JMeter与Locust如何助力性能调优
【8月更文挑战第6天】性能优化是软件开发的关键。本文介绍JMeter与Locust两款流行性能测试工具,演示如何用于Python应用的性能调优。JMeter可模拟大量用户并发访问,支持多种协议;Locust用Python编写,易于定制用户行为并模拟高并发。根据场景选择合适工具,确保应用在高负载下的稳定运行。
71 4
|
25天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【8月更文挑战第6天】在数字化时代,确保软件在高并发下的稳定性至关重要。Python 提供了强大的性能测试工具,如 JMeter 和 Locust。JMeter 可配置复杂请求场景,而 Locust 则以 Python 脚本灵活模拟真实用户行为。两者结合,可全面评估系统性能。例如,对电商网站进行测试时,JMeter 模拟登录请求,Locust 定义浏览和购物行为,共同揭示系统瓶颈并指导优化,从而保证稳定高效的用户体验。
58 1
|
26天前
|
测试技术 持续交付 Apache
深度挖掘:Python性能测试中JMeter与Locust的隐藏技能🔍
【8月更文挑战第5天】随着软件规模扩大,性能测试对系统稳定性至关重要。Apache JMeter和Locust是两大主流工具,各有千秋。本文探索它们在Python环境下的进阶用法,挖掘更多性能测试潜力。JMeter功能强大,支持多种协议,可通过命令行模式执行复杂测试计划,并与Python集成实现动态测试数据生成。Locust基于Python,通过编写简洁脚本模拟HTTP请求,支持自定义请求及与Python库深度集成。掌握这些技巧可实现高度定制化测试场景,有效识别性能瓶颈,提升应用稳定性。
94 1
|
26天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【8月更文挑战第5天】性能测试确保应用高负载下稳定运行。Apache JMeter与Locust是两大利器,助力识别解决性能瓶颈。本文介绍这两款工具的应用与优化技巧,并通过实战示例展示性能测试流程。首先,通过JMeter测试静态与动态资源;接着,利用Locust的Python脚本模拟HTTP请求。文中提供安装指南、命令行运行示例与性能优化建议,帮助读者掌握性能测试核心技能。
50 0
|
27天前
|
消息中间件 Java 测试技术
Python性能测试全攻略:JMeter与Locust,双剑合璧斩断性能瓶颈🗡️
【8月更文挑战第4天】在软件开发中,性能至关重要。对Python开发者来说,掌握高效性能测试方法尤为关键。本文将带您探索性能测试工具JMeter与Locust的强大功能。JMeter作为Java世界的巨擘,以其强大功能和灵活性在性能测试领域占有一席之地,不仅适用于Java应用,也能测试Python Web服务。
52 0

热门文章

最新文章

下一篇
云函数