b/s语音聊天 c#
2007-08-09 20:48:00 csucj 阅读数 466

Response. Write( "<script> alert  ( ' 曹建' ) </script>" ); 

Response.Write("<h2 align=center> 曹建</h2>");

2007-12-02 10:35:00 nnsword 阅读数 617

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// MD5 的摘要说明
/// </summary>
public class MD5
{
 public MD5()
 {
  //
  // TODO: 在此处添加构造函数逻辑
  //
 }
    public static string get(string str, int code)
    {
        if (code == 16) //16位MD5加密(取32位加密的9~25字符)
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
        }
        else//32位加密
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
        }
    }
}
 

2008-01-02 09:03:00 taokai 阅读数 454

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// MD5 的摘要说明
/// </summary>
public class MD5
{
 public MD5()
 {
  //
  // TODO: 在此处添加构造函数逻辑
  //
 }
    public static string get(string str, int code)
    {
        if (code == 16) //16位MD5加密(取32位加密的9~25字符)
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
        }
        else//32位加密
        {
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
        }
    }
}
 

2019-05-17 14:43:42 weixin_44540179 阅读数 87

架构一共有典型的两层架构,分别是桌面端和浏览器端(C/S和B/S)。
C/S(桌面端)结构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据。
Client/Server是建立在局域网的基础上的。(C/S)
Browser/Server是建立在广域网的基础上的。(B/S)
虽然这两个架构有一些相近,实际上则是区别则是大相庭径。因为C/S结构是桌面端,而B/S结构是浏览器端。
在这里插入图片描述
(C/S结构)

C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将 任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境 的优势。

C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。将任务分配到Client 和Server两端,降低了系统的通讯开销。
其优点是:

1.可以充分发挥客户端PC的处理能力
2.UI可以充分满足客户自身的个性化要求
3. 安全性能可以保证,C/S一般面向相对固定的用户群,程序注重流程,它可以对权限进行多层次校验,提供了更安全的存取模式,对信息安全的控制能力很强。
缺点是:

  1. 兼容性差
  2. 需要专门的客户端安装程序,分布功能弱
  3. 用户群固定和开发和维护的成本高,因为一次升级,则所有客户端的程序都要改变。

B/S(浏览器)结构,主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,难以实现传统模式下的特殊功能要求。需要通过浏览器与服务器进行交互。
在这里插入图片描述

B/S的主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题没有C/S(桌面端)强,B/S(浏览器端)对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,难以实现传统模式下的特殊功能要求。对大量的数据输入以及报表的应答等都需要通过浏览器与服务器进行交互,通信开销大,而且对于实现复杂的应用构造有较大的困难。
BS的优点:
  1.分布性强,客户端零维护。只要有网络、浏览器,可以随时随地进行查询浏览等业务处理。
  2.业务扩展简单方便,通过增加网页即可增加服务器功能。
  3.维护简单方便,只要改变网页,就能实现所有用户的同步更新。
  4.开发简单,共享性强。
缺点是:
1.个性化特点明显降低,无法实现具有个性化的功能要求
2.在跨浏览器上,BS架构不尽如人意
3.功能弱化

最后小结图片:
在这里插入图片描述

2015-01-21 16:17:00 weixin_34352449 阅读数 30

在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源代码下载。尽管有源代码,可是非常多朋友反映,理解起来还是有些模糊、不够清楚。如今想来,是由于我忘了先将底层的原理介绍一下,语音聊天室是基于OMCS实现的,那么这里我就补上OMCS中与多人语音视频相关部分的原理及方案的介绍。

一. 动态组  

  OMCS採用“动态组”的模式来实现多人语音/视频聊天组,所谓“动态组”,就是在执行时动态创建和销毁的组,其包括例如以下几层意思:

(1)当某个用户要增加一个不存在的动态组时,OMCSserver会首先自己主动创建这个组,然后,再把用户放进这个组。

(2)当用户退出组、或掉线时,OMCSserver会将该用户从相应的组中移除。

(3)当某个组中的最后一个人退出时,OMCSserver会销毁这个组。

  在服务端,这一切都是自己主动完毕的,我们不须要额外编写代码。

 

二. OMCS.Passive.MultiChat 命名空间

  在client,OMCS.Passive.MultiChat命名空间提供:IChatGroupEntrance接口、IChatGroup接口、IChatUnit类,通过这三个元素,我们便能够使用OMCS提供的对多人语音/视频聊天组的功能了。

1. IChatGroupEntrance

  IChatGroupEntrance 是client使用多人语音/视频组的入口

复制代码
    /// <summary>
    /// 语音视频聊天组入口。
    /// </summary>
    public interface IChatGroupEntrance
    {
        /// <summary>
        /// 增加某个聊天组。假设目标组不存在,将自己主动创建目标组。
        /// </summary>
        /// <param name="chatType">聊天组的类型。</param>
        /// <param name="chatGroupID">目标组ID。</param>      
        IChatGroup Join(ChatType chatType ,string chatGroupID);

        /// <summary>
        /// 离开聊天组。假设掉线,也会自己主动从聊天组中退出。
        /// </summary>
        /// <param name="chatType">聊天组的类型。</param>
        /// <param name="chatGroupID">目标组ID。</param>     
        void Exit(ChatType chatType, string chatGroupID); 
    }
复制代码

  OMCS将语音聊天组和视频聊天组是分开管理的,它们使用ChatType枚举来进行区分:

复制代码
    /// <summary>
    /// 聊天组的类型。
    /// </summary>
    public enum ChatType
    {
        /// <summary>
        /// 语音聊天组。
        /// </summary>
        Audio = 0,
        /// <summary>
        /// 视频聊天组。
        /// </summary>
        Video
    }
复制代码

(1)我们能够通过OMCSclient的核心组件 -- 多媒体管理器IMultimediaManagerChatGroupEntrance属性获取到聊天组入口的引用。 

(2)当调用IChatGroupEntrance 的Join方法增加某个聊天组,方法会返回一个IChatGroup引用,它代表了目标聊天组。

(3)语音聊天组和视频聊天组的ID能够同样,可是因为它们的类型(ChatType)不同,所以,它们仍然是不同的两个组。

(4)当调用Exit方法主动退出聊天组时,OMCS内部会自己主动释放该组内部持有的全部多媒体连接器实例(这些连接器实例位于即将介绍的IChatUnit内)。 

2. IChatGroup

  IChatGroup封装了一个聊天组的相关信息,其定义例如以下:

复制代码
    /// <summary>
    /// 封装一个聊天组的信息。
    /// </summary>
    public interface IChatGroup
    {
        /// <summary>
        /// 当有新成员增加聊天组时,将触发此事件。
        /// </summary>
        event CbGeneric<IChatUnit> SomeoneJoin;

        /// <summary>
        /// 当某成员掉线或离开聊天组时,触发此事件。
        /// </summary>
        event CbGeneric<string> SomeoneExit;

        /// <summary>
        /// 聊天组的ID。
        /// </summary>
        string GroupID { get; }

        /// <summary>
        /// 聊天组的类型。假设为语音聊天,则DynamicCameraConnector为null。
        /// </summary>
        ChatType ChatType { get; }       /// <summary>
        /// 获取组成员的信息。
        /// </summary> 
        IChatUnit GetMember(string memberID);

        /// <summary>
        /// 获取组内除自己之外的其他成员的信息。
        /// </summary>
        List<IChatUnit> GetOtherMembers();        
    }
复制代码

(1)当有人增加或退出当前组时,IChatGroup会自己主动触发SomeoneJoin、SomeoneExit事件。

(2)GetOtherMembers方法将返回组内其他成员的信息,每一个成员都相应着一个IChatUnit实例。 

3.IChatUnit

  IChatUnit 主要是封装了与目标组成员相关的麦克风连接器、摄像头连接器。

复制代码
    /// <summary>
    /// 用于封装聊天组一个成员的相关信息的单元。
    /// </summary>
    public interface IChatUnit
    {
        /// <summary>
        /// 相应的组成员的ID。
        /// </summary>
        string MemberID { get; }

        /// <summary>
        /// 是否有效?假设相应的组成员退出组或者掉线,则将返回false。
        /// </summary>
        bool Valid { get; }

        /// <summary>
        /// 摄像头连接器。(可将其连接到相应组成员的摄像头)。假设为语音聊天,则DynamicCameraConnector为null。
        /// </summary>
        DynamicCameraConnector DynamicCameraConnector { get; }

        /// <summary>
        /// 麦克风连接器。(可将其连接到相应组成员的麦克风)
        /// </summary>
        MicrophoneConnector MicrophoneConnector { get; }     
    }
复制代码

(1)特别注意:在通过IChatGroup获取到的IChatUnit时,其DynamicCameraConnector和MicrophoneConnector属性所代表的摄像头连接器及麦克风连接器都还没有与目标设备建立联系

   我们须要手动调用其BeginConnect方法,连接到该聊天成员的摄像头和麦克风设备。

   同一时候,我们也能够预定其DynamicCameraConnector和MicrophoneConnector的种种事件和查看其种种属性,就像我们使用自己new的连接器组件一样。

   而其实也是:IChatUnit 不过帮我们实例化了一下连接器组件而已,除此以外再没有做其他的不论什么动作。

(2)当组成员退出组或者掉线时,OMCS会自己主动断开IChatUnit中的连接器到目标设备的连接,而且将Valid属性设置为false。

 

三. 怎样使用

  如果我们要开发一个视频会议的系统,在这个系统中,登录的用户能够输入一个视频会议房间的RoomID,便能够增加该视频会议。那么,实现的步骤大致例如以下:

1. 初始化多媒体管理器IMultimediaManager。

2. 调用IMultimediaManager的IChatGroupEntrance属性的Join方法,把RoomID传进去。便会返回一个IChatGroup引用。

3. 遍历IChatGroup的GetOtherMembers方法返回的集合中的每一个IChatUnit:

(1)为之创建一个UI控件,绑定到ChatUnit的DynamicCameraConnector,以显示成员的视频。

(2)预定IChatUnit的DynamicCameraConnector和MicrophoneConnector的相关事件,以获取所需的通知。

(3)调用IChatUnit的DynamicCameraConnector和MicrophoneConnector的BeginConnect方法,与该成员的设备进行连接。

4. 预定IChatGroup的SomeoneJoin、SomeoneExit事件。

(1)处理SomeoneJoin事件时,可与第3点一样。

(2)处理SomeoneExit事件时,仅仅需在UI上将退出的成员相应的视频显示控件移除掉。

5. 当自己要退出视频会议时,调用IMultimediaManager的IChatGroupEntrance属性的Exit方法就可以。 

四. 扩展

  OMCS内置的使用“动态组”模式对语音视/频聊天组的支持,不过最核心的支持,它只封装了最纯粹的逻辑。假设须要实现更复杂的自己定义业务逻辑,那就须要基于OMCS做很多其它的开发。

  继续上面的样例,我们如果增加视频会议之前,须要先提交一个申请,在管理员批准之后,才干正式增加到视频会议中。那么类似这种业务需求单靠OMCS提供的API是无法实现的。

  那么怎么做了?

  我们能够在外围利用类似ESFramework等通信技术实现这一业务逻辑,详细步骤可參考例如以下:

(1)当用户输入了视频会议的房间号,并点击“申请增加”button时,client通过ESFramework发一条消息给在线的该视频会议的管理员。

(2)管理员所在的client收到请求消息后,在UI上弹出一个询问框,管理员点击“允许”button时,当前client就发送一条回复消息给申请的用户。

(3)申请的用户收到允许的回复后,就能够调用IMultimediaManager的IChatGroupEntrance属性的Join方法,来继续第三点中叙述的流程了。


OK,OMCS中对多人语音视频支持的部分介绍就到这里,大家如今再来看实现一个简单的语音聊天室(多人语音聊天系统)的源代码,应该就非常easy理解了。,

C#实现多人语音聊天

阅读数 11800

没有更多推荐了,返回首页