| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vc >> 通信网络 >> 文章正文
WinSocket高级实现(聊天室的实现)(二)        【字体:
WinSocket高级实现(聊天室的实现)(二)
作者:-    文章来源:-    点击数:    更新时间:2006-4-20

下载本文所附源代码


上回我带领大家制作了一个聊天室的客户端,今天我来讲解一下这个聊天室的服务器端怎样编写。

首先我们和上回一样,仍然建立一个MFC的程序,取名为ChatRoomServer,注意一定不要忘记在Step 2时钩上Windows Sockets。我们这个服务端的程序很简单。你只需要在他默认建立的对话框上增加两个按钮就行了。如下图:

其中Start、Stop是启动和中止服务的,是不是很简单。

其中值得注意的是,我们需要用Class Wizard为这两个按钮各增加一个控制变量:m_IDC_BUTTON_START、m_IDC_BUTTON_STOP。还有是为这两个按钮增加上对应的函数:CChatRoomServerDlg::OnButtonStart() 、CChatRoomServerDlg::OnButtonStop()。其具体内容如下:

void CChatRoomServerDlg::OnButtonStart()
{
  // TODO: Add your control notification handler code here
  m_IDC_BUTTON_START.EnableWindow(FALSE);
  ListenSocket.Create(6767);
  ListenSocket.Listen();
  m_IDC_BUTTON_STOP.EnableWindow(TRUE);
}

void CChatRoomServerDlg::OnButtonStop()
{
  // TODO: Add your control notification handler code here
  m_IDC_BUTTON_STOP.EnableWindow(FALSE);
  ListenSocket.Close();
  m_IDC_BUTTON_START.EnableWindow(TRUE);
}

其中ListenSocket是由CListenSocket定义的成员变量。其具体内容如下:

class CListenSocket : public CSocket
{
  // Attributes
  public:

  // Operations
  public:
  CClientSocketList CCSL;
  CListenSocket();
  virtual ~CListenSocket();

  // Overrides
  public:
  // ClassWizard generated virtual function overrides
  //{{AFX_VIRTUAL(CListenSocket)
  public:
  virtual void OnAccept(int nErrorCode);
  //}}AFX_VIRTUAL

  // Generated message map functions
  //{{AFX_MSG(CListenSocket)
  // NOTE - the ClassWizard will add and remove member functions here.
  //}}AFX_MSG

  // Implementation
  protected:
};

void CListenSocket::OnAccept(int nErrorCode)
{
  // TODO: Add your specialized code here and/or call the base class
  CClientSocket *tmp=new CClientSocket(&CCSL);
  Accept(*tmp);
  CCSL.Add(tmp);
  CSocket::OnAccept(nErrorCode);
}

还有一个为生成客户Sockets队列的类:CClientSocketList

class CClientSocketList
{
  public:
  BOOL Sends(CClientSocket *);
  BOOL Add(CClientSocket *);
  CClientSocket * Head;
  CClientSocketList();
  virtual ~CClientSocketList();
};

[1] [2] 下一页  

BOOL CClientSocketList::Add(CClientSocket *add)
{
  CClientSocket *tmp=Head;
  if (!Head)
  {
    Head=add;
    return true;
  }
  while (tmp->Next) tmp=tmp->Next;
  tmp->Next=add;
  return true;
}

BOOL CClientSocketList::Sends(CClientSocket *tmp)
{
  char buff[1000];
  int n;
  CClientSocket *curr=Head;
  n=tmp->Receive(buff,1000);
  buff[n]=0;
  while (curr)
  {
    curr->Send(buff,n);
    curr=curr->Next;
  }
  return true;
}
 

[1] [2] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • WinSocket高级实现(聊天室的…

  • 一个对Winsock 完成端口模型…

  • 一个Socket传输文件的例子

  • 用VC++6.0的Sockets API实现…

  • 在VC中实现FTP功能

  • 直接用socket实现HTTP下载

  • ftp协议实现多线程断点续传

  • 应用层截包方案与实现

  • udp服务器设计过程总结

  • 局域网内mfc/udp聊天程序

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |