首页 > 系统相关 >C# 实现 Linux 视频聊天、远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS)

C# 实现 Linux 视频聊天、远程桌面(源码,支持信创国产化环境,银河麒麟,统信UOS)

时间:2023-06-26 10:35:16浏览次数:159  
标签:UOS 视频 请求 C# 源码 远程桌面 VideoChatMini public 聊天

       园子里的有朋友在下载并了解了《C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)》中提供的源码后,留言给我说,这个视频会议有点复杂了,代码比较多,看得有些费劲。问我能不能整个简单点的Demo,只要有视频聊天和远程桌面的功能就可以。于是,我就又写了一个Demo来供大家参考,它可以在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)当同意对方的控制请求时,对方就可以控制请求方的电脑了。

         

四.源码下载

     源码下载:VideoChatMini.rar (若点击没有自动下载,可右键另存为)

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

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

 

标签:UOS,视频,请求,C#,源码,远程桌面,VideoChatMini,public,聊天
From: https://www.cnblogs.com/shawshank/p/17420469.html

相关文章

  • VS Code扩展Browser Preview调试Web
    在扩展库里添加后,选择好html网页后执行(Openin BrowserPreview)右键点击: 打开例子为:yeoman创建officeexcel ......
  • 记一次SAS导出excel无法打开的问题
    问题今天遇到一个问题,SAS做好数据集导出xlsx文件后无报错但无法打开文件,EXCEL中报错"发现"XXX.xlsx"中的部分内容有问题。是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击"是""出现原因第一步查看日志,但没有发现任何的warning和error信息,note信息也没有明显的问题,于是......
  • 本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama
    在过去的几个月里,大型语言模型(llm)获得了极大的关注,这些模型创造了令人兴奋的前景,特别是对于从事聊天机器人、个人助理和内容创作的开发人员。大型语言模型(llm)是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用广泛的数据集进行训练,这......
  • JavaScript program to check if a given year is leap year Javascript判断是否是闰
    Ayearisleapyeariffollowingconditionsaresatisfied:Yearismultipleof400.Yearismultipleof4andnotmultipleof100.Approach: Getthevalueofinputfieldbyusingdocument.getElementById(“year”).valueCheckthegivenyearisleapyear......
  • Pytorch | view()函数的使用
    函数简介Pytorch中的view函数主要用于Tensor维度的重构,即返回一个有相同数据但不同维度的Tensor。根据上面的描述可知,view函数的操作对象应该是Tensor类型。如果不是Tensor类型,可以通过tensor=torch.tensor(data)来转换。普通用法(手动调整size)view(参数a,参数b,…),其中,总......
  • ORA-29278: SMTP transient error: 421 Service not available
    ORA-29278:SMTPtransienterror:421Servicenotavailable一般来说,很可能是邮件服务器连接不上p_conn:=utl_smtp.open_connection('xx.xx.xxx.xxx',xxx);解决方法也很简单,将ip改为正确的邮件服务器ip即可......
  • 微服务CAP原则
    微服务CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,存在Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性),三者不可同时保证,最多只能保证其中的两者。 一致性(C):在分布式系统中的所有数据备份,在同一时刻都是同样的值(所有的节点无论何时访问都能......
  • java反射之-InvocationHandler使用
    InvocationHandler是Java中的一个接口,是Java反射API的一部分。与Proxy类一起使用,用于动态创建接口的代理实例。在Java中使用Proxy类创建代理对象时,需要提供一个InvocationHandler实现来定义代理对象的行为。InvocationHandler接口只有一个方法,即invoke()方法,它......
  • 【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(二)
    在上文中,我们为大家介绍了HTML/JSP编辑器、智能代码完成和内容辅助等功能,本文将继续介绍Emmet支持、Outline视图功能等。MyEclipsev2023.1正式版下载MyEclipse技术交流群:742336981欢迎一起进群讨论如果您有HTML或JSP文件要编辑,这里将介绍如何编辑。查找以下信息:编辑源代......
  • React实战--利用甘特图和看板,强化Paas平台应用
    概述这是一篇React在kintone上的实战,我们需要利用看板和甘特图来来强化项目管理app。另外这次用到了webpack,想了解基本配置思路的可以看这里项目地址GitHub-kintone-samples/SAMPLE-kintone-ganttchart-kanban-cn:projectmanagerforkintone,usingGanttandKanban效......