基于C#实现的在线聊天室的桌面系统软件

news2024/11/24 2:05:12

资源下载地址:https://download.csdn.net/download/sheziqiong/86863237
资源下载地址:https://download.csdn.net/download/sheziqiong/86863237
目录
个人聊天室软件 1
需求分析与概要设计 1

  1. 项目说明 1
    1.1. 项目目标: 1
    1.2. 软硬件环境需求 1
    1.3. 使用的关键技术: 1
  2. 需求分析 2
    2.1. 系统用例 2
    2.2. 业务流程 3
  3. 概要设计 3
    3.1. 功能模块设计 3
    3.2. 核心类图 5
  4. 界面设计 5
    1.项目说明
    1.1.项目目标:
    本项目目标完成一个可以实现多个不同主题的在线聊天室的桌面应用,用户可以在不同的聊天室中交流不同的话题。用户在登录后可以选择聊天室、查看聊天室人数以及选择用户私聊等。
    1.2.软硬件环境需求
    软件是基于.net framework 4.7.2开发,数据库为Mysql8.0.24
    1.3.使用的关键技术:
    软件基于Socket编程,C/S架构风格开发。客户端通过发送指令得到服务器的返回信息。
    2.需求分析
    2.1.系统用例
    在这里插入图片描述

图 1 系统用例图
(1)登录
参与者:普通用户、管理员
基本事件流:用户或者管理员在登录的时候先选择登录身份。输入账号和密码后核验其账户是否存在以及密码是否匹配,若匹配则用户登录进入用户主界面,管理员登录进入管理主界面,否则提示用户不存在或者密码错误。
(2) 创建聊天室
参与者:普通用户、管理员
基本事件流:用户和管理员在创建聊天室的时候需要标明此聊天室的主题以便于有不同兴趣爱好的用户进行交流。
(3) 选择聊天室聊天
参与者:普通用户
基本事件流:用户登录后进入主界面可以浏览各个聊天室的主题以及在线人数,然后根据用户个人的兴趣爱好选择进入聊天室。本文转载自http://www.biyezuopin.vip/onews.asp?id=16975进入聊天室用户可以在公共聊天室发消息也可以选择用户私聊。
(4) 禁言
参与者:管理员
基本事件流:管理员对个别发表引战、谩骂攻击、违法等言论的用户实施禁言以管理应用,具体禁言时间根据具体情况而定。
(2) 删除聊天室
参与者:管理员
基本事件流:部分公共聊天室的主题可能存在违法乱纪的行为以及可能存在聊天室成员公开讨论违禁话题,需要管理员对此类聊天室进行查封删除。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;

namespace ChatWork.Forms
{
    public partial class Chat : Form
    {
        private readonly int id;//房间Id
        private string MsgHis = null;
        private bool IsPrivate = false;
        private string PrivateRemote = null;//私聊对象的IP
        Thread thread;
        public Chat(string Id,string theme,string content)
        {
            id = Int32.Parse(Id);
            InitializeComponent();
            Tiltle.Text = "关于 "+theme + " 的聊天";
            ChatInfo_Box.Text += "\n简介:\n"+content;
            this.Member_List.Columns.Add("IP", 180, HorizontalAlignment.Left);
            this.Member_List.Columns.Add("账户", 68, HorizontalAlignment.Left);
        }
        private void Chat_Load(object sender, EventArgs e)
        {
            //加载历史信息
            List<Message> msgs = Program.clientService.GetMsg(id);
            foreach(var m in msgs)
            {
                MsgHis += m.SendTime + "\n" + m.Sender + "说:" + m.Content + "\n";
            }
            Msg_Box.Text = MsgHis;
            Msg_Box.SelectionStart = Msg_Box.TextLength;
            Member_List.Items.Clear();
            //加载在线用户
            List<KeyValuePair<string, string>> users = Program.clientService.GetUser(id);
            Member_List.BeginUpdate();
            foreach (var user in users)
            {
                ListViewItem i = new ListViewItem();
                i.Text = user.Key;
                i.SubItems.Add(user.Value);
                Member_List.Items.Add(i);
            }
            Member_List.EndUpdate();
            //信息滑到最底部
            Msg_Box.ScrollToCaret();
            CheckForIllegalCrossThreadCalls = false;
            //开启更新信息的线程
            thread = new Thread(RefreshMsg);
            thread.IsBackground = true;
            thread.Start();
        }
        private void RefreshMsg()//更新信息
        {
            while (true)
            {
                Msg_Box.Text = MsgHis + Program.clientService.Msg;
            }
        }
        private async void Send_button_Click(object sender, EventArgs e)
        {
            string Msg = MsgSend_Box.Text.Trim();
            MsgSend_Box.Text = null;
            //消息类型判断
            if (Msg == "") MessageBox.Show("发送信息不能为空");
            else if (Msg.StartsWith("文件"))//发送文件
            {
                string[] ss = Msg.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                var re= await Program.clientService.SendFile(ss[1]);
                if(!re)
                MessageBox.Show("发送失败");
            }
            else//发送正常消息
            {
                if (!IsPrivate)//公聊
                {
                    if (!Program.clientService.SendMsg(Msg, id.ToString()))
                    {
                        MessageBox.Show("您已被禁言");
                        return;
                    }
                }
                else Program.clientService.SendMsg(Msg, PrivateRemote);       
            }
        }
        private async void Leave_button_Click(object sender, EventArgs e)
        {
            var re=await Program.clientService.LeaveChatRoom(id);
            if (re)
            {
                thread.Abort();
                this.Hide();
                MainForm mainForm = new MainForm();
                mainForm.Show();
            }
            else MessageBox.Show("请稍等");
        }
        private void File_Button_Click(object sender, EventArgs e)
        {
            string file=string.Empty;
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Multiselect = false;
            dialog.Title = "请选择文件夹";
            dialog.Filter = "所有文件(*.*)|*.*";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                file = dialog.FileName;
            }
            if (!string.IsNullOrEmpty(file))
            {
                MsgSend_Box.Text = "文件:\n"+file;
            }
        }
        private void Member_List_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(Member_List.SelectedItems.Count!=0)
            {
                if (!IsPrivate)
                {
                    DialogResult result =
                   MessageBox.Show("是否和该用户私聊?", "私聊确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        IsPrivate = true;
                    }
                    else IsPrivate = false;
                }
                else
                {
                    DialogResult result =
                   MessageBox.Show("是否和该用户取消私聊?", "取消私聊", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        IsPrivate = false;
                    }
                    else IsPrivate = true;
                }
                PrivateRemote = Member_List.SelectedItems[0].Text;
            }
        }
        //点击文件超链接
        private void Msg_Box_LinkClicked(object sender, LinkClickedEventArgs e)
        {
            string path = string.Empty;
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            if (fbd.ShowDialog() == DialogResult.OK)
            {
                path = fbd.SelectedPath;
            }
            Program.clientService.RecvPath = path;
            string s = e.LinkText;
            Program.clientService.RequestFile(s.Substring(0,s.LastIndexOf('/'))+"D:/test/"
                +s.Substring(s.LastIndexOf('/')+1));
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
资源下载地址:https://download.csdn.net/download/sheziqiong/86863237
资源下载地址:https://download.csdn.net/download/sheziqiong/86863237

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

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

相关文章

庖丁解牛 指针的高端操作

本章重点 写在前面 1.字符指针 2.指针数组 3.数组指针 3.1数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 二维数组与数组指针 4.数组参数和指指针参数 4.1一维数组传参 4.2 二维数组传参 4.3一级指针传参 4.4二级指针传参 5.函数指针 5.1函数指针的…

SSM基于小程序的医院预约挂号系统 毕业设计-附源码260839

SSM医院预约挂号小程序的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对医院排…

Prometheus系列(2)之EC2安装Node端

目标 为Prometheus安装Node程序。 步骤 node exporter程序 wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz tar xvzf node_exporter-1.4.0.linux-amd64.tar.gz cd node_exporter-1.4.0.linux-amd64/s…

技术分享 | 专项测试技术初识Hook

本文节选自霍格沃兹测试学院内部教材Hook 技术需要预先分析目标应用的源代码和逻辑&#xff0c;根据目标测试场景设置目标、逻辑和数据&#xff0c;然后运行时动态的对目标函数参数值、逻辑或者返回值做修改&#xff0c;达到修改现有函数逻辑、实现目标测试场景的目的。 Hook的…

汇编语言指令

文章目录算术运算指令ADDADDISUB伪指令LUILIAUIPCLA逻辑运算指令内存读写指令条件分支指令无条件跳转指令算术运算指令 ADD 语法ADD RD&#xff0c;RS1,RS2例子add x5,x6,x7x5x6x7编码格式&#xff1a;R-type opcode(7):0110011(OP) 从RS里面取出数据&#xff0c;把里面的数据…

【MyBatis框架】关联映射

关系映射1. 关联映射概述2. 环境搭建3.处理字段名和属性名不一致的情况4. 处理一对一映射5. 处理多对一映射5.1 级联方式处理5.2 使用association处理映射关系5.3 分步查询6. 处理一对多查询7. 小结1. 关联映射概述 在关系型数据库中&#xff0c;多表之间存在着三种关联关系&a…

Linux文件打包及压缩、解包及解压

目录 前言 什么是压缩&#xff1f; tar的介绍与使用 简介 打包压缩文件 打包文件&#xff08;不压缩&#xff09; gzip压缩类型压缩文件 bzip压缩类型压缩文件 xzip压缩类型压缩文件 解包解压文件 简介 解压缩&#xff08;解压到当前目录&#xff09; 解压缩&#x…

线代 | 【提神醒脑】自用笔记串联

一、初等变换 1、初等行变换与方程组的同解变换 2、初等行变换关系网 ※ 3、关联结论 —— 同解方程 4、行、列变换适用场景

Java 线程池之ThreadPoolExecutor学习总结

前提 java version "1.8.0_25" 池简述 软件开发活动中&#xff0c;我们经常会听到数据库连接池、内存池、线程池等各种“池”概念&#xff0c;这些“池”到底是什么东西呢&#xff1f;程序的世界里&#xff0c;我们可以将池简单的理解为一种容器类数据结构&#x…

哪本计算机书籍,让你有了醍醐灌顶突然开悟的感觉?

计算机书籍每年都会出版很多&#xff0c;但是能影响几代程序员的有这几本书&#xff0c;推荐一下&#xff0c;肯定让你有醍醐灌顶的开悟的感觉。 1、重构 改善既有代码的设计&#xff08;第2版 平装版&#xff09; 豆瓣评分&#xff1a;9.2 本书是一本为专业程序员编写的重构指…

30岁本科男,在测试行业干了五年还只会功能测试,难道真的要去送外卖吗?

在网上看到一个帖子 从发帖内容可以看出&#xff0c;题主是一位拥有五年功能测试经验的IT从业者&#xff0c;他也深知功能测试现在的处境艰难&#xff0c;想改变&#xff0c;却又因为年龄和经济压力的原因迟迟不敢迈出第一步&#xff0c;其实这是很多年近30岁的人事业危机的缩影…

【Java】之File类

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 特别标注&#xff1a;仅为自己的学习记录笔记&#xff0c;方便复习和加深记忆&#xff0c;仅供借鉴参考&#xff01; 前篇回顾&#xff1a;【java】之File类_天寒雨落的博客-CSDN博客 目录 目录的遍历…

五 系统安全分析与设计

目录 一、安全基础技术 1.1 对称与非对称加密 1.2 数字签名&#xff08;防抵赖&#xff09; 1.3 信息摘要&#xff08;防篡改&#xff09; 1.4 加密、数字签名、信息摘要结合使用 1.5 数字证书&#xff08;防止公钥被截取篡改&#xff09; 二、网络安全 2.1 安全协议 …

Android LayerDrawable 使用

1. 前言 Android LayerDrawble 包含一个Drawable数组&#xff0c;系统将会按照这些Drawable对象的数组顺序来绘制他们&#xff0c;索引最大的 Drawable 对象将会被绘制在最上面。 LayerDrawable对象的xml文件的根元素是<layer-list>&#xff0c; 该元素内部包含多个<i…

【Linux】开发工具之gdb调试器

目录&#x1f308;前言&#x1f337;1、debug与release&#x1f338;2、gdb选项&#x1f308;前言 本篇文章进行调试器gdb的学习&#xff01;&#xff01;&#xff01; &#x1f337;1、debug与release debug会生成需要调试的信息&#xff0c;release不会生成 程序的发布方式有…

【Node.js】模块的加载机制

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 目录 模块的加载机制 优先从缓存中加载 内置模块的加载机制 自定义模块的加载机制 第三方模块的加载机…

2022年浙江省中职组“网络空间安全”赛项模块B--Linux系统渗透提权

2022年中职组浙江省“网络空间安全”赛项 B-3:Linux系统渗透提权一、竞赛时间 420分钟 共计7小时 吃饭一小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第①阶段: 单兵模式系统渗透测试 任务一: Windows操作系统渗透测试 任务二: Linux操作系统渗透测试 任务…

经典算法|水仙花数|自幂数

算法题目 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09;&#xff0c;水仙花数是指一个 3 位…

高精度RC振荡器的设计

1. 一些技术指标 应用于数字模拟混合信号芯片的高频率精度&#xff0c;高频率稳定度&#xff0c;全集成RC振荡器设计 由于数字电路指标仅与复杂度有关&#xff0c;此仅考虑模拟电路的设计指标。 项目Value电源电压2.5V~5.5V工作温度-40~125目标频率Ftyp 2MHZ频率精度&#x…

常用流媒体服务器

1、Mediasoup mediasoup是相对比较新的一个WebRTC服务器端的开源项目。它更多是通过集成包方式和其他应用服务器来集成。它支持SFU模式&#xff0c;主要支持视频聊天&#xff0c;媒体流广播等。 其特点是&#xff1a; 通过底层API实现和第三方集成&#xff0c;安装简单&#…