使用小程序+网页简易实现多客户端实时弹幕

news/2024/7/20 3:42:44 标签: 小程序, 前端, websocket

此文主要通过小程序+网页模拟多客户端通过轮询、WebSockets、订阅推送等方式简易实现实时弹幕。

    • 实现流程
      • 1、服务端
        • 1.1、创建项目
        • 2.2、接口定义
      • 2、客户端
      • 3、实现方式
        • 3.1、轮询
        • 3.2、WebSocket
        • 3.3、订阅推送

实现流程

1、服务端

1.1、创建项目

  1. 打开Visual Studio,创建新项目,选择包含API的应用程序模板。

在这里插入图片描述

  1. 填写项目名称及选择对应的保存位置,框架版本可根据开发习惯来选择。

在这里插入图片描述

  1. 服务端主要用于搭建API接口,选择MVC,其他选项默认即可。

在这里插入图片描述
在这里插入图片描述

2.2、接口定义

  1. 选中项目Models文件夹,创建一个实体类用于定义推送到客户端的各个字段属性值。

在这里插入图片描述

  1. 实体类中定义字段如下:弹幕内容、发送时间、发送人、来源、是否推送等,字段可根据实际业务场景来增减。

在这里插入图片描述

public class Barrage { 
	   /// <summary>
	   /// 弹幕内容
	   /// </summary>
	   public string BarrageContent { get; set; }
	
	   /// <summary>
	   /// 发送时间
	   /// </summary>
	   public DateTime SendTime { get; set; }
	
	   /// <summary>
	   /// 发送人
	   /// </summary>
	   public string CreateBy { get; set; }
	
	   /// <summary>
	   /// 来源 小程序 / web端
	   /// </summary>
	   public string From { get; set; }
	
	   /// <summary>
	   /// 是否推送
	   /// </summary>
	   public int IsPush { get; set; }
}
  1. 打开Controller文件夹中的Home控制器,定义两个方法以及一个List,分别用于接收存储以及弹幕推送等功能;这里需要注意的是每次只需要获取未推送的弹幕消息即可,获取弹幕的接口被调用后,即将推送过去的数据修改为已推送。

在这里插入图片描述

 /// <summary>
 /// 需要推送的弹幕数据
 /// </summary>
 List<Barrage> list = new List<Barrage>();

 /// <summary>
 /// 提交弹幕
 /// </summary>
 /// <param name="BarrageContent"></param>
 /// <param name="CreateBy"></param>
 /// <param name="From"></param>
 /// <returns></returns>
 public ActionResult ReceivingBarrage(string BarrageContent,string CreateBy,string From) {
     Barrage info = new Barrage();
     info.BarrageContent = BarrageContent;
     info.CreateBy = CreateBy;
     info.From = From;
     info.SendTime = DateTime.Now;
     info.IsPush = 0;
     list.Add(info);
     return Json("提交弹幕");
 }

 /// <summary>
 /// 获取弹幕内容
 /// </summary>
 /// <returns></returns>
 public ActionResult AcquireBarrage() {
     //根据时间排序获取未推送的数据
     var BarrageList = list.Where(x=>x.IsPush == 0).OrderByDescending(z=>z.SendTime);
     //数据推送后 将类型改为已推送
     return Json(BarrageList);
 }

2、客户端

2.1、小程序

  1. 访问微信公众平台,点击账号注册。

在这里插入图片描述

  1. 选择小程序,并在表单填写所需的各项信息进行注册。

在这里插入图片描述
在这里插入图片描述

  1. 在开发管理选择开发设置,将AppID及AppSecret复制出来进行存储。

在这里插入图片描述

  1. 下载安装微信web开发者工具并创建一个新的项目,填入上图所复制的AppId。

在这里插入图片描述

  1. 小程序创建一个组件用于展示弹幕效果。

在这里插入图片描述

  1. 组件所需属性值:距离屏幕顶部距离、行距单位、数据源、层级、弹幕行数等。

在这里插入图片描述

  /**
   * 组件的属性列表
   */
  properties: {
    //距离屏幕顶部距离
    top: {
      type: String,
      value: "10vh"
    },
    //每行间距单位
    rowSpacing: {
      type: String,
      value: "40rpx",
    },
    //数据源
    list: {
      type: Array,
      value: []
    },
    //层级
    zIndex: {
      type: Number,
      value: 999
    },
    //一个等于屏幕宽度的弹幕 滚动所需要的时间 单位毫秒
    speed: {
      type: Number,
      value: 10000
    },
    //动画速度波动范围-500~500ms之间选取随机值,用于控制每条弹幕的速度
    shakeSpeed: {
      type: Number,
      value: 500
    },
    //动画延时执行时间波动范围上限值 0~500ms之间选取随机值, 用于控制弹幕出厂顺序
    shakeDelay: {
      type: Number,
      value: 500
    },
    //弹幕行数
    rows: {
      type: Number,
      value: 2
    },
     //每项弹幕右外边距
     marRight: {
      type: String,
      value: "40rpx"
    },
    //是否循环
    loop: {
      type: Boolean,
      value: false
    }
  },
  1. 在组件wxml文件中将弹幕数据进行渲染。

在这里插入图片描述

<view animation="{{item.animation}}" wx:for="{{barrageInfo.list}}"
  style="z-index:{{zIndex}};top:{{item.top?item.top:top}}" class="barr" id="barr_{{index}}">
  <view class="item" wx:for-item="_item" style="margin-right:{{marRight}}" wx:for="{{item.list}}">
  <view class="box">
        <image src="{{_item.avatar}}"></image>
        <text>{{_item.words}}</text>
  </view>
  </view>
</view>
  1. 创建一个新的page,用于视频展示及弹幕推送等效果,同时在json文件中引用上面所创建的组件。

在这里插入图片描述

{
  "usingComponents": {
    "barrage": "/components/barrage"
  }
}
  1. 准备一个MP4格式的素材模拟数据源或者直播效果,同时在wxml中将组件及video将数据进行展示。

在这里插入图片描述

在这里插入图片描述

2.2、web端

  1. 通过HBuiderX开发工具创建一个默认的网站项目。

在这里插入图片描述

  1. 在index.html文件中简单实现弹幕展示及video效果。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

<script>
	var inputText = document.getElementById("text");
	var danmuArea = document.getElementById("danmuArea");
	var colorInput = document.getElementById("textcolor");
	
	function sendDanmu() {
		var text = inputText.value;
		var msg = document.createElement("p");
		msg.innerText = text
		msg.style.color = colorInput.value;
		var top = Math.random() * 280;
		msg.style.top = top + "px";
		danmuArea.appendChild(msg)
		msg.setAttribute("class", "msg")
		inputText.value = "";
	}

</script>

3、实现方式

3.1、轮询

  1. 前期工作准备好后,再次回到小程序客户端;在页面增加一个文本框以及按钮用于获取所输入的弹幕信息及实现发送等功能。

在这里插入图片描述

  1. 文本框绑定bindinput事件,获取用户输入的弹幕内容。

在这里插入图片描述
在这里插入图片描述

  bindMsg(e) {
    this.setData({
      msg: e.detail.value
    });
  },
  1. 发送按钮绑定点击事件,给data中的list追加数据的同时调用API接口,提交数据。

在这里插入图片描述

    let that = this;
    let info = {
      "words": that.data.msg,
      "avatar": "../../images/head.jpg"
    };
    that.setData({
      barrageList: that.data.barrageList.concat(info),
      msg:'',
    });
    wx.request({
      url: that.data.requestUrl + '/Home/ReceivingBarrage',
      method: 'post',
      data: {
        BarrageContent: that.data.msg,
        CreateBy: '摔跤猫子',
        From: '小程序'
      },
      header: {
        'content-type': 'application/json'
      },
      success: function (res) {
      }
    })
  1. 在onLoad事件中增加一个定时轮询请求,每隔1s请求一次,如果有数据即向弹幕list中进行推送。

在这里插入图片描述

在这里插入图片描述

    setInterval(() => {
      wx.request({
        url: that.data.requestUrl + '/Home/AcquireBarrage',
        method: 'post',
        header: {
          'content-type': 'application/json'
        },
        success: function (res) {
          that.setData({
            barrageList:that.data.barrageList.concat(res.data)
          });
        }
      })
    }, 1000);
  1. 在web客户端中依法炮制,获取弹幕,发送弹幕即可。

3.2、WebSocket

后续更新实现代码;大体实现原理即利用WebSocket即时通信节省大量无效请求,减轻服务器压力和网络带宽的占用;服务器可以主动向客户端推送消息,客户端也可以主动向服务端发送消息,双向平等对话。

3.3、订阅推送

后续更新实现代码;


http://www.niftyadmin.cn/n/29411.html

相关文章

实现升序降序排列问题

package com.bjpowernode.jdbc;import java.sql.*; import java.util.Scanner;/*** 需求&#xff1a;用户在控制台上输入desc则降序&#xff0c;输入asc则升序* 思考&#xff1a;为了完成上述需求是使用Statement还是使用preparedStatement呢&#xff1f;* 这里就不能使用…

【实操案例十】函数操作 实例代码及运行效果图!

任务一&#xff1a;Mini计算器 # 任务一&#xff1a;Mini计算器 def calc(a, b, op):if op :return add(a, b)elif op -:return sub(a, b)elif op *:return mul(a, b)elif op /:if b ! 0:return div(a, b)else:return 0不能为除数&#xff01;def add(a, b):return a bde…

BigDecimal BigInteger的使用

1、BigDiCemal 【问题】在项目中&#xff0c;我们进行计算的时候&#xff0c;有时候需要考虑 四舍五入&#xff0c;精度丢失的问题&#xff0c;面对这种问题&#xff0c;我们应该怎么处理&#xff1f; System.out.println(0.20.1);System.out.println(0.3-0.1);System.out.prin…

Exadata存储服务器(又称Exadata存储单元)

存储单元可以说是让Exadata如此大规模普及并且使用效果优异的核心要素。 I/O性能问题始终是Exadata存储或者存储服务器尽力去解决的问题。 Exadata存储服务器概述 Exadata数据库一体机通常预装了3类硬件&#xff1a; 数据库计算节点服务器存储服务器极速的InfiniBand存储交…

【操作系统】—— Windows常用快捷键(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

【Git】国内代码托管中心码云(Gitee)

9、国内代码托管中心码云(Gitee) 9.1、简介 众所周知&#xff0c;GitHub 服务器在国外&#xff0c;使用 GitHub 作为项目托管网站&#xff0c;如果网速不好的话&#xff0c;严重影响使用体验&#xff0c;甚至会出现登录不上的情况。针对这个情况&#xff0c;大家也可以使用国…

JavaEE初阶第二课:文件操作与IO

欢迎来到javaee初阶的第二课&#xff0c;这节课我会带大家了解文件的概念和java中如何操作文件。 这里写目录标题1.了解文件1.1文件概念1.2文件存储1.3文件路径2.Java中的文件操作&#xff08;文件系统操作&#xff09;2.1File类2.1.1方法实践3.Java的文件操作&#xff08;文件…

acwing基础课——快速幂

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想&#xff1a; 求一个数的n次时&#xff0c;我们的时间复杂度为O(n),当n特别大时&#xff0c;效率会很低可能超时&#xff0c;此时我们就需要运用到快速幂&#xff0c;将我们的时间…