本文旨在展示如何将多种技术融合在一起,创造出一个有趣的应用。这个项目最初是为了学位项目而提交的,本文是原始项目的简化版本。原始项目的代码量太大,无法提交到代码项目网站上。
这个应用程序分为两个部分:服务器应用(ServerApp)和客户端应用(ClientApp)。服务器应用托管了一个微软媒体播放器控件、一个曲目列表,以及一个自定义的控件,用于管理内置的媒体库。客户端应用则托管了一个曲目列表和一些按钮,用于控制服务器应用中的媒体播放器,它也托管了一个自定义控件,用于管理内置的媒体库。
显而易见,希望服务器应用安装在一台具有音频功能的机器上,而客户端应用则安装在另一台机器上,用于控制服务器应用的音乐播放。服务器应用将连接到一个立体声音响,客户端应用可以提供远程控制曲目列表给服务器应用,并按需播放不同的歌曲。客户端还可以执行停止、快退、快进等操作,这些操作将在服务器应用的电脑上执行。
实现这一功能使用了以下技术:
由于在开发原始代码时希望能够独立测试代码的部分,因此代码主要由自定义控件组成,因此有很多不同的项目,当压缩后,它太大了,不符合代码项目网站的指南。如果仍然感兴趣,已经把所有的代码放在了一个zip文件中。
如果使用的是从这里下载的zip文件,只需解压缩这两个文件,然后运行安装程序。安装完成后,首先启动服务器应用,然后启动客户端应用。
如果使用的是代码项目网站上的代码,可以在Visual Studio 2003中打开服务器应用/客户端应用解决方案,然后从Visual Studio内部构建并运行它们。
让看看它是什么样子的。
服务器应用包含两个自定义控件(如果感兴趣,可以查看代码项目网站上的Re_Mp3代码),这些是媒体播放器控件和媒体库控件。
媒体播放器控件使用了嵌入式的微软媒体播放器控件。该控件提供以下功能:
注意:微软媒体播放器控件不支持完整的UNC路径,所以不得不使用像\\NODE\DRIVE\DIRECTORY\FILE这样的格式,例如\\BUDHA01\D$\MP3's\Buzzcocks - singles going steady。这种方法的一个缺点是,两台机器需要为用户希望与两个Re_Mp3应用程序一起使用的任何驱动器提供默认的管理员共享。例如,在主PC的D:\驱动器上存储音乐,所以必须确保D$是可访问的,同样,在笔记本电脑的C:\上存储所有音乐,所以必须确保C$在笔记本电脑上是可访问的。知道这是一个很大的麻烦,但这是能够使用微软媒体播放器控件的唯一方法。一个更好的方法是使用DirectSound。也许有人想要进一步发展这个项目,可以替换服务器应用使用的嵌入式媒体播放器控件,用一个基于DirectSound的自定义控件。
媒体库控件使用微软Access数据库存储所有记录的音乐。该控件提供以下功能:
日志记录有点巧妙,每次应用程序启动时都会进行新的扫描,以查看在数据库中已经保存的文件系统路径下是否存在新文件。如果发现新条目,它们将被添加到库中。这就像有一个文件系统监视器,而不需要应用程序一直运行。
由于客户端应用程序用于控制服务器应用程序播放的音乐,它需要知道服务器的位置。为此,它有一个初始屏幕,列出了当前网络中的所有网络计算机(参见另一篇),用户可以从中选择一个。如果客户端可以与所选地址的服务器建立联系,将显示主客户端界面,否则客户端应用程序将退出。
一旦成功加载,客户端包含两个自定义控件(如果感兴趣,可以查看代码项目网站上的Re_Mp3代码),这些是客户端曲目列表控件和媒体库控件。
客户端曲目列表控件提供以下功能:
以下屏幕截图显示了这种控制操作,当前服务器应用的曲目在客户端端也是加粗显示的。这种远程控制完全是通过标准的.NET Remoting技术完成的。
与服务器应用中使用的控件相同。
好了,除了下面要展示的几件需要注意的事情。
由于这个项目使用了.NET remoting,防火墙可能需要知道这两个应用程序,所以当它询问时,请接受这两个项目作为允许的项目。
由于这个项目使用了皮肤,使得安装程序只适用于Windows XP及以上版本的Windows。
微软媒体播放器控件不支持完整的UNC路径,所以不得不使用像\\NODE\DRIVE\DIRECTORY\FILE这样的格式,例如\\BUDHA01\D$\MP3's\Buzzcocks - singles going steady。这种方法的一个缺点是,两台机器需要为用户希望与两个Re_Mp3应用程序一起使用的任何驱动器提供默认的管理员共享。例如,在主PC的D:\驱动器上存储音乐,所以必须确保D$是可访问的,同样,在笔记本电脑的C:\上存储所有音乐,所以必须确保C$在笔记本电脑上是可访问的。知道这是一个很大的麻烦,但这是能够使用微软媒体播放器控件的唯一方法。一个更好的方法是使用DirectSound。也许有人想要进一步发展这个项目,可以替换服务器应用使用的嵌入式媒体播放器控件,用一个基于DirectSound的自定义控件。