📄 chatserverview.cpp
字号:
// chatserverView.cpp : implementation of the CChatserverView class
//
#include "stdafx.h"
#include "chatserver.h"
#include "chatserverDoc.h"
#include "chatserverView.h"
#include "Mesg.h"
#include "Port.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChatserverView
IMPLEMENT_DYNCREATE(CChatserverView, CFormView)
BEGIN_MESSAGE_MAP(CChatserverView, CFormView)
//{{AFX_MSG_MAP(CChatserverView)
ON_WM_PAINT()
ON_WM_SIZE()
ON_BN_CLICKED(IDC_START, OnStart)
ON_BN_CLICKED(IDC_END, OnEnd)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChatserverView construction/destruction
CChatserverView::CChatserverView()
: CFormView(CChatserverView::IDD)
{
//{{AFX_DATA_INIT(CChatserverView)
//}}AFX_DATA_INIT
// TODO: add construction code here
initflag=0;
}
CChatserverView::~CChatserverView()
{
}
void CChatserverView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CChatserverView)
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Control(pDX, IDC_STATIC_INFO, m_info);
DDX_Control(pDX, IDC_START, m_start);
DDX_Control(pDX, IDC_END, m_end);
//}}AFX_DATA_MAP
}
BOOL CChatserverView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CChatserverView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
// CChatserverView printing
BOOL CChatserverView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CChatserverView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CChatserverView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CChatserverView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CChatserverView diagnostics
#ifdef _DEBUG
void CChatserverView::AssertValid() const
{
CFormView::AssertValid();
}
void CChatserverView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CChatserverDoc* CChatserverView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChatserverDoc)));
return (CChatserverDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CChatserverView message handlers
void CChatserverView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if(!initflag)
{
initflag=1;
CRect rc,r1,r2,r3,r4;
GetClientRect(rc);
r1.top=rc.top+20;
r1.bottom=r1.top+15;
r1.left=rc.left+20;
r1.right=r1.left+150;
m_info.MoveWindow(r1);
r2.left=r1.left;
r2.right=rc.right-20;
r2.top=r1.bottom+5;
r2.bottom=rc.bottom-60;
m_list.MoveWindow(r2);
r3.left=r2.left;
r3.right=r3.left+100;
r3.top=r2.bottom+20;
r3.bottom=r3.top+25;
r4.top=r3.top;
r4.left=r3.right+50;
r4.right=r4.left+100;
r4.bottom=r3.bottom;
m_start.MoveWindow(r3);
m_end.MoveWindow(r4);
m_start.EnableWindow(true);
m_end.EnableWindow(false);
}
// Do not call CFormView::OnPaint() for painting messages
}
void CChatserverView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
if(initflag)
{
CRect rc,r1,r2,r3,r4;
GetClientRect(rc);
r1.top=rc.top+20;
r1.bottom=r1.top+15;
r1.left=rc.left+20;
r1.right=r1.left+150;
m_info.MoveWindow(r1);
r2.left=r1.left;
r2.right=rc.right-20;
r2.top=r1.bottom+5;
r2.bottom=rc.bottom-60;
m_list.MoveWindow(r2);
r3.left=r2.left;
r3.right=r3.left+100;
r3.top=r2.bottom+20;
r3.bottom=r3.top+25;
r4.top=r3.top;
r4.left=r3.right+50;
r4.right=r4.left+100;
r4.bottom=r3.bottom;
m_start.MoveWindow(r3);
m_end.MoveWindow(r4);
}
// TODO: Add your message handler code here
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void CChatserverView::Accept()
{
CchatSocket *clientsock=new CchatSocket(this);
if(m_listensock->Accept(*clientsock))
{
clientsock->init();
m_clientlist.AddTail(clientsock);
}
else
delete clientsock;
}
void CChatserverView::Receive(CchatSocket *clientsock)
{
CMesg msg;
do
{
TRY
{
clientsock->receivemessage(&msg);
}
CATCH(CFileException,e)
{
clientsock->Abort();
}
END_CATCH
// if(msg.m_close)
// {
// CloseSocket(clientsock);
// break;
// }
}
while(!clientsock->m_in->IsBufferEmpty());
UpdateClient(&msg,clientsock);
}
void CChatserverView::UpdateClient(CMesg *msg,CchatSocket *clientsock)
{
/***********判断用户名是否重名***********/
if(msg->type==1) //新上线用户
{
for(POSITION pos=m_clientlist.GetHeadPosition();pos!=NULL; )
{
CchatSocket *csock=(CchatSocket *)m_clientlist.GetNext(pos);
if(csock->name == msg->from)
{
CMesg msgback;
msgback.type=3;
msgback.from=msgback.to=msgback.m_str="";
sendmsg(clientsock,&msgback);
return;
}
}
}
/****************************************/
for(POSITION pos=m_clientlist.GetHeadPosition();pos!=NULL; )
{
POSITION tmp=pos;
CchatSocket *csock=(CchatSocket *)m_clientlist.GetNext(pos);
if(clientsock!=csock)
sendmsg(csock,msg);
if(msg->type==1) //将刚上线机器的用户名加入对应链表的节点处
if(csock->name=="")
{
csock->name=msg->from;
addtolist(msg->from);
}
}
/********************************************************************/
if(msg->type==5) //用户下线信息
{
for(POSITION pos=m_clientlist.GetHeadPosition();pos!=NULL; )
{
POSITION tmp=pos;
CchatSocket *csock=(CchatSocket *)m_clientlist.GetNext(pos);
if(csock==clientsock)
{
m_clientlist.RemoveAt(tmp);
delete clientsock;
// deletefromlist(msg->from);
}
}
}
}
void CChatserverView::sendmsg(CchatSocket *sock, CMesg *msg)
{
TRY
{
sock->sendmessage(msg);
}
CATCH(CFileException,e)
{
sock->Abort();
}
END_CATCH
}
void CChatserverView::OnStart()
{
// TODO: Add your control notification handler code here
CPort portdlg;
if(portdlg.DoModal()==IDOK)
{
m_listensock=new CLisnSocket(this);
if(m_listensock->Create(portdlg.m_port))
{
if(!m_listensock->Listen())
{
AfxMessageBox("监听失败");
return;
}
}
}
m_start.EnableWindow(false);
m_end.EnableWindow(true);
}
void CChatserverView::addtolist(CString name)
{
m_list.AddString(name);
}
void CChatserverView::deletefromlist(CString name)
{
int max;
CString item;
max=m_list.GetCount();
for(int i=0;i<max;i++)
{
m_list.GetText(i,item);
if(name==item)
m_list.DeleteString(i);
}
}
void CChatserverView::OnEnd()
{
// TODO: Add your control notification handler code here
m_start.EnableWindow(true);
m_end.EnableWindow(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -