微型计算机接口技术大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微型计算机接口技术大作业
学院(系):软件学院
专业:软件工程
班级:
姓名:
学生学号:
电话:
2011年6月5日
P2P语音聊天工具
一、程序简介
程序实现了文字聊天和语音聊天,程序即可以作为服务器端侦听其他用户的连接请求,也可以作为客户端主动连接其他用户。程序使用了Win32 API提供的用于多媒体服务的函数接口,主要涉及波形音频设备的相关内容。
程序主要分为四个模块:
1.主程序模块(消息处理和界面控制)
2.负责接收连接的服务器Socket模块
3.负责接收和发送数据的客户端模块
4.声卡数据的采集和播放模块
二、流程图
主模块流程图:
负责接收连接的服务器Socket模块:
负责接收和发送数据的客户端模块:
声卡数据的采集和播放模块流程图:
三、代码实现
代码主要是用MFC对话框程序框架编写的,对于界面上的控件和消息传递的部分,此处略去,仅仅给出主要程序的代码。
主模块代码:
//初始化端口号、聊天消息框和输入框
CExample2_ChatRoomDlg::CExample2_ChatRoomDlg(CWnd* pParent /*=NULL*/) : CDialog(CExample2_ChatRoomDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CExample2_ChatRoomDlg)
m_sInputString = _T(""); //输入框
m_sShowString = _T(""); //聊天消息框
m_uPort = 4000; //端口号
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
//初始化服务器IP地址(默认设置为本机的IP地址)
BOOL CExample2_ChatRoomDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
if(AfxSocketInit(NULL)==0)
{
AfxMessageBox("CSocketInital Error");
}
BYTE f0,f1,f2,f3;
CString name;
CClientSocket::GetLocalHostName(name); //获取本机名
CClientSocket::GetIpAddress(name,f0,f1,f2,f3); //获取本机IP
//设置服务器IP为本机IP
((CIPAddressCtrl *)(GetDlgItem(IDC_IPADDRESS)))->SetAddress(f0,f1,f2,f3);
m_bInit=false;
m_bClient=false;
m_willchating=TRUE;
return TRUE;
}
//显示主窗体
BOOL CExample2_ChatRoomApp::InitInstance()
{
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
CExample2_ChatRoomDlg dlg; //创建窗体实例
m_pMainWnd = &dlg;
intnResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
return FALSE;
}
//对于用户更改聊天窗口内容的判断
void CExample2_ChatRoomDlg::OnInputText()
{
if(!m_bInit) //如果用户还没有连接就输入聊天内容,提示用户先连接
{
AfxMessageBox("还没有连接到服务器!");
return;
}
//如果用户按下Enter按钮,且焦点在输入窗口中,则对当前聊天室中的所//有用户发送消息
CString in;
CMessgmsg;
GetDlgItemText(IDC_INPUTTEXT,in);
if(in.GetLength()<1){return;} //如果用户没有输入内容,返回
if(in.GetAt(in.GetLength()-1)=='\n')
{
in.TrimRight(" ");
SetDlgItemText(IDC_INPUTTEXT,"");
if(in.GetLength()>2)
{
m_sMsgList+=in;
SetDlgItemText(IDC_SHOWTEXT,m_sMsgList);
Intm_iLineCurrentPos=((CEdit
*)(GetDlgItem(IDC_SHOWTEXT)))->GetLineCount();
((CEdit
*)(GetDlgItem(IDC_SHOWTEXT)))->LineScroll(m_iLineCurrentPos);
msg.m_strText=in;
if(!m_bClient)
{
POSITION pos;
for(pos=m_connectionList.GetHeadPosition();pos!=NULL;)
{ //循环遍历所有建立连接的用户,分别发送消息
CClientSocket * t= (CClientSocket *)m_connectionList.GetNext(pos);
t->SendMessage(&msg);
}
}
else
{
m_clientsocket.SendMessage(&msg);
}
}
}
}