局域网聊天软件源代码包括语音聊天.docx
《局域网聊天软件源代码包括语音聊天.docx》由会员分享,可在线阅读,更多相关《局域网聊天软件源代码包括语音聊天.docx(48页珍藏版)》请在冰豆网上搜索。
![局域网聊天软件源代码包括语音聊天.docx](https://file1.bdocx.com/fileroot1/2023-1/3/78d36632-ca76-46cd-be98-490db25b3194/78d36632-ca76-46cd-be98-490db25b31941.gif)
局域网聊天软件源代码包括语音聊天
局域网聊天软件源代码包括语音聊天
//Chat.h:
PROJECT_NAME应用程序的主头文件
//
#pragmaonce
#ifndef__AFXWIN_H__
#error"在包含此文件之前包含“stdafx.h”以生成PCH文件"
#endif
#include"resource.h"//主符号
//CChatApp:
//有关此类的实现,请参阅Chat.cpp
//
classCChatApp:
publicCWinApp
{
public:
CChatApp();
//重写
public:
virtualBOOLInitInstance();
//实现
DECLARE_MESSAGE_MAP()
};
externCChatApptheApp;
//Chat.cpp:
定义应用程序的类行为。
//
#include"stdafx.h"
#include"Chat.h"
#include"ChatDlg.h"
//#ifdef_DEBUG
//#definenewDEBUG_NEW
//CChatApp
BEGIN_MESSAGE_MAP(CChatApp,CWinApp)
ON_COMMAND(ID_HELP,&CWinApp:
:
OnHelp)
END_MESSAGE_MAP()
//CChatApp构造
CChatApp:
:
CChatApp()
{
//TODO:
在此处添加构造代码,
//将所有重要的初始化放置在InitInstance中
}
//唯一的一个CChatApp对象
CChatApptheApp;
//CChatApp初始化
BOOLCChatApp:
:
InitInstance()
{
//如果一个运行在WindowsXP上的应用程序清单指定要
//使用ComCtl32.dll版本6或更高版本来启用可视化方式,
//则需要InitCommonControlsEx()。
否则,将无法创建窗口。
INITCOMMONCONTROLSEXInitCtrls;
InitCtrls.dwSize=sizeof(InitCtrls);
//将它设置为包括所有要在应用程序中使用的
//公共控件类。
InitCtrls.dwICC=ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp:
:
InitInstance();
AfxEnableControlContainer();
//标准初始化
//如果未使用这些功能并希望减小
//最终可执行文件的大小,则应移除下列
//不需要的特定初始化例程
//更改用于存储设置的注册表项
//TODO:
应适当修改该字符串,
//例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CChatDlgdlg;
m_pMainWnd=&dlg;
INT_PTRnResponse=dlg.DoModal();
if(nResponse==IDOK)
{
//TODO:
在此放置处理何时用
//“确定”来关闭对话框的代码
}
elseif(nResponse==IDCANCEL)
{
//TODO:
在此放置处理何时用
//“取消”来关闭对话框的代码
}
//由于对话框已关闭,所以将返回FALSE以便退出应用程序,
//而不是启动应用程序的消息泵。
returnFALSE;
}
//#endif
//ChatDlg.h:
头文件
#include"Public.h"
#include"Server.h"
#include"Client.h"
#ifndef_CChatDlg_h_//用于防止头文件嵌套多次1
#define_CChatDlg_h_//用于防止头文件嵌套多次2
#include"Sound.h"
#pragmaonce
#defineWM_DATAREACHWM_APP+110
#defineCLIENT1
#defineSERVER2
//CChatDlg对话框
classCChatDlg:
publicCDialog
{
//构造
public:
CChatDlg(CWnd*pParent=NULL);//标准构造函数
//对话框数据
enum{IDD=IDD_CHAT_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
//afx_msgvoidOnBnClickedButton3();
////////////自定义数据/////////////////
public:
boolServerFlag;//用于表示是否已经建立了服务器,没有则为false,已经建立则为true
boolClientFlag;//用于表示是否已经连接了服务器,没有则为false,已经建立则为true
CServerServer;//用于服务器端的操作
CClientClient;//用于服务端的操作
CSoundSound;//用于音频操作
CStringInPutCString;//用于保存输入窗口的文字数据
CStringAllCString;//用于保存所有聊天记录的文字数据
intMark;//用于标识是客户端还是服务器
boolSoundChat;//用于标识是否已经开始语音聊天,false表示没有,true表示已经建立语音聊天了
WAVEHDR*p;
////////////////////自定义消息响应函数-开始/////////////////////
LRESULTOnDataReach(WPARAMwParam,LPARAMlParam);//当有新数据到达时执行的代码
afx_msgLRESULTGetInBufferFull(WPARAMwp,LPARAMlp);//一个buffer满后调用
afx_msgLRESULTWriteOutBufferEmpty(WPARAMwp,LPARAMlp);//一个buffer播放完后调用
////////////////////自定义消息响应函数-结束/////////////////////
////////////////////////////////////////
afx_msgvoidOnBnClickedLinkserver();
afx_msgvoidOnBnClickedBuildserver();
afx_msgvoidOnIpnFieldchangedIpaddress(NMHDR*pNMHDR,LRESULT*pResult);
afx_msgvoidOnBnClickedSend();
afx_msgvoidOnEnChangeChat();
afx_msgvoidOnBnClickedClose();
afx_msgvoidOnBnClickedVoicechat();
};
#endif//用于防止头文件嵌套多次3
//ChatDlg.cpp:
实现文件
#include"stdafx.h"
#include"ChatDlg.h"
//#include"Wmiutils.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//对话框数据
enum{IDD=IDD_ABOUTBOX};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
END_MESSAGE_MAP()
//CChatDlg对话框
CChatDlg:
:
CChatDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CChatDlg:
:
IDD,pParent)
{
ServerFlag=false;//初始化还没有建立服务器
ClientFlag=false;
Mark=0;
AllCString="";
SoundChat=false;
p=(WAVEHDR*)malloc(sizeof(WAVEHDR)+MAX_BUFFER_SIZE);
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCChatDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CChatDlg,CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
//ON_BN_CLICKED(IDC_BUTTON3,&CChatDlg:
:
OnBnClickedButton3)
ON_BN_CLICKED(IDB_LINKSERVER,&CChatDlg:
:
OnBnClickedLinkserver)
ON_BN_CLICKED(IDB_BUILDSERVER,&CChatDlg:
:
OnBnClickedBuildserver)
ON_NOTIFY(IPN_FIELDCHANGED,IDI_IPADDRESS,&CChatDlg:
:
OnIpnFieldchangedIpaddress)
//ON_WM_CREATE()
ON_BN_CLICKED(IDB_SEND,&CChatDlg:
:
OnBnClickedSend)
////////////////////用户自定义的消息-开始///////////////////////
ON_MESSAGE(WM_DATAREACH,OnDataReach)
ON_MESSAGE(MM_WIM_DATA,GetInBufferFull)//一个buffer满了后调用
ON_MESSAGE(MM_WOM_DONE,WriteOutBufferEmpty)//buffer的内容被播放完了后,产生的消息调用这个函数
////////////////////用户自定义的消息-结束///////////////////////
//ON_EN_CHANGE(IDE_EDITCHAT,&CChatDlg:
:
OnEnChangeEditchat)
//ON_EN_MAXTEXT(IDE_EDITCHAT,&CChatDlg:
:
OnEnMaxtextEditchat)
//ON_EN_CHANGE(IDE_EDITCHAT,&CChatDlg:
:
OnEnChangeEditchat)
ON_EN_CHANGE(IDE_CHAT,&CChatDlg:
:
OnEnChangeChat)
ON_BN_CLICKED(IDB_CLOSE,&CChatDlg:
:
OnBnClickedClose)
ON_BN_CLICKED(IDB_VOICECHAT,&CChatDlg:
:
OnBnClickedVoicechat)
END_MESSAGE_MAP()
//CChatDlg消息处理程序
BOOLCChatDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
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);//设置小图标
//TODO:
在此添加额外的初始化代码
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
voidCChatDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
voidCChatDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0);
//使图标在工作区矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
///////////////////程序员添加代码-开始////////////////////////
((CIPAddressCtrl*)GetDlgItem(IDI_IPADDRESS))->SetAddress(:
:
htonl(:
:
inet_addr("192.168.177.29")));
((CEdit*)this->GetDlgItem(IDE_PORT))->SetWindowTextA("7000");
((CButton*)this->GetDlgItem(IDB_SEND))->SetFocus();//将焦点设置为发送按钮
///////////////////程序员添加代码-结束////////////////////////
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSORCChatDlg:
:
OnQueryDragIcon()
{
returnstatic_cast(m_hIcon);
}
voidCChatDlg:
:
OnBnClickedLinkserver()
{
Client.InitM_dlg(this);
//TODO:
在此添加控件通知处理程序代码
if(ClientFlag==false)
{
Client.GetServerAddress();
if(Client.AddSocketLib()&&Client.CreateSocket()&&Client.ConnectSocket())
{
ClientFlag=true;
this->GetDlgItem(IDE_LINKSTATE)->SetWindowText("服务器连接成功");
Mark=CLIENT;
:
:
WSAAsyncSelect(Client.ClientSocket,this->m_hWnd,
WM_DATAREACH,FD_OOB|FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
:
:
WSAAsyncSelect(Client.ClientSocketSound,this->m_hWnd,
WM_DATAREACH,FD_OOB|FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
return;
}
return;
}
else
return;
}
voidCChatDlg:
:
OnBnClickedBuildserver()
{
//TODO:
在此添加控件通知处理程序代码
Server.InitM_dlg(this);
if(ServerFlag==false)
{
Server.GetServerAddress();
if(Server.AddSocketLib()&&
Server.CreateSocket()&&
Server.BindSocket()&&
Server.ListeSocket()&&
Server.AcceptClient())
{
ServerFlag=true;
this->GetDlgItem(IDE_BUILDSTATE)->SetWindowText("服务器设置成功");
Mark=SERVER;
:
:
WSAAsyncSelect(Server.ConnectSocket,this->m_hWnd,
WM_DATAREACH,FD_OOB|FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
:
:
WSAAsyncSelect(Server.ConnectSocketSound,this->m_hWnd,
WM_DATAREACH,FD_OOB|FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
return;
}
return;
}
else
return;
}
voidCChatDlg:
:
OnIpnFieldchangedIpaddress(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMIPADDRESSpIPAddr=reinterpret_cast(pNMHDR);
//TODO:
在此添加控件通知处理程序代码
*pResult=0;
}
voidCChatDlg:
:
OnBnClickedSend()
{
//TODO:
在此添加控件通知处理程序代码
(this->GetDlgItem(IDE_EDITCHAT))->GetWindowTextA(InPutCString);//把聊天输入窗口里面的文字保存到InPutCString中
if(InPutCString.GetLength()!
=0)
{
(this->GetDlgItem(IDE_EDITCHAT))->SetWindowTextA("");
if(Mark==SERVER)
{
AllCString=AllCString+"服务器:
"+InPutCString+"\r\n";
this->GetDlgItem(IDE_CHAT)->SetWindowText(AllCString);
Server.GetSendBuf(InPutCString);
Server.SendData(NULL);
}
elseif(Mark==CLIENT)
{
AllCString=AllCString+"客户端:
"+InPutCString+"\r\n";
this->GetDlgItem(IDE_CHAT)->SetWindowText(AllCString);
Client.GetSendBuf(InPutCString);
Client.SendData(NULL);
}
}
}
////////////////////////////用户定义消息响应函数-开始///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
//OnDataReach-开始//
//当有新数据到达时执行的代码//
////////////////