当前位置:文档之家› 网络编程聊天室主要代码

网络编程聊天室主要代码

聊天室客户端主要代码CSocket.hclass CChat_ClientDlg; //dlg类声明class CCSocket : public CSocket{DECLARE_DYNAMIC(CCSocket); //动态类声明public:CCSocket(CChat_ClientDlg* pDlg); //添加构造函数的入口函数virtual ~CCSocket();CChat_ClientDlg* m_pDlg;//指向对话框的指针变量。

virtual void OnReceive(int nErrorCode); //CSocket类添加的事件响应函数};CSokcet.cpp#include"stdafx.h"#include"Chat_Client.h"#include"CSocket.h"#include"Chat_ClientDlg.h" //自行添加的头文件,调用到dlg类的成员函数。

IMPLEMENT_DYNAMIC(CCSocket,CSocket) //动态类声明// CCSocket构造函数、析构函数CCSocket::CCSocket(CChat_ClientDlg* pDlg){m_pDlg=pDlg; //初始化对话框指针变量}CCSocket::~CCSocket(){m_pDlg=NULL;}// CCSocket 成员函数void CCSocket::OnReceive(int nErrorCode){// TODO: 在此添加专用代码和/或调用基类CSocket::OnReceive(nErrorCode);if(nErrorCode==0) m_pDlg->OnReceive(); //调用对话框类的对应函数}CChat_ClientDlg.h#pragma once#include"afxwin.h"#include"Msg.h" //自行添加的包含头文件#include"CSocket.h" //自行添加的包含头文件class CCSocket; //自行添加的类声明// CChat_ClientDlg 对话框类构造函数、析构函数…………protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnBnClickedButtonConnect(); //按钮单击事件响应函数声明afx_msg void OnBnClickedButtonClose();afx_msg void OnBnClickedButtonSend();afx_msg void OnDestroy(); //对话框销毁事件响应函数声明DECLARE_MESSAGE_MAP()public:CString m_strSName; // 服务器名称CString m_strCName; // 客户名称//控件变量UINT m_nPort; // 端口号,即聊天室频道CButton m_btnConnect;CButton m_btnClose;CString m_strMsg;CButton m_btnSend;CListBox m_listMsg;CCSocket* m_pSocket; //套接字指针变量CSocketFile* m_pFile;CArchive* m_pArchiveIn; // 用于输入的CArchive对象指针CArchive* m_pArchiveOut; // 用于输出的CArchive对象指针//成员函数void OnReceive(void);void ReceiveMsg(void);void SendMsg(CString strText , bool st);};Chat_ClientDlg.cpp#include"stdafx.h"#include"Chat_Client.h"#include"Chat_ClientDlg.h"#include"Msg.h" //包含头文件#include"CSocket.h" //包含头文件…………//构造函数,初始化变量CChat_ClientDlg::CChat_ClientDlg(CWnd* pParent /*=NULL*/) : CDialog(CChat_ClientDlg::IDD, pParent), m_strSName(_T("")), m_strCName(_T("")), m_nPort(0), m_strMsg(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//初始化自定义变量m_pSocket=NULL;m_pFile=NULL;m_pArchiveIn=NULL;m_pArchiveOut=NULL;}……BEGIN_MESSAGE_MAP(CChat_ClientDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON_CONNECT,&CChat_ClientDlg::OnBnClickedButtonConnect)ON_BN_CLICKED(IDC_BUTTON_CLOSE,&CChat_ClientDlg::OnBnClickedButtonClose)ON_BN_CLICKED(IDC_BUTTON_SEND,&CChat_ClientDlg::OnBnClickedButtonSend)ON_WM_DESTROY()END_MESSAGE_MAP()// CChat_ClientDlg 消息处理程序BOOL CChat_ClientDlg::OnInitDialog(){…………// TODO: 在此添加额外的初始化代码// 初始化文本框变量,更新对话框m_nPort=8000;m_strSName=_T("localhost");UpdateData(FALSE);return TRUE; // 除非将焦点设置到控件,否则返回TRUE }……void CChat_ClientDlg::OnBnClickedButtonConnect(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);m_pSocket=new CCSocket(this); //创建套接字if(!m_pSocket->Create()){delete m_pSocket; // 错误处理m_pSocket=NULL;AfxMessageBox(_T("套接字创建错误!"));return;}if(!m_pSocket->Connect(m_strSName,m_nPort)){delete m_pSocket; // 错误处理m_pSocket=NULL;AfxMessageBox(_T("无法连接服务器!"));return;}m_pFile=new CSocketFile(m_pSocket);m_pArchiveIn=new CArchive(m_pFile,CArchive::load);m_pArchiveOut=new CArchive(m_pFile,CArchive::store);//调用SendMsg函数,向服务器发送消息,表明该客户机进入聊天室CString strTemp;strTemp=m_strCName+_T("进入聊天室"); //发送的消息设为:“客户名”进入聊天室SendMsg(strTemp,FALSE); //m_bClose设为FALSEGetDlgItem(IDC_EDIT_MSG)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_CLIENTNAME)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(FALSE);}void CChat_ClientDlg::OnBnClickedButtonClose(){// TODO: 在此添加控件通知处理程序代码CString strTemp;strTemp=m_strCName+_T(":离开聊天室!");SendMsg(strTemp,TRUE); //m_bClose设为TRUE//释放资源delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;//清空列表框while(m_listMsg.GetCount()!=0)m_listMsg.DeleteString(0);GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_CLIENTNAME)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE);}void CChat_ClientDlg::OnBnClickedButtonSend(){// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE); //取用户数据if(!m_strMsg.IsEmpty()){this->SendMsg(m_strCName+_T(":")+m_strMsg,FALSE);m_strMsg=_T("");UpdateData(FALSE);}}void CChat_ClientDlg::OnDestroy() //窗口销毁事件响应函数{CDialog::OnDestroy();// TODO: 在此处添加消息处理程序代码if((m_pSocket!=NULL)&&(m_pFile!=NULL)&&(m_pArchiveOut!=NULL)) {//发送客户机离开聊天室的消息CMsg msg;CString strTemp;strTemp=m_strCName+_T("DDDD:离开聊天室!");this->SendMsg(strTemp,TRUE);}delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;delete m_pSocket;m_pSocket=NULL;}//CCSocket套接字调用的函数void CChat_ClientDlg::OnReceive(void){do{ReceiveMsg();if(m_pSocket==NULL) return;}while(!m_pArchiveIn->IsBufferEmpty());}//实际接收数据的函数void CChat_ClientDlg::ReceiveMsg(void){CMsg msg;try{//调用消息对象xuliehua函数,接收消息msg.Serialize(*m_pArchiveIn);m_listMsg.AddString(msg.m_strBuf); //将接收到的消息显示在列表框if(msg.m_bClose==true){delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;//清空列表框while(m_listMsg.GetCount()!=0)m_listMsg.DeleteString(0);GetDlgItem(IDC_EDIT_MSG)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSE)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_CLIENTNAME)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVPORT)->EnableWindow(TRUE);}}catch(CFileException& e) //错误处理{//显示处理服务器关闭的消息CString strTemp;strTemp=_T("服务器重置连接!连接关闭!");m_listMsg.AddString(strTemp);msg.m_bClose=TRUE;m_pArchiveOut->Abort();//删除相应对象delete m_pArchiveOut; //删除用于输出的CArchive对象m_pArchiveOut=NULL;delete m_pArchiveIn; //删除用于输入的CArchive对象m_pArchiveIn=NULL;delete m_pFile;m_pFile=NULL;m_pSocket->Close();delete m_pSocket;m_pSocket=NULL;}}//实际向服务器发送数据的函数void CChat_ClientDlg::SendMsg(CString strText , bool st) {if(m_pArchiveOut!=NULL){CMsg msg;//将要发送的信息本文赋值给消息对象的成员变量msg.m_strBuf=strText;msg.m_bClose=st;//调用消息对象的序列化函数,发送消息msg.Serialize(*m_pArchiveOut);//将CArchive对象中的数据强制存储到CSocketfile对象中。

相关主题