编辑: GXB156399820 | 2019-12-24 |
一、训练目的 一个 综合性训练 .
以适应培养 富有创新精神、知识面宽、能力强、综合素质高 的专业人才的需要. 用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........