// CChatServer.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "CChatServer.h"
#include "SetServerPortDlg.h"
#include "MyTreeView.h"
#include "ClientSocket.h"
#include "CIniFile.h"
#include "MainFrm.h"
#include "CChatServerDoc.h"
#include "CChatServerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCChatServerApp
BEGIN_MESSAGE_MAP(CCChatServerApp, CWinApp)
//{{AFX_MSG_MAP(CCChatServerApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCChatServerApp construction
CCChatServerApp::CCChatServerApp():bInit(FALSE)
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_pClientSocketList = new CPtrList();
CIniFile m_IniFile;
bInit = m_IniFile.Create("RoomList.ini");
if(bInit)
{
int iRoomNum;
m_IniFile.GetVarInt("ROOMNUM","RoomNumber",iRoomNum);
for(int i = 1; i<=iRoomNum; i++)
{
CString *strRoom = new CString ;
CString strTemp ;;
strTemp.Format("Room%d",i);
m_IniFile.GetVarStr("ROOMNAME",strTemp,*strRoom);
m_ChatRoomList.AddTail(strRoom);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CCChatServerApp object
CCChatServerApp theApp;
CCriticalSection g_cs;
/////////////////////////////////////////////////////////////////////////////
// CCChatServerApp initialization
BOOL CCChatServerApp::InitInstance()
{
if(!bInit)
{
AfxMessageBox("初始化文件不存在");
return FALSE;
}
if (!AfxSocketInit())
{
return FALSE;
}
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CCChatServerDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
//RUNTIME_CLASS(CMyTreeView));
NULL);
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
{
return FALSE;
}
// The one and only window has been initialized, so show and update it.
//
// Place all significant initialization in InitInstance
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
m_pMainWnd->SetWindowText("会议中心");
CSetServerPortDlg Dlg;
if(Dlg.DoModal() == IDCANCEL)
{
return FALSE;
}
else
{
if(!m_skServerSocket.Create(Dlg.m_iServerPort))
{
if(m_ChatRoomList.GetCount())
{
m_ChatRoomList.RemoveAll();
}
return FALSE;
}
}
if(!m_skServerSocket.Listen())
{ return FALSE;
}
TaskIcon.cbSize = sizeof(TaskIcon);
TaskIcon.hWnd = AfxGetMainWnd()->GetSafeHwnd();
lstrcpy(TaskIcon.szTip,_T("服务器正在运行..."));
TaskIcon.uFlags = 0x07;
TaskIcon.hIcon = LoadIcon(IDR_MAINFRAME);
TaskIcon.uCallbackMessage = WM_TASKICON;
Shell_NotifyIcon(NIM_ADD,&TaskIcon);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CCChatServerApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CCChatServerApp message handlers
int CCChatServerApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
Shell_NotifyIcon(NIM_DELETE,&TaskIcon);
//向所有用户发送退出消息
Message msObj;
msObj.iType = SYSERROR;
msObj.iSubType = SERVERQUIT;
CPtrList * m_pClientList = theApp.m_pClientSocketList;
POSITION pos = m_pClientList ->GetHeadPosition();
if(pos)
{
CClientSocket * m_pClientSocket;
for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
// if(m_pClientSocket ->GetState() == HAVELOGIN)
{
m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
m_pClientSocket ->Send(&msObj,sizeof(Message));
Sleep(100);
}
}
}
//删除
DeleteAllList();
return CWinApp::ExitInstance();
}
void CCChatServerApp::DeleteAllList()
{
//删除
POSITION pos = m_pClientSocketList ->GetHeadPosition();
if(pos)
{
CClientSocket * m_pClientSocket;
for(int i = 0; i < m_pClientSocketList ->GetCount(); i++)
{
m_pClientSocket = static_cast < CClientSocket *>(m_pClientSocketList->GetNext(pos));
ASSERT(m_pClientSocket != NULL);
ASSERT_VALID(m_pClientSocket);
delete m_pClientSocket;
}
}
// if(m_pClientSocketList ->GetCount())
//
delete m_pClientSocketList;
pos = m_ChatRoomList.GetHeadPosition();
if(pos)
{
CString * m_pRoomName;
for(int i = 0; i < m_ChatRoomList .GetCount(); i++)
{
m_pRoomName = static_cast < CString *>(m_ChatRoomList.GetNext(pos));
ASSERT(m_pRoomName!=NULL);
delete m_pRoomName;
}
}
// m_ChatRoomList.RemoveAll();
}
没有合适的资源?快使用搜索试试~ 我知道了~
仿QQ即时通信源码(包括客户端和服务器的IM源码)
共53个文件
h:16个
cpp:13个
ini:4个
4星 · 超过85%的资源 需积分: 18 237 下载量 164 浏览量
2010-04-23
17:22:01
上传
评论 11
收藏 257KB RAR 举报
温馨提示
1、支持一对一的聊通信天; 2、支持聊天室的多对多聊天通信; 3、包括服务器与客户端整套源码。
资源推荐
资源详情
资源评论
收起资源包目录
C++仿QQ界面.rar (53个子文件)
C++仿QQ界面
QQServer
RoomList.ini 133B
CChatServer.exe 44KB
QQClient
msg.wav 9KB
username.ini 116B
ChatClient.exe 56KB
Code
QQServer
ServerSocket.h 1KB
CChatServerDoc.h 1KB
复件 RoomList.ini 133B
MyFormView.cpp 1KB
CIniFile.h 2KB
TypeDefine.h 760B
res
test.bmp 1KB
Toolbar.bmp 1KB
House.ico 2KB
CChatServerDoc.ico 1KB
CChatServer.rc2 403B
CChatServer.ico 1KB
bitmap1.bmp 2KB
SetServerPortDlg.h 1KB
CParseMessage.cpp 444B
MyTreeView.h 2KB
CChatServerDoc.cpp 2KB
CChatServerView.cpp 3KB
CChatServerView.h 2KB
ClientSocket.h 2KB
MyTreeView.cpp 7KB
CChatServer.dsp 6KB
ParseMessage.cpp 2KB
RoomList.ini 133B
CParseMessage.h 397B
CChatServer.opt 55KB
ParseMessage.h 436B
SetServerPortDlg.cpp 1KB
StdAfx.cpp 213B
MainFrm.cpp 4KB
resource.h 1KB
ServerSocket.cpp 3KB
CChatServer.cpp 7KB
CChatServer.plg 2KB
CChatServer.ncb 97KB
MyFormView.h 2KB
MainFrm.h 2KB
Message.h 200B
CChatServer.h 2KB
StdAfx.h 1KB
CChatServer.rc 13KB
CChatServer.clw 3KB
CIniFile.cpp 6KB
CChatServer.dsw 545B
CChatServer.aps 31KB
ClientSocket.cpp 4KB
QQClient.rar 102KB
QQServer.rar 60KB
共 53 条
- 1
caomuyong1
- 粉丝: 4
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页