您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C# 实现 Linux 视频聊天、远程桌面源码(支持信创国产化环境)

时间:2023-06-28 16:17:36  来源:今日头条  作者:IT技术资源爱好者

今天给大家分享一款利用C# 实现 linux 视频聊天、远程桌面源码(支持信创国产化环境,银河麒麟,统信UOS)的系统源码,它可以在windows和Linux(包括国产OS,如银河麒麟、统信UOS、深度Deepin等)上运行。

下图是在银河麒麟V10上运行的截图:

 

一.功能介绍

1. 视频聊天

(1)每个登录的用户都可向其他任意在线用户发送视频聊天请求。

(2)当收到来自其他在线用户的视频聊天邀请时,可接受或拒绝对方的请求。

(3)当接受其他在线用户的视频聊天邀请时,即可开启视频聊天。

2. 远程桌面

(1)每个登录的用户都可向其他任意在线用户发送远程桌面请求;当对方未响应时,可主动取消远程桌面请求。

(2)当收到来自其他在线用户请求控制桌面时,可接受或拒绝对方的请求。

(3)当发送方收到其他在线用户同意控制其电脑时,即可开启远程桌面连接。

(4)被控端和主控端都可主动断开远程桌面连接。

二.开发环境
1.开发工具:

Visual Studio 2022

2. 开发框架

.NET Core 3.1,.NET 6,.NET 7

3.开发语言:

C#

4.其它框架:

CPF.net UI 框架、OMCS 语音视频框架

 

三.具体实现

下面我们讲一下Demo中核心的代码实现,大家从文末下载源码并对照着源码看,会更清楚些。

1.自定义消息类型 InformationTypes

        public static class InformationTypes
    {
        /// <summary>
                /// 视频请求 0
        /// </summary>
        public const int VideoRequest = 0;

        /// <summary>
                /// 回复视频请求的结果 1
        /// </summary>
        public const int VideoResult = 1;

        /// <summary>
                /// 通知对方 挂断 视频连接 2
        /// </summary>
        public const int CloseVideo = 2;

        /// <summary>
        /// 通知好友 网络原因,导致 视频中断 3
        /// </summary>
        public const int NetReasonCloseVideo = 3;

        /// <summary>
        /// 通知对方(忙线中) 挂断 视频连接 4
        /// </summary>
        public const int BusyLine = 4;

        /// <summary>
                /// 远程桌面请求 5
        /// </summary>
        public const int DesktopRequest = 5;

        /// <summary>
                /// 回复远程桌面请求的结果 6
        /// </summary>
        public const int DesktopResult = 6;

        /// <summary>
                ///  主动取消远程桌面请求 7
        /// </summary>
        public const int CancelDesktop = 7;

        /// <summary>
                ///  对方(主人端)主动断开远程桌面 8
        /// </summary>
        public const int OwnerCloseDesktop = 8;

        /// <summary>
                /// 客人端断开远程桌面连接 9
        /// </summary>
        public const int GuestCloseDesktop = 9;
    } 

2. 发送视频请求

(1)当发起视频聊天时,将显示视频聊天窗口  

/// <summary>
/// 显示视频聊天窗口
/// </summary>
/// <param name="wAIt">true表示自己为发送端</param>
public void RequestVideo(bool wait)
{
  if (videoChat == null)
  {
    videoChat = DoCreateVideoChatForm(wait);
  }
  videoChat.Show();
  IMultimediaManager mgr = MultimediaManagerFactory.GetSingleton();
  if (mgr == null)
  {
    CommonHelper.ShowToolTip("无法启动多媒体设备!");
    ClearVideoChat();
    return;
  }
  this.videoChat.Initialize(mgr);
  this.videoChat.SendVideoRequest(wait);
}

(2)连接自己的摄像头并发送视频通话请求

/// <summary>
/// 发送视频通话请求
/// </summary>
/// <param name="isSend">是否为发送者</param>
internal void SendVideoRequest(bool isSend)
{
  this.StackPanel_Camera_myself.Visibility = Visibility.Visible;
  this.dynamicCameraConnector_myself.ConnectEnded += DynamicCameraConnector_myself_ConnectEnded;
  this.dynamicCameraConnector_myself.SetViewer(this.image_camera_myself);
  this.dynamicCameraConnector_myself.BeginConnect(this.currentUserID);
  if (isSend)
  {
    this.time_tip.Content = "正在等待对方回复";
    App.multimediaManager.SendCustomizedMessage(this.friendID, InformationTypes.VideoRequest,null, null);
  }
}   

3. 回复对方视频请求

(1)当收到对方的视频聊天邀请时,将显示视频邀请窗口

 

(2)发送回复视频聊天请求消息

/// <summary>
/// 是否同意视频聊天请求
/// </summary>
/// <param name="isReceive">true表示同意,false表示拒绝</param>
private void ReplyVideoRequest(bool isReceive)
{
  try
  {
    byte[] vs = BitConverter.GetBytes(isReceive);
    App.multimediaManager.SendCustomizedMessage(this.friendId, InformationTypes.VideoResult, vs,null);
    if (isReceive)
    {
      App.mainWindow.RequestVideo(false);
      App.mainWindow.SetCurrentVideo(this.friendId);
    }
    else
    {
      CommonHelper.ShowToolTip("已拒绝对方视频通话邀请");
    }
    Close4BtnClick = true;
    App.mainWindow.ClearVideoRequest();
  }
  catch(Exception e)
  {
    LoginWindow.FileAgileLogger.Log(e, "VideoRequestWindow.ReplyVideoRequest", ESBasic.Loggers.ErrorLevel.Standard);
  }
} 

4. 收到对方视频请求的回复

/// <summary>
/// 视频请求,收到对方回复
/// </summary>
/// <param name="OtherIsAgree">true表示同意,false表示拒绝</param>
internal void SendVideoRequestResult(bool OtherIsAgree)
{
  if (OtherIsAgree)
  {
    this.OnAgree(this.friendID);
    App.mainWindow.SetCurrentVideo(this.friendID);
  }
  else
  {
    CommonHelper.ShowToolTip("对方拒绝与您进行视频通话");
    App.mainWindow.ClearVideoChat();
  }
}

当对方回复同意时,将连接到对方的麦克风和摄像头,开始视频聊天会话:

/// <summary>
/// 对方同意视频会话
/// </summary>
public void OnAgree(string destLoginID)
{
  try
  { 
    startTime = DateTime.Now;
    timer.Start();
    this.friendLoginID = destLoginID != null? destLoginID: this.friendName;
    this.lab_title.Content = string.Format("正在和{0}视频会话", this.friendName);
    this.dynamicCameraConnector1.BeginConnect(this.friendLoginID);
    this.microphoneConnector1.BeginConnect(this.friendLoginID);
    this.microphoneConnector1.ConnectEnded += MicrophoneConnector1_ConnectEnded;
    this.dynamicCameraConnector1.ConnectEnded += DynamicCameraConnector1_ConnectEnded;
    this.dynamicCameraConnector1.Disconnected += DynamicCameraConnector1_Disconnected;
    this.dynamicCameraConnector1.SetViewer(this.image_camera_other);
  }
  catch (Exception ee){}
}

 

5. 实现远程桌面

远程桌面的请求/应答逻辑几乎与视频聊天请求/应答逻辑是一模一样的。这里就不再罗列响应的代码了。

(1)当收到对方的远程桌面控制请求时,将显示请求窗口。

 

(2)当同意对方的控制请求时,对方就可以控制请求方的电脑了。

 

四.源码下载及说明

1. 源码项目说明

下载源码压缩包,解压后,可以用 VS2022 打开解决方案,其中主要包括了如下几个项目:

(1) Oraycn.Demos.VideoChatMini.ClientWPF:视频聊天Windows 客户端(WPF版本)

(2) Oraycn.Demos.VideoChatMini.Server:视频聊天 Windows 服务端

(3) Oraycn.Demos.VideoChatMini.LinuxClient:视频聊天 Linux 客户端

(4) Oraycn.Demos.VideoChatMini.LinuxServer:视频聊天 Linux 服务端

注: Linux客户端内置的是x86/x64非托管so库,若需要其它架构的so,请联系QQ:2027224508 获取。

2. 在Linux上部署运行说明

在部署之前,需要在linux服务端和客户端上分别安装 .Net core 3.1版本,命令行安装命令如下:

yum install dotnet-sdk-3.1

检查版本安装情况

 dotnet --version

运行:

(1)在centos上启动Oraycn.Demos.VideoChatMini.LinuxServer服务端:

  拷贝Oraycn.Demos.VideoChatMini.LinuxServer项目下的Debug文件夹,到CentOS操作系统上,打开Debug -> netcoreapp3.1目录 ,在目录下打开终端,执行以下命令启动服务端

 

dotnet Oraycn.Demos.VideoChatMini.LinuxServer.dll

(2)在麒麟或统信UOS、Ubuntu上运行Oraycn.Demos.VideoChatMini.LinuxClient客户端:

  拷贝Oraycn.Demos.VideoChatMini.LinuxClient项目下的Debug文件夹,到麒麟或统信UOS、Ubuntu操作系统上,打开Debug -> netcoreapp3.1目录 ,在目录下打开终端,执行以下命令启动客户端

dotnet Oraycn.Demos.VideoChatMini.LinuxClient.dll

命令执行成功后,就会出现之前截图的客户端主界面。



Tags:C#   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  Search: C#  点击:(30)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  Search: C#  点击:(23)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  Search: C#  点击:(67)  评论:(0)  加入收藏
C# 登顶!超越Java或非空想
整理丨诺亚出品 | 51CTO技术栈(微信号:blog51cto)近日,TIOBE编程社区公布年度编程语言,此次摘得这一桂冠的是C#。这也是C#在TIOBE二十多年评选历史中首次赢得这一年度大奖。C#虽...【详细内容】
2024-01-15  Search: C#  点击:(114)  评论:(0)  加入收藏
C#进程间消息传递
C#是一种流行的编程语言,它可以用于开发Windows应用程序。在开发Windows应用程序时,有时需要进行进程间通信,以实现不同进程之间的数据传递和交互。C#提供了多种方式来进行进程...【详细内容】
2024-01-01  Search: C#  点击:(104)  评论:(0)  加入收藏
搞懂C#文件压缩:SharpZipLib vs. DotNetZip,实用代码一网打尽!
在C#中,有两个热门的文件压缩解析类库分别是SharpZipLib和DotNetZip。以下是它们的简要介绍以及使用实例代码。1. SharpZipLib功能: 支持ZIP和GZip格式的压缩和解压缩。 提供...【详细内容】
2023-12-31  Search: C#  点击:(11)  评论:(0)  加入收藏
探秘C#中的秘密通道:五种引人注目的方法调用内部或私有方法
在 C# 中,可以使用不同的方法调用内部或私有方法。下面分别介绍通过反射、MethodInfo.CreateDelegate、表达式(树)、动态方法(call)、动态方法(calli)这五种方法。1. 通过反射方法...【详细内容】
2023-11-24  Search: C#  点击:(20)  评论:(0)  加入收藏
C#参数传递
前几天一个学员在学习C#与参数传递交互时,也不知道参数传递可以用来做什么 。下面我们就详细讲讲C# 和参数传递交互的相关知识。C#是一种面向对象的编程语言,支持多种参数传...【详细内容】
2023-11-11  Search: C#  点击:(214)  评论:(0)  加入收藏
C#与高级控件
前几天一个学员在学习C#与高级控件交互时,也不知道高级控件可以用来做什么 。下面我们就详细讲讲C# 和高级控件交互的相关知识。C#是一种功能丰富的面向对象编程语言,它包含...【详细内容】
2023-11-10  Search: C#  点击:(256)  评论:(0)  加入收藏
如何在C#客户端程序中无缝集成Python算法
背景介绍在软件开发领域,C#是一种广泛应用的面向对象编程语言,具有强大的类型系统和丰富的库支持。它常被用于开发Windows桌面应用程序、Web应用程序和服务端应用程序等。然而...【详细内容】
2023-11-03  Search: C#  点击:(297)  评论:(0)  加入收藏
▌简易百科推荐
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(4)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(21)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(30)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(113)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(67)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(111)  评论:(0)  加入收藏
C# 登顶!超越Java或非空想
整理丨诺亚出品 | 51CTO技术栈(微信号:blog51cto)近日,TIOBE编程社区公布年度编程语言,此次摘得这一桂冠的是C#。这也是C#在TIOBE二十多年评选历史中首次赢得这一年度大奖。C#虽...【详细内容】
2024-01-15    51CTO  Tags:C#   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条