编辑: GXB156399820 2019-12-24
网络歌曲在线播放系统(VC)

一、训练目的 一个 综合性训练 .

以适应培养 富有创新精神、知识面宽、能力强、综合素质高 的专业人才的需要. 用Visual C++软件开发工具,开发一个基于网络的应用小系统. 做出在一个在线播放的系统

二、训练仪器、设备 一台PC,配置要求见上. 1. 硬件 PC系列微型计算机,包括XT、AT、

586、奔腾及各种兼容机,要求CPU处理器P4 1.2G以上,内存为256MB以上,一个硬盘驱动器(1G剩余硬盘空间),一个软盘驱动器,网卡及其相关必备设备.

2、 软件 Windows 9X以上版本或者Linux 内核4.2.2以上的操作系统. VC6.0及以上版本.

三、训练原理 在Visual C++开发工具中,采用Socket网络连接技术,实现在线播放网络歌曲的简要功能,且进行相应的操作.

四、训练过程 调查;

看过题目之后,我觉得我将做三个界面来实现在线播放系统的各种功能.我将用到所学的Socket网络连接技术和后来在书上看到的播放音频格式的一些函数 决定作出以下的流程图 2. 概要的设计;

首先要做的就是MP3界面,此界面是一个可以播放MP3格式文件的工具.然后是采用Socket网络连接技术,做出SERVER,CLIENT两个界面来实现文件的传输,由于只有一台PC,所以过程就是SERVER在本PC选择到要发送的文件,然后将发送的文件能下载到CLIENT所在的文件夹中. 3. 详细设计 (1)MP3界面 这是我做的MP3的界面,它包括五个按键,OPEN,PLAY,PAUSE,STOP,EXIT,和一条下沉的静态文本 OPEN 用来将接受到的歌曲文件放到这个要播放器中 PLAY播放接受到的文件 PAUSE暂停播放 暂停后再次点击PAUSE可以在原来暂停处继续往下播放 STOP停止播放 EXIT退出当前的MP3界面 在实现这些功能的时候,我将用到MCIWnd媒体控制接口.MCIWnd是Windows 95提供的基于 MCI的窗口类.MCIWnd并不属于 MFC,因此在VC++中利用MCIWnd进行编程,首先应包含头文件VFW.H. 然后我们就可以利用MCIWnd窗口对象提供了可靠的方法对媒体播放进行控制. 首先在类的头文件中申明一些变量和函数 CStatic m_Status;

用来在静态的文本上显示文字 CButton m_Play;

CButton m_Pause;

CString m_Path;

这个是用来表示获得文件的路径 afx_msg void OnExit();

afx_msg void OnStop();

afx_msg void OnPause();

afx_msg void OnPlay();

afx_msg void OnOpen();

HWND m_Audio;

窗口句柄 BOOL Pause;

实现Exit 思路是:按Exit按纽的时候,如果窗口句柄存在就调用Destroy销毁窗口然后调用ONOK 否则直接退出 HCURSOR CMp3PlayerDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon;

} void CMp3PlayerDlg::OnExit() { if(m_Audio !=NULL) { MCIWndDestroy(m_Audio);

OnOK();

} CDialog::OnCancel();

} 实现Stop 思路是:按Stop按纽的时候,在静态文本中显示Selection Stoped 首先用MCIWndStop停止正在播放的文件,如果窗口句柄存在就调用Destroy销毁窗口.再将窗口还原为有用,以至下次可以继续使用 void CMp3PlayerDlg::OnStop() { MCIWndStop(m_Audio);

if(m_Audio !=NULL) { MCIWndDestroy(m_Audio);

m_Status.SetWindowText(_T( Selection Stoped ));

} m_Play.EnableWindow(TRUE);

} 实现Pause 思路是:按Pause按纽的时候,在静态文本中显示Selection Pause 在暂停与播放间轮流的,实现的时候,先要判断之前的状态再选择的调用MCIWndResume,MCIWndPause void CMp3PlayerDlg::OnPause() { if(Pause) { m_Pause.SetWindowText( Pause );

//m_Pause对应的控件的值 MCIWndResume(m_Audio);

//返回到你暂停的位置并重新开始 Pause = FALSE;

//设置Pause 的值啊 否则下次按Pause 的时候会有问题 m_Status.SetWindowText(_T( Selection Paused ));

} else { m_Pause.SetWindowText( Pause );

MCIWndPause(m_Audio);

Pause = TRUE;

} } 实现Play 思路是:按Play按纽的时候,在静态文本中显示Playing... 如果m_Audio为空就创建一个窗口 否则退回文件开始处 然后再调用MCIWndPlay来播放文件 设置好Pause和m_Play.EnableWindow的初值 void CMp3PlayerDlg::OnPlay() { if(m_Audio == NULL) { m_Audio = MCIWndCreate(this->

GetSafeHwnd(),// 获得父窗口 AfxGetInstanceHandle(),//获得当前实例句柄 WS_CHILD | WS_VISIBLE|MCIWNDF_NOMENU,//窗口样式 m_Path);

// m_Path 文件路径 m_Status.SetWindowText(_T( Playing... ));

} else { MCIWndHome(m_Audio);

}// MCIWndPlay(m_Audio);

Pause = FALSE;

m_Play.EnableWindow(TRUE);

} 实现Open 思路是:CFileDialog mp3(TRUE,NULL,NULL,OFN_HIDEREADONLY, MP3 Files (*.mp3)|*.mp3| );

这句话代表选择MP3文件.然后通过函数获得文件路径,从而用可以用函数PLAY来播放 void CMp3PlayerDlg::OnOpen() { m_Audio = NULL;

if(m_Audio == NULL) { CFileDialog mp3(TRUE,NULL,NULL,OFN_HIDEREADONLY, MP3 Files (*.mp3)|*.mp3| );

//选择MP3文件 if(mp3.DoModal() == IDOK) { m_Path = mp3.GetPathName();

UpdateData(FALSE);

}// } } (2) server 和client界面 由于这两个界面是相连的来传输文件的,而且我们在教学的时候也是一起来教的,所以这两个界面一起来分析. server界面 我做的SERVER界面只有一个功能就是选择要传输的文件,并和CLIENT相连 首先申明一个文件的结构体 typedef struct _SOCKET_STREAM_FILE_INFO { TCHAR szFileTitle[128]文件的标题名 DWORD dwFileAttributes;

文件的属性 FILETIME ftCreationTime;

文件的创建时间 FILETIME ftLastAccessTime;

文件的最后访问时间 FILETIME ftLastWriteTime;

文件的最后修改时间 DWORD nFileSizeHigh;

文件大小的高位双字 DWORD nFileSizeLow;

文件大小的低位双字 DWORD dwReserved0;

保留,为0 DWORD dwReserved1;

保留,为0 } SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;

要用的 afx_msg void OnButtonLicsen();

实现 发送文件 思路是:包括三部分,判断是否有要传输的文件,判断CLIENT端是否有要接受文件,发送文件 1.判断是否有要传输的文件,是通过PATH,看是否有文件的路径来寻找,若不存在则显示不存在,存在的话继续往下 CFile myFile;

if(!myFile.Open(Dlg.GetPathName(), CFile::modeRead | CFile::typeBinary)) { AfxMessageBox( 文件不存在! ,MB_OK|MB_ICONERROR);

return;

} 2.判断CLIENT端是否有要接受文件, sockSrvr.Listen();

3.选择并发送文件 FindClose(FindFirstFile(Dlg.GetPathName(),&

FindFileData));

// 释放FindFirst操作所申请的内存资源 memset(&

StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));

strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());

复制 StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes;

StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime;

StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;

StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;

StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;

StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow;

sockRecv.Send(&

StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));

UINT dwRead=0;

while(dwReadEnableWindow(FALSE);

else GetDlgItem(IDC_BUTTON_SEND)->

EnableWindow(TRUE);

实现 接受 思路是:包括两部分,判断是否连接,接受文件 判断是否连接 if(!sockClient.Connect((LPCTSTR)szIP, 800)) { AfxMessageBox( 连接到对方机器失败! );

return;

} 接受文件 SOCKET_STREAM_FILE_INFO StreamFileInfo;

sockClient.Receive(&

StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));

CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);

UINT dwRead = 0;

while(dwReadLoadIcon(IDR_MAINFRAME);

} void CMp3PlayerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMp3PlayerDlg) DDX_Control(pDX, IDC_Status2, m_Status);

DDX_Control(pDX, ID_Play, m_Play);

DDX_Control(pDX, ID_Pause, m_Pause);

//}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMp3PlayerDlg, CDialog) //{{AFX_MSG_MAP(CMp3PlayerDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(ID_Exit, OnExit) ON_BN_CLICKED(ID_Stop, OnStop) ON_BN_CLICKED(ID_Pause, OnPause) ON_BN_CLICKED(ID_Play, OnPlay) ON_BN_CLICKED(ID_Open, OnOpen) //}}AFX_MSG_MAP END_MESSAGE_MAP() // CMp3PlayerDlg message handlers BOOL CMp3PlayerDlg::OnInitDialog() { CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically // when the application'

s main window is not a dialog SetIcon(m_hIcon, TRUE);

// Set big icon SetIcon(m_hIcon, FALSE);

// Set small icon // TODO: Add extra initialization here return TRUE;

// return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MF........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题