微型计算机接口技术大作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

}

}

}

相关文档
最新文档