⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatserverview.cpp

📁 这是一个很好实现的网络聊天程序
💻 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 + -