yifeng's profile私人空间PhotosBlogListsMore Tools Help

Blog


    August 01

    Wedding Dresses, Bridesmaid Gowns and Accessories from O-kiss.com

    Bridesmaid Gowns and Accessories from O-kiss.com
    All the dresses are unique,7-15days elaborate customizing.
    Prom Dress - (4-8   Days Shipping Time)very Lower SHIPPING!!
    Wedding Dresses - (3- 6  Days Shipping Time)FREE SHIPPING!!
    Bridesmaid Dresses - (4-7 Days Shipping Time)FREE SHIPPING!!
    Magnificent Mother of the Bride Dresses - (5-9  Days Shipping Time)FREE SHIPPING!!
    Fabulously cute Flower Girl Dresses - (4-6  Days Shipping Time)FREE SHIPPING!!
    Breathtaking Quinceanera Dresses ...plus hundreds of other wonderful Special Event

    July 01

    N久没有在空间上丢点字了,今天听歌颇有感触!

    让我们干了这杯酒,好男儿胸怀像大海,经历了人生百态世间的冷暖,这笑容温暖天真..。。。。。
                                                              ------------来自许巍的歌“曾经的你“
    也许他唱的和我理解的意境不一样,但是我有着不同的感触!过去的一年是对我改变很大的一年,无论是对人还是对事情对人生理解。。
     
    特做个记号!!!!!!!!!!!!!!!!!!
     
    看不明白吧? 嘿嘿!
    July 25

    .net分布系统的学习心得与体会

           做系统概算也有差不多3年的时间了,从开始的delphi->pb->再至现在的.net开发,.各类的系统都做过了,其中分布式系统也做了不少了,之前的delphi开发分布系统的做法就不说了,现在就.net开发分布系统的方法方式简单的总结下:
          .net开发分布式应用程序主要通常通过采用以下的两种方法实现, 当然这两中方式各有利弊,我在后面会有论述:
    1. 第一种方法实现是采用目前比较时髦的WebService技术,这种方法可以做到突破不同操作系统的界限限制,可以在互联网上的任意点上建立客户端,客户端通过引用WebService创建实例,从而可以方便的调用里面的方法等来实现client端需要的一些逻辑处理功能,使用非常发方便。
    2. 第二种方法采用的remoting技术实现的,从字面理解就可以看出其是远程对象的使用,使用方法同上上者从表面上来说几乎没什么区别,都是可以很方便的实现分布式系统的,但是从其中的本质上来说就有着很大的区别.
          WebService和remoting上技术本质以及使用范围以及执行效率来说各有利弊,使用时候可以按需而采用合适的方法, WebService是基与http协议进行通信的,可以不用考虑任何技术上的实现就可以很轻松的跨越放火墙穿越网络障碍进行数据库交换处理。Remoting是通过调用远程对象实现的,他可以通过几种方式实现,有基于tcp协议的tcp方式,对应的还有http的通信方式,它是通过注册通道的方式进行使用的。
          平时我们做的项目大都是三层或四层结构的应用程序,在分层的时候大可以使用上面两种技术的其中一种来构建自己的应用程序,使用它来构建自己的逻辑处理层,实现瘦可户端的程序,那么在选择的时候究竟要选好哪一种方式呢?需要注意的地方有以下几点:
    1. Webservice主要面向的对象是internet,因为他是基于http协议的,所以不宜用于那些处理数据量大而且操作频繁和要求相应速度非常及时的系统中,但是它可以很轻松的穿透网络的放火墙跨越各类异种系统等障碍进行提供服务,客户端程序只要知道他的引用接口就行了,可以在最大的程度上面向internet提供服务,劣势是它的速度过分依赖于网络速度,就像我们上网打开网页一样。
    2. Remting就不同,他主要面向的对象是局域网,因为他可以通过tcp进行通信,使用他进行数据库通信的时候几乎就像是在访问本机资源一样快,但是他使用的时候会别webservice稍微麻烦些,但是如果需要它访问的internet资源的话就会需要比较多的技术处理了。所以如果服务是面向整个internet最好还是选择webservice的方式,如果系统需要很严格的权限限制的话,可以在webservice端加上口令验证即可.

                         方

    July 11

    找回自我!

          这几天老婆家里出了点事,弄的大家都烦,她的的脾气也变的暴躁,可能是情绪的问题吧,而我也因为种种原因,有点"不务正业"了,发现不是以前的我了,堕落了很多,所要做的一切都变的松散,以前每天都坚持学的english都没怎么去理睬, 反而做别的闲事较多了,现在回头看下最近这段时间的生活,还真有点羞愧,所以特地做一标记,以督促自己前行!
         不因工作而耽误身体,不因玩物而丧志,文武之道,一张一驰!
    May 26

    我和老婆的点滴二

       萃!我最爱的人,最近因为工作忙,没有余下时间去陪陪她,让她一个人在家闷呆(因为她辞职了),有点对不住她,以后一定多抽时间去陪陪老婆,好想念以前一起上下班的时候,~~~ 什么时候,什么事情都不能十全十美,就这样过吧,我相信挺过这段时间就会好起来的!
    April 11

    委托的用法

      usercontrols:里面写法如下:
      public delegate void ButtonClickHandler();
     public event ButtonClickHandler ButtonClick;
      form1里面定义时间:
      this.usercontrols.ButtonClick += new UserControl.UserMngControls.UserLogin.ButtonClickHandler(this.usercontrols _ButtonClick);
      private void userLogin1_ButtonClick()
      {
       MessageBox.Show(this.userLogin1.MReturn.ToString());
      }  
     
     

    统c盘的fat32文件系统转ntfs格式的命令

    Convert c:/FS:NTFS/V
    开始->运行..
    适用于xp,2000,2003得windows系统
    有得时候需要设置后重启才可以转的,大家如果如有需要可以看看~~~

    今天由于开发的需要,系统c盘的fat32文件系统转ntfs格式的命令用法~
    February 25

    遇到的webserver的问题:主题:WebException: 请求因 HTTP 状态 401 失败:Unauthorized 错误


    单击开始,指向管理工具,然后单击Internet 信息服务 (IIS)。
    展开“* 服务器名称”(其中服务器名称 为该服务器的名称),右键单击Web 站点,然后单击属性。
    在Web 站点属性 对话框中,单击目录安全性 选项卡。
    在“身份验证和访问控制”下,单击编辑。
    单击“启用匿名访问”复选框,将其选中。

    备注:“用户名”框中的用户帐户只用于通过 Windows guest 帐户进行匿名访问。

    默认情况下,服务器会创建并使用帐户 IUSR_computername。匿名用户帐户密码仅在Windows 中使用;匿名用户不使用用户名和密码登录。
    在“已验证身份的访问”下,单击“集成的 Windows 身份验证”复选框,将其选中。
    单击确定 两次。
    January 04

    如何取消windows XP登录框,让其自动登录

    在Windows XP中单击“开始→运行” 输入 rundll32 netplwiz.dll,UsersRunDll 或者 control userpasswords2 (注意大小写及空格),然后进入“用户账户”操作窗口 取消对“要使用本机,用户必须输入用户名及密码”项的选择。 在接下来弹出的对话框中输入你想让电脑每次自动登录的账户名及其密码。
    December 08

    2个页面间不通过Session与url的传值方式。

    Chuandi(传递)是名字空间

    WebForm1:
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" Inherits="chuandi.WebForm1" %>
    <HTML>
     <HEAD>
      <title>WebForm1</title>
     </HEAD>
     <body>
      <form id="Form1" method="post" runat="server">
       <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
       <asp:Button id="Button1" runat="server" Text="传"></asp:Button>
      </form>
     </body>
    </HTML>
    using System;
    namespace chuandi
    {
     public class WebForm1 : System.Web.UI.Page
     {
      protected System.Web.UI.WebControls.TextBox TextBox1;
      protected System.Web.UI.WebControls.Button Button1;
      public string Text1
      {
       get
       {
        return this.TextBox1.Text;
       }
      }
      private void Page_Load(object sender, System.EventArgs e)
      {}
      override protected void OnInit(EventArgs e)
      {
       InitializeComponent();
       base.OnInit(e);
      }
      private void InitializeComponent()
      {   
       this.Button1.Click += new System.EventHandler(this.Button1_Click);
       this.Load += new System.EventHandler(this.Page_Load);
      }
      private void Button1_Click(object sender, System.EventArgs e)
      {
       Server.Transfer("WebForm2.aspx");
      }
     }
    }


    WebForm2:
    <%@ Page language="c#" Codebehind="WebForm2.aspx.cs" Inherits="chuandi.WebForm2" %>
    <%@ Reference Page="WebForm1.aspx" %>
    <HTML>
     <HEAD>
      <title>WebForm2</title>
     </HEAD>
     <body>
      <form id="Form1" method="post" runat="server">
       <asp:Label id="Label1" runat="server">Label</asp:Label>
       <asp:Button id="Button1" runat="server" Text="返回"></asp:Button>
      </form>
     </body>
    </HTML>
    using System;
    namespace chuandi
    {
     public class WebForm2 : System.Web.UI.Page
     {
      protected System.Web.UI.WebControls.Button Button1;
      protected System.Web.UI.WebControls.Label Label1;
      public chuandi.WebForm1 wf1;
      private void Page_Load(object sender, System.EventArgs e)
      {
       if(!IsPostBack)
       {
        wf1=(chuandi.WebForm1)Context.Handler;
        Label1.Text="上页传来的是:"+wf1.Text1;
       }
      }
      override protected void OnInit(EventArgs e)
      {
       InitializeComponent();
       base.OnInit(e);
      }
      private void InitializeComponent()
      {   
       this.Button1.Click += new System.EventHandler(this.Button1_Click);
       this.Load += new System.EventHandler(this.Page_Load);
      }
      private void Button1_Click(object sender, System.EventArgs e)
      {
       Server.Transfer("WebForm1.aspx");
      }
     }

    在密码输入框内按回车就登陆的功能(ASP.Net)

    方法一 :

    <head>
    <SCRIPT language="JavaScript">
    <!--//
    function sub()
    {
     if(event.keyCode == 13)
     {
      LoginForm.BtnLogin.focus();       //LoginForm是form的id,BtnLogin是登录按钮的id
      LoginForm.BtnLogin.click();
     }
    }
    //-->
      </SCRIPT>
     </HEAD>

    如果想在任何时候按回车都提交就在body里加<body onkeydown="sub();">

    如果只想在密码框内,就在后台cs里加txtPassword.Attributes.Add("onkeydown","sub();">);就可以了

    方法二:

    直接在

    <asp:textbox ................. onkeypress="javascript:....">

    这样加就可以了... 虽然写的时候,出现下划线,看起来有语法错,,但实际用的却是一样的.....

    能不在.CS里面写的,就尽量不要在里面写了..修改起来不便,,,,而且性能上也..#%#@%!@#^!#@^....

    我平时就是

    onkeypress="if(window.event.keycode==13)document.xform.submit();"

    September 24

    网页中添加音乐

    第一种方法:
    <div align="center"><object classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" height="46" width="200">
            <param name="_ExtentX" value="4895">
            <param name="_ExtentY" value="1217">
            <param name="AUTOSTART" value="-1">
            <param name="SHUFFLE" value="0">
            <param name="PREFETCH" value="0">
            <param name="NOLABELS" value="0">
            <param name="SRC" value="歌曲所在地址">
    如:http://musicdown.gz365.net/SALENMP3OK/zjl-dfp.mp3
    http://music.happy895.com/qita/d/000007.wma
            <param name="CONTROLS" value="controlpanel,statusbar">
            <param name="LOOP" value="20">
            <param name="NUMLOOP" value="0">
            <param name="CENTER" value="0">
            <param name="MAINTAINASPECT" value="0">
            <param name="BACKGROUNDCOLOR" value="#000000">
          </object></div>

    第二种方法:
    <bgsound src="歌曲所在地址" loop="-1">
    如:http://musicdown.gz365.net/SALENMP3OK/zjl-dfp.mp3
    http://music.happy895.com/qita/d/000007.wma

    第三种方法:
    <embed src="歌曲所在地址" quality=high width=270 height=50 nojava=true controls=ControlPanel console=one autostart=false loop=true>
    </embed>

    其他代码:
    <div align=center><object id="mplayer" width="460" height="68" classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"
    codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" align="baseline" border="0" standby="Loading Microsoft Windows Media Player components..."
    type="application/x-oleobject">
        <param name="FileName" value="歌曲地址">
        <param name="ShowControls" value="1">
        <param name="ShowPositionControls" value="0">
        <param name="ShowAudioControls" value="1">
        <param name="ShowTracker" value="1">
        <param name="ShowDisplay" value="0">
        <param name="ShowStatusBar" value="1">
        <param name="AutoSize" value="0">
        <param name="ShowGotoBar" value="0">
        <param name="ShowCaptioning" value="0">
        <param name="AutoStart" value="1">
        <param name="PlayCount" value="0">
        <param name="AnimationAtStart" value="0">
        <param name="TransparentAtStart" value="0">
        <param name="AllowScan" value="0">
        <param name="EnableContextMenu" value="1">
        <param name="ClickToPlay" value="0">
        <param name="InvokeURLs" value="1">
        <param name="DefaultFrame" value="datawindow">
        <embed src="歌曲地址"
     align="baseline" border="0" width="460" height="68"
            type="application/x-mplayer2"
            pluginspage=http://www.microsoft.com/isapi/redir.dll?prd=windows&sbp=mediaplayer&ar=media&sba=plugin&
            name="MediaPlayer" showcontrols="1" showpositioncontrols="0"
            showaudiocontrols="1" showtracker="1" showdisplay="0"
            showstatusbar="1"
            autosize="0"
            showgotobar="0" showcaptioning="0" autostart="1" autorewind="0"
            animationatstart="0" transparentatstart="0" allowscan="1"
            enablecontextmenu="1" clicktoplay="0" invokeurls="1"
            defaultframe="datawindow">
        </embed>
    </object></div>

    如何架设流媒体服务器(转贴)

    一、前言

      随着越来越多的朋友开始选择ADSL、Cable Modem或FTTB+ LAN作为首要的上网方式,宽频时代即将到来,这使我们“宽频 KTV、影音聊天室、线上电影院、远程教育”的梦想即将成为现实,而与其密切相关的“流媒体(Streaming Media)”也成了许多人谈论的热门话题,因为“流媒体”正是实现这些宽频应用的技术动力。

      宽频时代的到来还使得网民们不再满足于仅仅作为一项服务的受众,他们需要更大规模的交流,从中体现个体的价值,因此,许多朋友开始用自己的计算机,搭建网络广播和点播站点。他们充满着满腔的热情,但不可否认的是,中国网民先天技术上的不足,让他们在建设这样的站点时遇到重重险阻,以至于放弃。如何将这种热情在技术的引导下成为动力,这正是我们家用电脑所要做的,所以,在今天,在这里,我就将给大家介绍如何打造属于自己的流媒体服务器。

      不过,在开始正式的流媒体服务器架设之前,请让我们先了解一下流媒体服务器的基础知识。

    二、流媒体基础知识

      什么是流媒体?

      目前,在网络上传输音/视频等多媒体信息有两种解决方案,即http或ftp下载以及流式传输。

      http或ftp下载使用标准的http和ftp协议,但由于多媒体信息个头巨大,下载一个多媒体文件一般需要几分钟或几小时的时间,这就造成为了看一个并不知道内容的视频,首先需要耗费可能比整个视频都要长的时间来完成下载。这些被下载的文件还必须在下载前制作完成,放在网络服务器上,这样造成的直接后果就是:网络带宽不断提高,人们下载的等待时间越来越少,但最终还是不能观看网上现场直播。

      流式传输时,声音、影像或动画等多媒体信息由流媒体服务器向用户计算机连续、实时传送,它首先在使用者端的电脑上创建一个缓冲区,于播放前预先下载一段资料作为缓冲,用户不必等到整个文件全部下载完毕,而只需经过几秒或十数秒的启动延时即可进行观看。当多媒体信息在客户机上播放时,文件的剩余部分将在后台从服务器内继续下载。如果网络连接速度小于播放的多媒体信息需要的速度时,播放程序就会取用先前建立的一小段缓冲区内的资料,避免播放的中断,使得播放品质得以维持。

      流式传输除了能够发送已经制作完成的文件外,还可以通过采集服务器实时采集现场音视频,推送到流媒体服务器端,实时提供给用户。因此,流媒体除了能够更好的承担如下载一样的多媒体点播服务外,更能够应用在现场直播、电视转播、突发事件报道等多种对实时性传输要求较高的领域。

      有关流媒体的厂商

      流媒体的市场巨大,世界上许多优秀的厂商都加入此行列,现阶段更是系统集成商竞争的风水宝地。而在通用市场上,竞争的公司主要有三个:Microsoft、RealNetworks、Apple,而相应的产品就是:Windows Media、Real Media、QuickTime。而近来,以开发Winamp著名的Nullsoft公司也在自己的MP3服务器中加入了视频支持,欲在流媒体市场分一杯羹。

      由于Apple的服务器和编辑软件一般都以Mac为操作平台,Nullsoft的流媒体服务器属于新生不成熟事务,所以今天在这里我主要给大家介绍一下Microsoft和RealNetworks的产品。

      流媒体的传输协议

      大家在观看网上电影或者电视时,一般都会注意到这些文件的连接都不是用http或者ftp开头,而是一些rtsp或者mms开头的东西,为什么是这样呢?实际上,这些和http和ftp一样,都是数据在网络上传输的协议,只是它们是专门用来传输流式媒体的协议而已。下面,让我们来看一下现在使用的主要的流媒体协议:

      1. RTSP(Real Time Streaming Protocol),实时流媒体协议,它是由RealNetworks和Netscape共同提出的,现在用于RealNetworks的Real Media产品中;

      2. PNM(Progressive Networks Audio),这也是Real专用的实时传输协议,它一般采用UDP协议,并占用7070端口,但当你的服务器在防火墙内且7070端口被挡,且你的服务器把SmartingNetwork设为真时,则采用http协议,并占用默认的80端口;

      3. MMS(Microsoft Media Server protocol),这是微软的流媒体服务器协议,MMS 是连接 Windows Media 单播服务的默认方法。

      介绍了主要的三个,可能您还会问,Apple的QuickTime使用哪种协议呢?在多数情况下,QuickTime使用http协议,但实际上它也由标准的流媒体传输协议,这就是标准RTSP协议,而Real公司使用的RTSP是自己经过开发的。

      在流媒体传输中,标准的协议就是RTP(Real time Transport Protocol,实时传输协议)、RTCP(Real-time Transport Control Protocol,实时传输控制协议)、RTSP(Real Time Streaming Protocol,实时流媒体协议)和RSVP(Resource Reserve Protocol, 资源预订协议),厂商们的产品都是在这些协议的基础上进行研究与开发,限于篇幅,在这里我们就不再深入讨论了。

      流媒体文件和发布格式

      有了实时的传输协议,我们应该还能够想到,只有较小的文件才适合网络实时传输,那么,流媒体文件采用了什么样的压缩算法呢?

      而使用Windows操作系统的朋友可以看到,我们观看网上流节目时,它们的后缀名一般是rm、asf、wmv等,这些就是流媒体的格式。流媒体文件格式经过特殊编码,不仅采用较高的压缩比,还加入了许多控制信息,使其适合在网络上边下载边播放,而不是等到下载完整个文件才能播放。

      常见的流媒体格式大致有以下几种:

      流媒体文件格式扩展(Video/Audio) 媒体类型与名称
      asf               Advanced Streaming format. (Microsoft).
      rm               Real Video/Audio 文件 (Progressive Networks).
      ra               Real Audio 文件 (Progressive Networks).
      rp               Real Pix 文件 (Progressive Networks).
      rt               Real Text 文件 (Progressive Networks).
      swf               Shock Wave Flash (Macromedia).
      mov               QuickTime(Apple公司格式)
      viv               Vivo Movie 文件(Vivo Software).

      另外还有一个wmv格式,是Windows Media Video的简称,它与asf文件有稍许区别,wmv一般采用window media video/audio 格式,asf视频部分一般采用Microsoft MPG4 V(3/2/1?),音频部分是windows media audio v2/1,不过现在很多制作软件都没有把它们分开,所以直接更改后缀名就能够互相转换为对方格式。

      制作完成的流媒体文件需要发布到网络上才能够被别人使用,这就需要以特定方式安排压缩好的流媒体文件,而安排流媒体文件的格式就被成为流媒体发布格式。常见的发布格式主要有以下几种:

      流媒体发布格式扩展 媒体类型和名称
      asf        Advanced Streaming format.
      smil        Synchronised Multimedia Integration Language.
      ram        RAM File.
      rpm        Embedded RAM File.
      asx        ASF Stream Redirector/ASF流转向器文件
      xml        eXtensible Markup Language

      MPEG-4与流媒体

      说到流媒体就不能不提及MPEG-4。MPEG-4是当前讨论的焦点之一,只因为它能够在大的压缩比下实现近似DVD品质的视频和音频效果,这也是许多朋友认为MPEG-4格式肯定比rm清晰的原因。但事实上并不是如此,MPEG-4只是一种视频编码技术,它的清晰度也根据压缩时所选择的码率的不同有较大的改变(我们见到的MPEG-4格式文件通常为500Kbps压缩生成,质量当然高了),并且,MPEG-4还有多种压缩标准,如Microsoft的asf视频部分就是基于MPEG-4的Discrete Cosine Transform (DCT),另外还有DivX的免费MPEG-4版本(开始是破解微软的格式而来)。至于音频部分,更是混乱,Microsoft采用windows media audio v2/1,DivX采用MP3或者更高质量的AC3等。相比而言,Real或者Apple的格式使用的是自己开发的编码,在相同码率,特别是低码率下,不见得就比MPEG-4差,采取高码率的rm格式照样清晰可人,所以大家以后说rm格式清晰度差的观念要改变一下:),至少也要加上条件。而且,最新的Helix Producer中的Real Video 9采用VP5压缩格式进行编码,这可比DivX优秀多了!

      不过,流媒体服务器开始向MPEG-4格式靠拢是不争的事实,Real最新的Helix就开始支持mp4格式文件的服务,而RealOne Player更是只需安装一个插件便可实现MPEG-4格式的播放。

      点播与广播

      在架设流媒体服务器之前,我们一定要了解一些点播与广播的知识。

      点播是客户端与服务器之间的主动的连接,在点播连接中,用户通过选择内容项目来初始化客户端连接,一个客户端从服务器接收一个媒体流(这个连接是唯一的,其它用户不能占用),并且能够对媒体进行开始、停止、后退、快进或暂停等操作,客户端拥有流的控制权,就像在看影碟一样。这种方式由于每个客户端各自连接服务器,服务器需要给每个用户建立连接,对服务器资源和网络带宽的需求都比较大。

      广播指的是用户被动接收流。在广播过程中,客户端接收流,但不能控制流,用户不能暂停、快进或后退该流,广播使用的数据发送手段有单播与广播。使用单播发送时,服务器需要将数据包复制多个拷贝,以多个点对点的方式分别发送到需要它的那些用户,而使用广播方式发送,数据包的单独一个拷贝将发送给网络上的所有用户,而不管用户是否需要,上述两种传输方式会非常浪费网络带宽和服务器资源,因此产生了组播(多播)技术。

      组播(多播)吸收了上述两种发送方式的长处,克服了上述两种发送方式的弱点,将数据包的单独一个拷贝发送给需要的那些客户,组播不会复制数据包的多个拷贝传输到网络上,也不会将数据包发送给不需要它的那些客户,保证了网络上多媒体应用占用网络的最小带宽。但组播不仅需要服务器端支持,更需要有多播路由器乃至整个网络结构的支持。

      单播与组播(多播)

      在上面我们已经了解了一些单播和组播的概念,这也是现在流媒体方面讨论的焦点之一。以我的认识,点播与广播是一组概念,它们和客户端媒体交互的手段;单播和组播又是另外一组概念,它们是流媒体数据在服务器端和网络上的传输方式。

    单播发送时,需要在客户端与媒体服务器之间需要建立一个单独的数据通道,从一台服务器送出的每个数据包只能传送给一个客户机,每个用户必须分别对媒体服务器发送单独的查询,而服务器必须向每个用户发送所申请的数据包拷贝。这种巨大冗余会造成服务器沉重和网络带宽的沉重负担,响应需要很长时间,甚至出现不能服务的情况。单播可以用在点播和广播上。

      组播发送时,服务器将一组客户请求的流媒体数据发送到支持组播技术的路由器上,然后由路由器一次将数据包根据路由表复制到多个通道上,再向用户发送。这时候,媒体服务器只需要发送一个信息包,所有发出请求的客户端都共享同一信息包,并且信息可以发送到任意地址的客户机,没有请求的客户机不会收到信息包,网络上传输的信息包的总量没有广播那么多,大大提高了服务器和网络线路的利用率。不过组播也有自己的特点,首先是必须要开始支持组播技术的路由器,另外就是一般只能用作广播,因为用作点播会存在用户控制问题。

      好了,说了这么多,您可能都嫌我烦了,那么,就让我们开始架设流媒体服务器之旅吧。

    三、流媒体服务器硬件准备

      流媒体服务器和网站(Web)服务器一样,要经受许多人的同时访问,相比Web服务器来说,由于多媒体文件需要更强处理能力,其硬件设备应超越一般用于Web的服务器。所以,流媒体服务器最好满足以下硬件条件。

    一颗强劲的“芯”。如果计算机CPU频率太低,处理能力过慢,电脑在被多用户访问时将我们无法进行其他任何操作(相信大家对那些网上视频点播的网站经常当机身有体会,我们和他们建立的是一样的服务器,只是规模小些罢了)。
    大容量内存和硬盘。流媒体的制作和发送是系统资源的黑洞,拥有大容量内存是系统稳定运行的前提;而流媒体文件体积较大,大量的媒体文件需要更多的存储空间。建议内存至少256MB,硬盘80G以上。

    占用系统资源少的声卡。好的声卡有助于CPU占用率的降低,并且对录音的质量有很大影响(用于网上直播),建议使用Creative的SB Live!或SB Audigy、Audigy 2系列,由于笔者自己的机器不做服务器(只用来做文章,没钱升级啊),所以只拿普通的集成来演示。
    良好的视频捕捉设备。我们的直播节目源就来源于这块设备,推荐使用Leadtek(丽台)的WinFast TV2000 XP豪华版,它接收信号的能力和硬件压缩的能力都是比较出众的(因为笔者没有条件,所以采集设备用了屏幕捕捉,不过使用采集设备的方法是相同的,所以请大家不要见怪)。

    尽量高的带宽。当然是上网速度越快越好,不过我们可以在流媒体服务器中对连接数做一个限制,以免当机。

      当然,上面是建设一个属于自己的流媒体服务网站必须的硬件设备,如果只是和笔者一样,只是想在架设流媒体服务器过程中学习一把,大可在现有机器的基础上大胆测试。

    四、架设流媒体服务器之旅

      准备好了硬件,下面就开始一步步教大家架设自己的流媒体服务器。我将其分为Microsoft公司的Windows Media和RealNetworks的Real Media两大部分,都包括直播与点播服务器的建立,并在最后向大家介绍一下Apple的QuickTime和Nullsoft的流媒体服务器。

      由于Microsoft公司的Windows Media点播服务必须建立在Server版的操作系统上,所以笔者选取Windows .Net Enterprise Server 3647作为此次流媒体服务器建立的系统平台。为了比较RealNetworks和Microsoft最新一代流媒体服务器的优劣,笔者采用了它们最新的流媒体系统,以下是笔者使用的具体软件:

      操作系统:Windows .Net Enterprise Server 3647、Windows XP Service Pack 1
      流媒体软件:Windows Media Services 9.0(Windows .Net Server自带)、Windows Media Encoder 9 Series Release Candidate(由于此软件在.Net Server下运行不正常,故安装在XP中,并且只有此软件安装在XP中)、Windows Media Encoder 7.1、Windows Media Player 9.0 Build z903、Helix Universal Server 9.01 FOR Win2k(9.0.2.794)、Helix Producer Plus 9.0.1、RealOne Player 2.0 Build 6.0.11.853。

      下面,就让我们开始吧!不要走开哦!!!

    WinMedia网上广播服务

      单纯的使用Windows Media Encoder这个软件即可实现网上广播服务,不过,借助于Windows Media Services,利用Windows Media Encoder制作的流媒体文件,我们的网络广播站功能将更为强大。下面,我们将利用Windows Media Encoder单独建立广播站,并将其纳入Windows Media Services,实现更强大的功能。

      1. 安装Windows Media Services。

      首先安装Windows 2000 Server或者Windows .Net Server,然后打开“开始-控制面板-管理工具-管理您的服务器”或“开始-控制面板-添加或删除程序-添加/删除Windows组件”(建议使用第二种),在其中勾取“Web应用程序服务器”,也就是2000 Server中的IIS服务器,单击“下一步”进行添加;

    添加IIS完毕后,再次启动添加/删除Windows组件程序,并勾取Windows Media Service项,单击详细信息,在其中选择“用于Web的Windows Media Services Administrator”以启动Windows Media Services的Web管理功能(2000中可能没有这些选项,只需要安装Windows Media Services即可);

      2. 安装Windows Media Encoder。

      从微软网站下载Windows Media Encoder 7.1(由于Windows Media Encoder 9.0无法在.Net Server下工作)进行安装,至此,Windows Media服务的服务器和编码器都已经具备;

      3. 从“开始-程序-Windows Media”  启动Windows Media Encoder,在出现的向导界面中根据自己的需要选择合适的选项,建议新手“使用新建会话向导广播、捕获或转换文件”,选择后单击确定;

    4. 由于进行的是广播,所以在下一个弹出的画面中请选择“在附属设备或计算机屏幕广播实况事件”,这样的选择能够让Windows Media Encoder直接进行广播或者将其加入Windows Media Service服务;

    5. 在下一个画面中选择您进行视频或音频捕获的设备,笔者没有视频卡,所以只能选择“屏幕捕获”,有视频卡的朋友请选择您的视频卡;

      6. 广播信号必须通过一个有效的端口进行传输,因此必须对它进行设置。Windows Media Encoder默认的端口为8080,但由于这个端口经常被其它软件占用,所以建议朋友们单击“查找可用端口”以换成其它随机端口或者直接输入没有被占用的端口。我选择了“3170”端口;

      7. 然后就开始选择我们进行广播的流媒体质量,有一个公式您可以参考:流媒体配置文件带宽×最大连接用户数=您的上行带宽(不是下载,是上传)。您如果有2Mbps的上行带宽,选择了100Kbps的配置文件,则允许同时20个观众看到您的广播,由此可见,流媒体服务对带宽的需求是巨大的;

      8. 在这个窗口您可以选择将进行广播的流媒体存档,以便于以后观看或者进行点播,若只是作为实况广播服务,并且硬盘空间不大,您可以不选取;

      9. “下一步”后,您可以选择是不是添加微软内置的欢迎、休息和再见文件,我就没要这些东西,谁给微软免费作广告,呵呵;

      10. 然后,我们可以给我们的广播节目添加上版权信息,这些信息在播放时,会出现在Windows Media Player中;

      11. 弹出最后一个确认窗口后,我们最终的广播界面就出现了,若是有视频捕捉设备,只要单击“开始”,我们的广播站就运行起来,只要在客户机IE中输入“mms://服务器的:端口值”就会弹出media player播放电视。如我建立的广播站地址就是“mms://192.168.0.1:3170,这些信息您也可以直接在此界面的连接标签中查看;

      12. 若是您和我一样没有视频捕捉设置,或者想向用户播放一段录制好的视频,请点击“会话-属性”(此面板能够对所有设置过的数据进行调整),单击“更改”按钮,在弹出窗口中选择视频右边的下拉框,单击“查找文件”,找到您预先录制好的视频文件(支持asf、wmv、avi、mpg等格式);

    13. 再回到广播界面,点击开始,您的文件就可以被网络上的兄弟姐妹看到了,

      若是想添加更多的文件或设备,请在以上窗口单击“更改”旁的“新建”进行添加即可;

      14. 您可能觉得到这里我们就大功告成了,实际上远远没有,这只是最基本的直播广播,我们还需要将其加入Windows Media Services的广播服务中,以实现更强大的功能。请将你的鼠标指向“开始-控制面板-管理工具-Windows Media Services”,打开Windows Media管理器(2000 Server应该是一个Web界面)。选择左边的服务器后,单击操作菜单中的“添加发布点(向导)”,经历欢迎页面后,会出现发布点命名窗口,在其中输入您愿意使用的名字,我输入的是“SOFTICP.COM_Broadcast”;

      15. 在下一个窗口中,将让您选择所要发布的内容类型,如果只是单纯的进行流媒体直播,就选择“编码器(实况流)”,若是想在实况流中加入其它制作好的文件,请选择“播放列表”,若是想建立视频点播服务器,请选择“目录中的文件”。由于我有现成的制作好的文件,所以选择了“播放列表”;

      16. 选择完了发布内容的类型,就要选择发布的方案,我们进行的是网络广播的服务,当然要选择“广播发布点”。在接下来的窗口中,我们要选择内容的传递方式,看到了吧,这次我们前面介绍的单播和组播的基本概念起了作用,我们的网络一般不支持组播,所以要选择“单播”;

      17. 若是您以前有创建好的播放列表文件(wsx或htm文件),直接在下一个窗口中选择“现有播放列表”,若是没有,请跟我一样,“新建播放列表后进行添加”。在添加窗口中,可以添加文件、编码器的实况流、远程发布点的流媒体、ASP、CGI的动态源等多种媒体,并且还可以添加广告信息以及调整媒体的播放顺序;

      18. 完成播放列表的编辑后,点击“下一步”将播放列表保存成文件,并且在下一个窗口中可以选择是否“循环播放”或“无序播放”这些流媒体。再经历几个确认框,您就完成了Windows Media流媒体广播服务器的建立,为了快捷,我们就将“完成此向导后启动其它向导”前面的对勾去掉吧!

      19. 服务器启动后,您就可以在Windows Media Player中输入“mms://服务器IP/发布点名称”观看网络广播了。而在Windows Media Services的管理器中,我们可以随时监视流媒体的播放情况、添加/删除与调整播放列表、插入广告、发布公告(可以直接生成htm页面)、调整该广播站的属性等操作,并可以随时通过下面的按钮启动与停止广播站以及测试当前流媒体是否正常;


      此图是使用公告向导建立的发布点公告网页,是不是非常方便?

      20. 我们还可以通过在浏览器中输入管理器的网址或者直接启动管理工具中的“Windows Media Services(Web)”来对整个流媒体服务器进行Web管理以及远程管理,其管理界面与本地管理除了少几个功能外,几乎没有差别。

      远程管理还可以对一个服务器组多台服务器进行管理。

      至此,我们的Windows Media网络广播服务器已经完全建设完毕,您已经拥有了一个具有强大功能的网络广播站,是不是觉得不过瘾?因为还有许多优秀的影片想和朋友们共享,并且想让他们能够自由的观赏自己喜欢的节目,不受你广播时间表的限制?那么,跟我来,我们在此基础上再搭建一个Windows Media视频点播服务器。

    关于Web设计、开发中window对象的资料

    What is "window" ?

    window 代表浏览器中一个打开的窗口。

    Window的属性

     

    属性 描述
    closed 获取引用窗口是否已关闭。
    defaultStatus 设置或获取要在窗口底部的状态栏上显示的缺省信息。
    dialogArguments 设置或获取传递给模式对话框窗口的变量或变量数组。
    dialogHeight 设置或获取模式对话框的高度。
    dialogLeft 设置或获取模式对话框的左坐标。
    dialogTop 设置或获取模式对话框的顶坐标。
    dialogWidth 设置或获取模式对话框的宽度。
    frameElement 获取在父文档中生成 window 的 frame 或 iframe 对象。
    length 设置或获取集合中对象的数目。
    name 设置或获取表明窗口名称的值。
    offscreenBuffering 设置或获取对象在对用户可见之前是否要先在屏幕外绘制。
    opener 设置或获取创建当前窗口的窗口的引用。
    parent 获取对象层次中的父窗口
    returnValue 设置或获取从模式对话框返回的值。
    screenLeft 获取浏览器客户区左上角相对于屏幕左上角的 x 坐标。
    screenTop 获取浏览器客户区左上角相对于屏幕左上角的 y 坐标。
    self 获取对当前窗口或框架的引用。
    status 设置或获取位于窗口底部状态栏的信息。
    top 获取最顶层的祖先窗口。

     

    Window的事件
    事件 描述
    onactivate 对象设置为活动元素时触发。
    onafterprint 对象所关联的文档打印或打印预览后立即在对象上触发。
    onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即触发。
    onbeforeprint 对象的关联文档打印或打印预览前在对象上触发。
    onbeforeunload 在页面将要被卸载前触发。
    onblur 对象失去输入焦点时触发。
    oncontrolselect 当用户将要对该对象制作一个控件选中区时触发。
    ondeactivate activeElement 从当前对象变为父文档其它对象时触发。
    onerror 对象装载过程中发生错误时触发。
    onfocus 对象获得焦点时触发。
    onhelp 当用户在浏览器为当前窗口时按 F1 键时触发。
    onload 在浏览器完成对象的装载后立即触发。
    onmove 对象移动时触发。
    onmoveend 对象停止移动时触发。
    onmovestart 对象开始移动时触发。
    onresize 对象的大小将要改变时触发。
    onresizeend 当用户更改完控件选中区中对象的尺寸时触发。
    onresizestart 当用户开始更改控件选中区中对象的尺寸时触发。
    onscroll 当用户滚动对象的滚动条时触发。
    onunload 对象卸载前立即触发。

    window的集合
    集合 描述
    frames 获取给定文档定义或与给定窗口关联的文档定义的所有 window 对象的集合。

    window的方法
    方法 描述
    alert 显示包含由应用程序自定义消息的对话框。
    attachEvent 将指定函数绑定到事件,以便每当该事件在对象上触发时都调用该函数。
    blur 使元素失去焦点并触发 onblur 事件。
    clearInterval 使用 setInterval 方法取消先前开始的间隔事件。
    clearTimeout 取消先前用 setTimeout 方法设置的超时事件。
    close 关闭当前浏览器窗口或 HTML 应用程序(HTA)。
    confirm 显示一个确认对话框,其中包含一个可选的消息和确定取消按钮。
    createPopup 创建弹出窗口。
    detachEvent 从事件中取消指定函数的绑定,这样当事件触发时函数就不会收到通知了。
    execScript 以给定语言执行指定的脚本。
    focus 使得元素得到焦点并执行由 onfocus 事件指定的代码。
    moveBy 将窗口的位置移动指定 xy 偏移值。
    moveTo 将窗口左上角的屏幕位置移动到指定的 xy 位置。
    navigate 在当前窗口中装入指定 URL。
    open 打开新窗口并装入给定 URL 的文档。
    print 打印与窗口关联的文档。
    prompt 显示一个提示对话框,其中带有一条消息和一个输入框。
    resizeBy 更改窗口的当前位置缩放指定的 x 和 y 偏移量。
    resizeTo 将窗口的大小更改为指定的宽度和高度值。
    scroll 将窗口滚动到自左上角起指定的 x 和 y 偏移量。
    scrollBy 将窗口滚动 x 和 y 偏移量。
    scrollTo 将窗口滚动到指定的 x 和 y 偏移量。
    setActive 设置对象为当前对象而不将对象置为焦点。
    setInterval 每经过指定毫秒值后计算一个表达式。
    setTimeout 经过指定毫秒值后计算一个表达式。
    showHelp 显示帮助文件。此方法可用于 Microsoft HTML 帮助。
    showModalDialog 创建一个显示指定 HTML 文档的模式对话框。
    showModelessDialog 创建一个显示指定 HTML 文档的非模式对话框。

    window的对象
    对象 描述
    clientInformation 包含关于 Web 浏览器的信息。
    clipboardData 提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用。
    document 代表给定浏览器窗口中的 HTML 文档。
    event 代表事件状态,如事件发生的元素,键盘状态,鼠标位置和鼠标按钮状态。
    external 允许访问由 Microsoft® Internet Explorer 浏览器组件宿主应用程序提供的附加对象模型。
    history 包含了用户已浏览的 URL 的信息。
    location 包含关于当前 URL 的信息。
    navigator 包含关于 Web 浏览器的信息。
    screen 包含关于客户屏幕和渲染能力的信息。

    SQL Server 中系统表的作用

    sysaltfiles             主数据库 保存数据库的文件
    syscharsets         主数据库 字符集与排序顺序
    sysconfigures      主数据库 配置选项
    syscurconfigs      主数据库 当前配置选项
    sysdatabases     主数据库 服务器中的数据库
    syslanguages     主数据库 语言
    syslogins             主数据库 登陆帐号信息
    sysoledbusers    主数据库 链接服务器登陆信息
    sysprocesses     主数据库 进程
    sysremotelogins主数据库 远程登录帐号
    syscolumns        每个数据库 列
    sysconstrains     每个数据库 限制
    sysfilegroups      每个数据库 文件组
    sysfiles                每个数据库 文件
    sysforeignkeys   每个数据库 外部关键字
    sysindexs             每个数据库 索引
    sysmenbers        每个数据库 角色成员
    sysobjects           每个数据库 所有数据库对象
    syspermissions 每个数据库 权限
    systypes               每个数据库 用户定义数据类型
    sysusers              每个数据库 用户

    .Net里一个用于驱动摄像头的类 [转]

    using System;
      using System.Runtime.InteropServices;
      using System.Drawing;
      using System.Drawing.Imaging;

      namespace using System;
      using System.Runtime.InteropServices;
      using System.Drawing;
      using System.Drawing.Imaging;

      namespace PickHead
      {
      /**//// <summary>
      /// 一个控制摄像头的类
      /// </summary>
      public class Pick
      {
      private const int WM_USER = 0x400;
      private const int WS_CHILD = 0x40000000;
      private const int WS_VISIBLE = 0x10000000;
      private const int WM_CAP_START = WM_USER;
      private const int WM_CAP_STOP = WM_CAP_START + 68;
      private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
      private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
      private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
      private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
      private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
      private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
      private const int WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63;
      private const int WM_CAP_SET_OVERLAY =WM_CAP_START+ 51;
      private const int WM_CAP_SET_PREVIEW =WM_CAP_START+ 50;
      private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
      private const int WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
      private const int WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
      private const int WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
      private const int WM_CAP_SET_SCALE=WM_CAP_START+ 53;
      private const int WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52;
      private IntPtr hWndC;
      private bool bStat = false;
      
      private IntPtr mControlPtr;
      private int mWidth;
      private int mHeight;
      private int mLeft;
      private int mTop;
      
      /**//// <summary>
      /// 初始化摄像头
      /// </summary>
      /// <param name="handle">控件的句柄</param>
      /// <param name="left">开始显示的左边距</param>
      /// <param name="top">开始显示的上边距</param>
      /// <param name="width">要显示的宽度</param>
      /// <param name="height">要显示的长度</param>
      public Pick(IntPtr handle, int left, int top, int width,int height)
      {
      mControlPtr = handle;
      mWidth = width;
      mHeight = height;
    mLeft = left;
      mTop = top;
      }

      [DllImport("avicap32.dll")]
      private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
      
      [DllImport("avicap32.dll")]
      private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize );
      [DllImport("User32.dll")]
      private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam);

      /**//// <summary>
      /// 开始显示图像
      /// </summary>
      public void Start()
      {
      if (bStat)
      return;
      
      bStat = true;
      byte[] lpszName = new byte[100];
      
      hWndC = capCreateCaptureWindowA(lpszName,WS_CHILD|WS_VISIBLE ,mLeft,mTop,mWidth,mHeight,mControlPtr,0);

      if (hWndC.ToInt32() != 0)
      {
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
      SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
      SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
      }

      return;

      }

      /**//// <summary>
      /// 停止显示
    /**//// </summary>
      public void Stop()
      {
      SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
      bStat = false;
      }

      /**//// <summary>
      /// 抓图
      /// </summary>
      /// <param name="path">要保存bmp文件的路径</param>
      public void GrabImage(string path)
      {
      
      IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
      SendMessage(hWndC,WM_CAP_SAVEDIB,0,hBmp.ToInt64());

      }

      /**//// <summary>
      /// 录像
      /// </summary>
      /// <param name="path">要保存avi文件的路径</param>
      public void Kinescope(string path)
      {
      IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
      SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0,hBmp.ToInt64());
      SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
      }

      /**//// <summary>
      /// 停止录像
      /// </summary>
      public void StopKinescope()
      {
      SendMessage(hWndC, WM_CAP_STOP, 0, 0);
      }

      }
      }

    September 19

    Asp.net运行环境

    这是系统要求:要安装Asp.net运行环境,请按顺序安装以下软件: IE6.0 sp1 中文版下载地址: http://download.microsoft.com/download/ie6sp1/finrel/6_sp1/W98NT42KMeXP/CN/ie6setup.exe MDAC2.8 中文版下载地址: http://download.microsoft.com/download/8/b/6/8b6198c0-fe96-4811-9d81-d5c76dd5fea8/MDAC_TYP.EXE .Net Framework 1.1 可再发行组件包下载地址: http://download.microsoft.com/download/7/b/9/7b90644d-1af0-42b9-b76d-a2770319a568/dotnetfx.exe .Net SDK 1.1 中文正式版下载地址: http://download.microsoft.com/download/0/f/e/0fecf85c-fb50-4ca9-adf2-c4be7ec9b454/setup.exe .Net Framework 1.1 sp1 for win2000 http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=A8F5654F-088E-40B2-BBDB-A83353618B38 .Net Framework 1.1 sp1 for win2003 http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=AE7EDEF7-2CB7-4864-8623-A1038563DF23
    September 07

    sql server数据库定时自动备份

    对于服务器数据的备份是比较麻烦的事情,如果每天或者经常要手工去备份自然是很痛苦的事情。这里我介绍一种通过sql server的作业调度来建立自动备份的方法:
    1、进入企业管理器中->管理->sql server代理->作业;
    2、新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;
    3、点击步骤标签,进入步骤面板。新建步骤,步骤名可以随便填写,如步骤1,类型和数据库默认,不需要修改。命令中写入以下语句:
    BACKUP DATABASE [数据库名] TO  DISK = N'F:\data\数据库备份' WITH  NOINIT ,  NOUNLOAD ,  NAME = N'数据库 备份',  NOSKIP ,  STATS = 10,  NOFORMAT
    注意:需要修改的地方,数据库名,DISK=(这里需要填写路径和你的数据库备份的名称)后面的Name=可以随便填写。
    4、点击调度标签,进入调度面板,新建调度,名称随便填写,选择反复出现,点更改可以选择你想要执行任务的随意调度。如每天,每2天,每星期,每月等。根据需要自己设置;
    5、确定后,不要忘记一件事情,在你刚才建立的工作上点右键,启动工作,如果你的工作没有问题,将会提示执行成功,并有相对应的备份文件在你的磁盘上出现;
    6、还有一个重要的问题就是你的sql server agent服务器已经启动。

    如果我们需要根据每天的日期来生成一个新的备份,以便我们区别备份文件。这时,我们需要修改一下刚才的sql语句。参考实例: declare @filename nvarchar(100) set @filename='F:\AddIn\备份\data'+convert(char(10),getdate(),112) print @filename BACKUP DATABASE [addin] TO DISK = @filename WITH NOINIT , NOUNLOAD , NAME = N'addin 备份', NOSKIP , STATS = 10, NOFORMAT 如果大家还有问题,希望大家留言与我交流。

    基于角色的权限设计

      在任何系统中,权限设计是最基础的东西,本文给出一个基于角色的权限设计的循序渐进的设计方案。

      在权限系统中,功能(权限)是最小的单位,比如起草新闻、编辑新闻、审核新闻、删除新闻等,而角色是一类功能的集合,比如新闻编辑这个角色,他可能有起草新闻、编辑新闻等功能集合,而责任编辑他可能就有更多的权限,比如除了新闻编辑的功能,还有审核新闻、删除新闻等功能,给张三赋予新闻编辑的角色(其实我更愿意说把张三加入到新闻编辑这个角色中去),张三就可以起草新闻、编辑新闻了,给李四赋予责任编辑的角色,李四就可以起草新闻、编辑新闻、审核新闻、删除新闻了。

      我们来看看版本一的解决方案:


     

      我们来模拟一下上面的数据:

      用户信息表:

    UserID

    UserName

    U1

    张三

    U2

    李四

      角色表:

    RoleID

    RoleName

    R1

    新闻编辑

    R2

    责任编辑

      角色用户表:

    RoleID

    UserID

    R1

    U1

    R2

    U2

      功能表:

    FunctionID

    FunctionName

    F1

    起草新闻

    F2

    编辑新闻

    F3

    审核新闻

    F4

    删除新闻

      角色功能表:

    RoleID

    FunctionID

    R1

    F1

    R1

    F2

    R2

    F1

    R2

    F2

    R2

    F3

    R2

    F4

      我们来看看如何判断一个用户具有某个功能权限:

      首先在用户张三登录的时候,获取张三的全部功能列表:

    Select FunctionID From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)

      这样就可以得到张三的全部功能列表Functions,在起草新闻的页面我们就可以做如下判断:

    Functions.Contain(‘F1’);//当然你可以把这个’F1’定义成一个常量:NewsFunction.Draft

      如果为true就说明张三有起草新闻的权限。

      当然对于web应用,您可以把Functions session保存起来,以避免每打开一个页面都去数据库中获取。

      似乎看起来是一个不错的解决方案。

      还是新闻系统,最初新闻系统没有分类,但是随着新闻的增加,没有分类的新闻看起来总是乱的,于是张三和李四给新闻添加了分类A、分类B,还是由张三负责起草,李四负责审核,以后又添加了更多的分类,并且也增加了人手,这个时候就有新的要求出来了:希望张三只负责分类A的起草,分类B的起草交给其他人做,李四呢也只负责分类A的审核(就相当于是一个栏目的责任编辑)。

    针对这样的需求,版本一就无能为力了(当然你也可以增加几个功能:比如分类A的新闻起草和分类B的新闻起草,再把这个功能添加到相应的角色里面去,但是这个应该不是我们要得解决方案吧,不过版本二也是基于这个思想来解决的)。

    其实比新闻更好的例子是论坛板块的版主。

    下面是版本二的解决方案:


    在版本二的功能表中加入了一个
    ResourceType这个字段,这个字段用来表示对某个资源的分类(比如新闻),我们同样来模拟一下(新闻分类AResourceType为:NTA,分类B为:NTB):

    功能表:

    FunctionID

    ResourceType

    FunctionName

    F1

    NTA

    起草新闻:分类A

    F2

    NTA

    编辑新闻:分类A

    F3

    NTA

    审核新闻:分类A

    F4

    NTA

    删除新闻:分类A

    F1

    NTB

    起草新闻:分类B

    F2

    NTB

    编辑新闻:分类B

    F3

    NTB

    审核新闻:分类B

    F4

    NTB

    删除新闻:分类B

    然后在角色表添加相应的角色,在角色功能表中添加对应的功能。

    获取Functions的语句也相应地做变化:

    Select FunctionID  + ‘,’ + ResourceType From 角色功能表 Where RoleID In (Select RoleID From 用户角色表 Where UserID=’U1’)

    权限的判断也就变成:

    Functions.Contain(‘F1,NTA’);

    在新添加一个分类的时候,同时也在功能表中增加相应的记录(当然不是在数据库里面直接添加,由和功能相关的函数来添加)。

    使用这种解决方案可以简单地对有分类的应用(比如论坛系统)的每个分类实行不同的控制(比如VIP板块,就只能拥有VIP角色的用户才能浏览、发表等,而其他板块只要是注册用户就可以使用了)。

    在实际应用中FunctionID并不是随便的一个字符串,而是进行了编码,其编码中包含了模块ID以及能够体现出父子关系,举个例子来说:对于论坛系统,我们给它一个模块ID”30”,论坛的功能我们先分成2类,一类是管理类(比如删除帖子),一类是使用类(比如发帖、回帖、浏览帖子等),给管理类一个编码:01,使用类一个编码:02,我们就对FunctionID进行如下的编码:

    300101:删除帖子

    300201:发帖

    300202:回帖

    300203:浏览帖子

    对于资源(比如某个板块1,板块的ID为:01),我们可以组合出如下的Functions(当然这个组合你也可以不用逗号分隔,用其他的组合方式也可以,不过不要产生歧义):

    300101,01:板块1删除帖子的功能

    300201,01:板块1发帖的功能

    ……

        对于RoleID也是采用的编码方式,也能体现角色的父子关系,也可以实现角色功能的继承等(当然获取角色功能列表的SQL语句就不是现在这么简单了)。在我现在的应用里面没有实现角色的继承(虽然角色的编码体现出了角色的父子关系)。