微信小程序|基于小程序+C#制作一个聊天系统

news2024/12/28 3:23:49

此文主要基于小程序+C#使用WebSocket制作一个聊天系统,基本实现小程序与服务端的聊天功能。用小程序自带的客服功能只能绑定微信且一对一沟通,接入市面上成熟的即时通讯预算又略显不足,干脆自己开发一个也能应对简单的业务场景。

在这里插入图片描述

    • 实现流程
      • 1、服务端
        • 1.1、项目创建
        • 1.2、设计界面
        • 1.3、服务端功能实现
      • 2、小程序
        • 2.1、小程序创建
        • 2.2、页面设计
        • 2.3、消息接收
        • 2.4、消息发送

实现流程

1、服务端

1.1、项目创建

  1. 打开Visual Studio,右侧选择创建新项目。

在这里插入图片描述

  1. 搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一步,创建成功后如下图。

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

1.2、设计界面

  1. 在工具箱拖拽出lable文本标签修改其text属性填充标题。

在这里插入图片描述

  1. 拖拽textbox控件到窗体上用于输入所监听的端口号及发送的文本信息等。

在这里插入图片描述

  1. 接下来依次拖入button控件及listview控件实现按钮及消息面板样式。

在这里插入图片描述

1.3、服务端功能实现

  1. 实现websocket服务端启动功能。

在这里插入图片描述

双击button按钮,会生成对应的按钮事件,在事件代码中先获取端口号文本框输入的值是否正确。

在这里插入图片描述

 int port = 9000;
 if (textBox_port.Text == string.Empty)
   {
       MessageBox.Show("请填写端口", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
       return;
   }
   try
   {
       port = Convert.ToInt32(textBox_port.Text.Trim());
   }
   catch
   {
       MessageBox.Show("请填写正确的端口", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
       return;
   }

在点击后,将按钮禁用,避免用户重复点击的同时开启服务端。

在这里插入图片描述

try
{
         var result = _server.Open(port, "DIS");
         if (result)
         {
             this.toolStripLabel_event.Text = "启动成功";
             this.toolStripLabel_event.ForeColor = Color.Green;
             this.toolStripLabel1.Text = "监听端口:" + port.ToString();
             WSocketServer._Logger.Info("服务器启动成功");
         }
         else
         {
             this.toolStripLabel_event.Text = "启动失败";
             this.toolStripLabel_event.ForeColor = Color.Red;
             this.toolStripLabel1.Text = "监听端口:" + port.ToString();
             button_StartListen.Enabled = true;
             button_StopListen.Enabled = false;
             button_Send.Enabled = false;
             WSocketServer._Logger.Error("服务器启动失败");
         }
     }
     catch (Exception ex)
     {
         WSocketServer._Logger.Error("服务器启动失败:"+ ex.ToString());
     }

实现开启服务端的方法,这里需要对websocket的各项信息进行配置。

在这里插入图片描述

this.WebSocket = new WebSocketServer();
var serverConfig = new ServerConfig
{
    Name = serverName,
    MaxConnectionNumber = 10000, //最大允许的客户端连接数目,默认为100。
    Mode = SocketMode.Tcp,
    Port = port, //服务器监听的端口。
    ClearIdleSession = false,   //true或者false, 是否清除空闲会话,默认为false。
    ClearIdleSessionInterval = 120,//清除空闲会话的时间间隔,默认为120,单位为秒。
    ListenBacklog = 10,
    ReceiveBufferSize = 64 * 1024, //用于接收数据的缓冲区大小,默认为2048。
    SendBufferSize = 64 * 1024,   //用户发送数据的缓冲区大小,默认为2048。
    KeepAliveInterval = 1,     //keep alive消息发送时间间隔。单位为秒。
    KeepAliveTime = 60,    //keep alive失败重试的时间间隔。单位为秒。
    SyncSend = false
};
SocketServerFactory socketServerFactory = null;
//开启wss 使用证书
if (isUseCertificate)
{
    serverConfig.Security = serverSecurity;
    serverConfig.Certificate = new SuperSocket.SocketBase.Config.CertificateConfig
    {
        StoreName = serverStoreName,
        StoreLocation = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine,
        Thumbprint = serverThumbprint
    };
    socketServerFactory = new SocketServerFactory();
}
  1. 实现消息发送功能。

在这里插入图片描述

双击发送按钮,获取客户端网络节点号向其发送数据并将发送的文本填充至消息面板。

在这里插入图片描述

 //客户端网络节点号
string remoteEndPointStr = session.RemoteEndPoint.ToString();
if (remoteEndPointStr == s)
{
    try
    {
        ReceiveData sendData = new ReceiveData();
        //发送数据
        sendData.User = "guest";
        sendData.Type = "msg"; 
        sendData.Msg = textBox_msg.Text.Trim();
        sendData.SendTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        _server.SendMessage(session, JsonConvert.SerializeObject(sendData));
        this.BeginInvoke(addListView, "guest", JsonConvert.SerializeObject(sendData));
        MessageBox.Show("发送成功", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }
    catch (Exception ex)
    {
        WSocketServer._Logger.Error(ex.ToString());
        MessageBox.Show(ex.ToString(), "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }
}
  1. 实现消息监听功能,接收来自客户端的数据并进行展示。

在这里插入图片描述

 /// <summary>
 /// 接收到的数据
 /// </summary>
 /// <param name="session">session</param>
 /// <param name="rData">value</param>
 private void Server_MessageReceived(SuperWebSocket.WebSocketSession session, string rData)
 {
     //IP地址
     string ipAddress_Receive = session.RemoteEndPoint.ToString();
     if (rData.Equals(""))
     {
         //空数据不返回服务器信息
         return;
     }
     try
     {
         //接收到客户端链接发送的东西
         ReceiveData receiveData = JsonConvert.DeserializeObject<ReceiveData>(rData);
         receiveData.SendTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
         switch (receiveData.Type)
         {
             case "HeartBeat":
                 //心跳
                 //发送客户端连接成功信息
                 //_server.SendMessage(session, "HeartBeat");
                 break;
             default:
                 //返回用户发送数据
                 _server.SendMessage(session, JsonConvert.SerializeObject(receiveData));
                 break;
         }
     }
     catch
     {
         WSocketServer._Logger.Error("接收异常数据:" + rData);
         //错误数据不反回服务器信息
         return;
     }
     if (MsgFalg)
     {
         //服务端显示客户端发送接受信息
         this.BeginInvoke(addListView, ipAddress_Receive, rData);
     }
 }

2、小程序

2.1、小程序创建

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

2.2、页面设计

  1. 页面上根据发送人判断消息在哪边展示,同时还需要提供一个文本框以及按钮实现发送功能。

在这里插入图片描述

在这里插入图片描述

<view class="cu-chat" id="j_page">
  <view class="cu-item {{item.User==''?'self':''}}" wx:for="{{chatData}}">
    <view class="cu-avatar radius" style="background-image:url(../../image/cat.jpg)" wx:if="{{item.User=='guest'}}"></view>
    <view class="main">
      <view class="content shadow {{item.User==''?'bg-green':''}}">
        <text>{{item.Msg}}</text>
      </view>
    </view>
    <view class="cu-avatar radius" style="background-image:url(../../image/fm3.jpg)" wx:if="{{item.User==''}}"></view>
    <view class="date">{{item.SendTime}}</view>
  </view>
</view>
  1. 通过文本框的blur事件获取用户所输入的内容。

在这里插入图片描述

  formMsg(e) {
    this.setData({
      content: e.detail.value.trim()
    })
  },

2.3、消息接收

  1. 在js的onload事件中创建websocket的连接,同时监听来自服务端的消息,端口号可以改成配置型。

在这里插入图片描述

    let that = this;
    socket = wx.connectSocket({
      url: 'ws://localhost:9000/',
      success: res => {
        //console.info('创建连接成功');
      }
    });
    // console.info(socket);
    //事件监听
    socket.onOpen(function () {
      //console.info('连接打开成功');
    });
    socket.onClose(function () {
      //console.info('连接关闭成功');
    });
    socket.onError(function () {
      console.info('连接报错');
    });
    //服务器发送监听
    socket.onMessage(function (e) {
      console.info(JSON.parse(e.data));
      var info = JSON.parse(e.data);
      that.setData({
        chatData: that.data.chatData.concat(info)
      });
      // that.setData({chatData:list});
    });
  1. 在监听的回调中,将服务端发送的文本进行打印可以看到效果如下图。

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

  1. 根据其格式将数据在页面上进行渲染,效果如下。

在这里插入图片描述

2.4、消息发送

  1. 发送按钮绑定自定义函数,获取文本框中用户输入的值,并通过websocket的内置函数将数据进行传输,这样服务端就能对数据进行接收展示。

在这里插入图片描述

    wx.sendSocketMessage({
      data: info,
      success: function (res) {
      },
      fail: function (res) {
       
      }
    })

在这里插入图片描述

有兴趣的小伙伴可以在文章基础上进行拓展,可以增加例如群发、文件、图片发送等更加实用的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据智仓功能介绍(二)

界面介绍 访问入口 具备权限的人员从系统管理后台进入界面&#xff0c;点击数据智仓&#xff0c;右侧是展示系统中已经配置的数据集。 数据集展示界面 如下图所示&#xff0c;系统中已经配置的数据集包含 数据集名称&#xff0c;修改人员&#xff0c;上次运行时间&#xff08…

matlab智能算法之遗传算法

智能算法之遗传算法智能算法之遗传算法1.背景2.算法3.案例3.1 案例求解二元函数的最大值智能算法之遗传算法 1.背景 2.算法 3.案例 3.1 案例求解二元函数的最大值 例1&#xff1a;计算二元函数f(x,y)20x2y2−10∗(cos(2πx)cos(2πy))f(x,y)20x^2y^2-10*(cos(2\pi x)cos(2…

[附源码]Node.js计算机毕业设计大学生健康系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Qt扫盲-QToolButton 理论总结

QToolButton 理论总结1. 概述2. 使用场景3. 外观样式4. 菜单用途1. 概述 ToolButton 是一种特殊按钮&#xff0c;用于快速访问 特定命令或选项。与普通PushButton 按钮常用显示内容不同&#xff0c;ToolButton 通常不显示文本标签&#xff0c;而是显示图标。当然&#xff0c;也…

Windows与Linux利用系统自带实现共享文件夹的功能

这里需要两台机器在同一局域网或者可互相ping通。系统以Windows11和Windows Subsystem for Linux&#xff08;Ubuntu22.04.1&#xff09;或国产Linux发行版的统信UOS&#xff08;版本号20&#xff09;为例&#xff0c;其他的版本系统也类似&#xff0c;非Linux虚拟机也测试过&a…

蚁群算法详解-解决TSP问题

文章目录前言一、蚁群算法是什么&#xff1f;算法步骤二、基本原理三、数学模型1、算法中的参数设置2、构建路径轮盘赌例子3、更新信息素浓度代码终止四、代码展示五、参数实际设定1.参数设定的准则2.蚂蚁数量3.信息素因子4.启发函数因子5.信息素挥发因子6. 最大迭代次数7. 组合…

Android 实现相机(Camera)预览

CameraX 是一个 Jetpack 库&#xff0c;旨在帮助您更轻松地开发相机应用。 对于新应用&#xff0c;我们建议从 CameraX 开始。它提供一致且易于使用的 API&#xff0c;适用于绝大多数 Android 设备&#xff0c;并向后兼容 Android 5.0&#xff08;API 级别 21&#xff09;。 Ca…

Python基础篇学习

本篇博文目录:一.Python基础语法1.Python基础知识2.了解Python的基础语法结构3.python基础知识二.数据类型1.数字2.字符串3.布尔4.空值&#xff1a;None5.列表6.元祖7.字典8.Bytes9.集合(Set)三:程序三大结构( 顺序结构&#xff0c;分支结构&#xff0c;循环结构)1.顺序结构2.分…

2022-我的秋招之旅

1. 自我介绍 ​ 版1&#xff1a;&#xff08;实习&#xff09; ​ 面试官好&#xff0c;我叫xx&#xff0c;来自xx&#xff0c;目前研究生xx&#xff0c;就读于xx&#xff0c;在研究生期间&#xff0c;担任的职务为xx&#xff0c;在校期间参加各种比赛&#xff0c;如xx等&…

MATLB|实时机会约束决策及其在电力系统中的应用

目录 一、概述 二、数学模型 2.1 机会约束决策的情景方法 2.2 带有测量的情景方法 三、 机会约束决策的一种快速方法 3.1 通过仿射变换进行近似调节 3.2 可行域的仿射变换 3.3 两阶段决策算法 四、算例——配电网 4.1 防止过电压的有功功率削减 4.2 数值模拟 4.3 运…

第二十章 多源最短路之Floyd算法的思路即实现(超强解析)

第二十章 多源最短路之Floyd算法的思路即实现一、什么是多源最短路二、Floyd算法1、算法思路2、算法模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;代码模板&#xff1a;&#xff08;3&#xff09;代码分析:一、什么是多源最短路 我们之前了解到的d…

远程Jenkins新增Mac电脑节点,你知道怎么操作么?

目录&#xff1a;导读 一&#xff0c;前言 二&#xff0c;Mac电脑准备 1&#xff0c;网络环境 2&#xff0c;设置允许远程登录 三&#xff0c;Jenkins新增节点 1&#xff0c;新建节点 2&#xff0c;配置节点 3&#xff0c;节点启动代理 四&#xff0c;写在最后 一&…

算法竞赛入门【码蹄集进阶塔335题】(MT2176-2200)

算法竞赛入门【码蹄集进阶塔335题】(MT2176-2200&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2176-2200&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2176 围栏木桩2. MT2177 学习时间3. MT2178 最长子段…

【设计模式】观察者模式Observe(Java)

文章目录1. 观察者模式定义2. 类图3.Java实现3.1 定义主题Interface3.2 定义观察者Interface3.3 定义具体主题3.4 定义具体观察者3.5 定义测试主方法1. 观察者模式定义 观察者模式定义了对象之间的一对多依赖&#xff0c;这样以来&#xff0c;当一个对象改变状态时&#xff0c…

如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物等?

如何利用ArcGIS实现电子地图可视化表达&#xff1f;如何利用ArcGIS分析空间数据&#xff1f;如何利用ArcGIS提升SCI论文的层次&#xff1f;制图是地理数据展现的直观形式&#xff0c;也是地理数据应用的必要基础 本文从ArcGIS的基本操作、ArcGIS 的空间数据分析及ArcGIS 的高级…

使用MyBatis Generator自动创建代码

使用MyBatis Generator自动创建代码安装jdk下载jar 和配置xml文件自动生成代码报错分析与解决Table configuration with catalog null, schema null, and table public.user_t did not resolve to any tablesThe specified target project directory src does not exist安装jdk…

深入解决Linux内存管理之page fault处理

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 内核实现只是在进程的地址空间建立好了vma区域&#xff0c;并没有实际的虚拟地址到物理地址的映射操作。…

基于Pyqt5实现笔记本摄像头拍照及PaddleOCR测试

在上一篇文章《基于百度飞桨PaddleOCR的图片文字识别》的基础上&#xff0c;做了个简单的扩展&#xff1a; 1、通过Pyqt5做个简单的UI界面&#xff1b; 2、通过OpenCV操作笔记本摄像头进行视频显示、拍照等功能&#xff1b; 3、加载图片&#xff1b; 4、对拍照图片或者加载的图…

Python贝叶斯回归分析住房负担能力数据集

我想研究如何使用pymc3在贝叶斯框架内进行线性回归。根据从数据中学到的知识进行推断。 最近我们被客户要求撰写关于贝叶斯回归的研究报告&#xff0c;包括一些图形和统计输出。 视频&#xff1a;线性回归中的贝叶斯推断与R语言预测工人工资数据案例 贝叶斯推断线性回归与R语言…

猿如意---Visual Studio手把手教学安装和下载.

亲自为大家示范如何使用猿如意以及在猿如意当中下载&#xff0c;安装和使用python3.10版本&#xff0c;让大家喜欢上这款好用的app—猿如意。 文章目录前言一、手把手教你猿如意的安装、下载二、手把手教你Visual Studio的安装、下载1.找到我需要的工具2.我需要的工具的安装、下…