收藏 分享(赏)

用VC++设计简单的聊天室程序完整课程设计.doc

上传人:dreamzhangning 文档编号:2722275 上传时间:2018-09-26 格式:DOC 页数:34 大小:312KB
下载 相关 举报
用VC++设计简单的聊天室程序完整课程设计.doc_第1页
第1页 / 共34页
用VC++设计简单的聊天室程序完整课程设计.doc_第2页
第2页 / 共34页
用VC++设计简单的聊天室程序完整课程设计.doc_第3页
第3页 / 共34页
用VC++设计简单的聊天室程序完整课程设计.doc_第4页
第4页 / 共34页
用VC++设计简单的聊天室程序完整课程设计.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、课程设计任务书学院 专业课程名称 VC+课程设计 时间学生姓名 指导老师题 目 用 VC+设计简单的聊天室程序主要内容:该系统要求完成聊天室的全过程,包括客户端和服务器两大部分的编程及其连接。服务器端聊天程序负责接收和发送来自客户端的聊天信息,客户端聊天程序负责建立和维护与服务器端的连接,想服务器发送本客户的聊天内容。系统采用 VISUAL C+语言程序设计编程实现。要求:(1)通过实际软件项目的分析、设计、编码、测试等工作,掌握用软件工程的方法来开发和维护软件。(2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户使用手册。(3)进行系统的联合调试,编写系统使用说明

2、。(4)完成系统的文档、设计说明工作应当提交的文件:(1) 课程设计学年论文。(2) 课程设计附件(主要是源程序) 。用 VC+设计简单的聊天室程序学生姓名: 指导老师: 摘 要 计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯 QQ、微软的 MSN、移动的 Fetion 等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了TCP/IP 协议与网络编程这门课程之后,我们便会觉得,其实要实现简单的

3、网络通讯其实并不难。接下来的课程设计就是针对一个简单的网络聊天程序,利用 MFC 为开发工具,实现基本的通讯功能 。在课程设计中,系统开发平台为 Windows 2000,程序设计设计语言采用 Visual C+,数据库采用 MS SQL 2000,程序运行平台为 Windows 98/2000/XP。关键词 聊天软件;网络通讯;MFC;课程设计;Visual C+1 引 言1.1 课题背景及意义当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施” 。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。一个简单

4、的聊天室, 从程序员的观点来看就是在多个 I/O 端点之间实现多对多的通信。基于 SOCKET 的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行在各种使用 TCP/IP 协议作为通讯协议的网络上。而在 SOCKET API 的帮助下,开发基于 SOCKET 的局域网通信软件也是易于实现的。1.2 实验平台介绍Visual C+(简称 VC)是 Microsoft 公司推出的目前使用极为广泛的基于 Windows平台的 C+可视化开发环境。VC 基于 C,C+语言,主要由是 MFC 组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几

5、乎可说 VC 在 Windows 平台无所不能。VC 主要是针对 Windows 系统,适合一些系统级 的开发,可以方便实现一些底层 的调用。在 VC 里边嵌入汇编语言很简单。当对系统性能要求很高的时候,可用 VC 开发。VC 在多线程、网络通信、分布应用方面,有着不可比拟的优势。1.3 可行性分析本课程设计主要解决在客户端于客户端的信息交换和客户端于服务器的信息交换及服务器的信息处理上的管理的课程设计。此程序主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的 IP 地址发送连接请求,然后登陆

6、聊天室。在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。整个程序的主体使用了 CSocket 类的方法,实现了网络通讯聊天。先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的网络地址与服务器进行通信。在这里,把端口号成为“聊天频道” 。在后面的程序代码分析中将看到,端口号并不等同于聊天频道,而是在聊天频道上增加一个固定的偏移值,使得这个聊天频道不会和系统保留的端口发生冲突。服务器启动后将在这个指定的端口号中等待客户的连接。对于公共聊天

7、室,服务器对客户的数目不做任何限制。而对于私人聊天室,每个聊天频道则只能允许两个客户互相连接,使得一方发送的信息只能到达对方的主机中。这里的服务器提供的是公共聊天服务。通过分析发现,该程序完全可以通过 Visual C+中 MFC 完成。2 需求分析2.1 设计目的综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C+作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2.2 设计要求采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用 WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过

8、网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑 UDP 打洞直接建立端端连接) 。课程设计要求设计并编程完成两个方面的内容:首先建立一个使用 TCP 协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。2.3 功能要求 支持多个客户端的连接,在服务器和多个客户端之间进行数据传输; 接收客户端发送的消息,并显示在一个列表框中; 在用户连接上后有提示,显示出连接的用户名字; 发送信息时可以显示聊天的所有记录;2.4 系统主要功能和主要功能描述:服务器端聊天程序必须能够做 3 件事情

9、:(1) 服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2) 服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。(3) 服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。这些要求可以通过 CSocket 类提供的功能实现。从 CSocket 派生出两个类CListenSocket 和 CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要

10、一个侦听套接字 CListenSocket,然后根据客户的连接请求动态创建客户套接字 CClientSocket。客户套接字的数量是不可预知的,因此需要一个列表来记录。MFC 的 CPtrList 类就能实现这种功能。客户端聊天程序需要完成以下几个功能:(1) 客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。(2) 客户端聊天程序要把用户输入的信息及时发送到聊天服务器。一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息发送出去,才能及时地满足用户的交互需求。(3) 要随时准备好接受来自服务器的信息,随时把接受到的信

11、息显示出来,让用户及时看到对方的响应。(4) 在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。客户端聊天程序需要使用一个通过 CSocket 类派生出来的 CChatSocket 类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信息,完成上述各项功能。3 设计流程图根据对用户的要求及功能设置可以得到以下的流程图 3.1,用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息

12、,用户向服务器发送信息,服务器处理用户的数据,然后用户开始聊天。客户端的聊天分为对所有人的信息和私聊的信息,该信息应通过程序控制分别进行处理。启动 登陆等待客户端登陆客户端用户创建子套接字MessageCListenSocket CClientSocketMessage登陆成功连接上发送 message显示找到客户端并显示登陆失败发送 ID 和IP图 3.1 设计流程图4 调试分析过程描述Login 服务器:在启动聊天室服务端的时候,会出现图 4.1 的界面,该界面为服务器的登陆界面。图 4.1 登陆服务器界面启动服务器:在登陆页面的环境下,点击启动服务器按钮,即可创建一个新的服务器,服务器界

13、面如图 4.2 所示。图 4.2 启动服务器界面Login 客户端:在启动客户端服务端的时候,会出现图 4.3 的界面,该界面为客户端的连接界面。图 4.3 登陆客户端界面图 4.4 为创建张三客户端,输入用户名张三:图 4.4 输入名称张三图 4.5 为用户张三连接服务器界面,在输入用户名张三并点击确定后,出现如下界面:图 4.5 张三登陆服务器图 4.6 为用户李四的连接界面,在李四连接后,张三和李四用户同时出现在用户列表内:图 4.6 李四登陆服务器图 4.7 为用户李四的连接界面,在王五连接后,张三,李四和王五用户同时出现在用户列表内:图 4.7 王五登陆服务器服务器显示:在张三,李四

14、,王五进入聊天室后的界面为图 4.8.:图 4.8 用户成功登陆后界面开始聊天,群聊:客户端发送信息时的界面为图 4.9图 4.9 聊天界面图 4.10 为私聊界面。张三与李四私聊:点击私聊选项,并发送私聊内容。图 4.10 张三私聊界面图 4.11 为张三私聊界面,李四和张三私聊,张三能看到李四发送的内容:图 4.11 李四私聊界面图 4.12 为王五的界面显示,王五看不到张三和李四的私聊内容:图 4.12 非私聊对象界面5 设计的总结和体会该次课程设计的制作我主要是参照了图书馆内的相关书籍,找到一个类似的程序,然后按照书上的内容一步步的做出来了,虽然这个程序算不上是我自己写出来的,但通过这

15、样的一个过程,还是让我学会了很多东西,也算能比较熟练地掌握 MFC 这一个软件了,这算是一个不小的收获吧,而且,在做这个程序的过程中,让我认识到了在做这样程序中,遇到解决不了的问题与同学的讨论时很重要的,譬如可以以运行,但是就是无法出现连接的显示和状态。最后与同学讨论后,才知道是服务器端有了错误,没有设置自己的 IP 地址,然后对于客户端进行了一番修改,才终于出现了上述的结果。虽然没有彻底做的出来,但是还是比较开心的,因为自己知道了哪里不足,哪里不可以,可以在以后多多的做练习来充实自己。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个

16、计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!我以后还是需要多多的练习,多多的勤奋,这样才有可能让自己有信心,有动力,让自己不至于懂的太少而怯场,因为不懂而不会做,相信自己以后会编写出让自己满意的程序和软件的。6 参考文献1 任泰明著 . TCP/IP 协议与网络编程. 西安电子科技大学出版社. 20042 唐克著. MFC 程序设计:Using Visual C+ 6.0. 北京希望电子出版社. 20023 邓全良著 . Winsock 网络程序设计 . 中国铁道出版社. 20024Visual

17、 C+6.0 使用与开发 清华大学出版社,木林森、高峰霞、罗丽琼、奚红宇编著5Visual c+ 实用教程(第三版) 郑阿奇 , 电子工业出版社附:源代码I 服务器:/ ServerDlg.cpp : implementation file/#include “stdafx.h“#include “Server.h“#include “ServerDlg.h“#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App

18、Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CServerDlg dialogCServerDlg:CServ

19、erDlg(CWnd* pParent /*=NULL*/): CDialog(CServerDlg:IDD, pParent)m_hIcon = AfxGetApp()-LoadIcon(IDI_ICONAPP);void CServerDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DISPLAY, m_strDisplay);BEGIN_MESSAGE_MAP(CServerD

20、lg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_START, OnBnStart)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_MESSAGE(WM_RECEIVE, OnReceive)ON_MESSAGE(WM_CLIENTCLOSE, OnClientClose)ON_MESSAGE(WM_ACCEPT, OnAccept)ON_WM_DESTROY()END_MESSAGE_MAP()/ CServerDlg message ha

21、ndlersBOOL CServerDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small iconm_iNetPort = 3127;m_Server.Initialize(

22、this);m_bServer = FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid CServerDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CServerDlg:OnPaint() if (IsIconic()CPaintDC

23、dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x

24、, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CServerDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CServerDlg:OnBnStart() / 创建套接字m_Server.Create(m_iNetPort);/ 开始监听m_Server.Listen();/ 显示CString strInfo;strInfo.LoadString(IDS_CREATE_SERVER);ShowInDisplay(strInfo);m_bServer = TRUE;GetDlgItem(IDC_BN_

25、START)-EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(TRUE);void CServerDlg:OnBnClose() CloseServer();GetDlgItem(IDC_BN_START)-EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);void CServerDlg:OnAccept()/ 创建新客户CMySocket *pNewClient = new CMySocket;pNewClient-Initialize(this)

26、;m_Server.Accept(*pNewClient);/ 放入链表中m_lsClient.AddTail(pNewClient);void CServerDlg:OnClientClose(WPARAM wParam, LPARAM lParam)CMySocket *p_delClient = (CMySocket*)wParam;/ 关闭该用户p_delClient-ShutDown();char bufferBUFFERSIZE;while(p_delClient-Receive(buffer, BUFFERSIZE)0);p_delClient-Close();/ 在用户链表中删

27、除该用户POSITION psCur, psList = m_lsClient.GetHeadPosition();CMySocket *p_curClient;while(psList!=NULL)psCur = psList;p_curClient = (CMySocket *)m_lsClient.GetNext(psList);if(p_delClient=p_curClient)m_lsClient.RemoveAt(psCur);break;/ 发送信息告诉其他用户该客户退出CString strMsg;strMsg.LoadString(IDS_CLIENT_CLOSE);NET

28、MESSAGE netMessage(PTC_CLIENT_QUIT, p_delClient-GetName(), _T(“), p_delClient-GetName() + strMsg);SendToAllClient(netMessage);/ 界面上清理该用户信息m_lbUser.DeleteString(m_lbUser.FindString(-1, p_delClient-GetName();ShowInDisplay(p_delClient-GetName() + strMsg);/ 删除该用户delete p_delClient;void CServerDlg:OnRece

29、ive(WPARAM wParam, LPARAM lParam)CMySocket *p_curClient = (CMySocket*)wParam;NETMESSAGE netMessage;p_curClient-Receive(char *)switch(netMessage.type)case PTC_NEW: / 新客户加入NewClientAdd(p_curClient, break;case PTC_SAY: / 普通聊天ShowMessage(netMessage);break;/ 把加工过的信息发送给其他用户SendToAllClient(netMessage);void

30、 CServerDlg:CloseServer()if(!m_bServer) return;/ 向所有客户发送服务端关闭的信息CString strInfo;strInfo.LoadString(IDS_CLOSESERVER);NETMESSAGE netMessage(PTC_SYSTEM, _T(“), _T(“), strInfo);SendToAllClient(netMessage);/ 服务端界面显示关闭信息ShowInDisplay(strInfo);/ 关闭服务端m_Server.Close();/ 关闭客户端char bufferBUFFERSIZE;CMySocket

31、*m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL)m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient-ShutDown();while(m_pClient-Receive(buffer, BUFFERSIZE)0);m_pClient-Close();delete m_pClient;m_lsClient.RemoveAll();m_bServer = FALSE;/ 向所有户发出信息void CServerDlg:Se

32、ndToAllClient(const NETMESSAGE POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL)m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient-SendMsg(netMessage);void CServerDlg:ShowInDisplay(CString str)m_strDisplay += str + “rn“;UpdateData(false);void CServerDlg:OnDestroy() CDialo

33、g:OnDestroy();/ TODO: Add your message handler code here/ 新用户加入 void CServerDlg:NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage)/ 存入用户名字p_client-SetName(netMessage-form);/ 在列表框中显示该用户m_lbUser.AddString(p_client-GetName();/ 发送用户列表给该客户NETMESSAGE netMsg(PTC_USER_LIST, _T(“), _T(“), _T(“);int iL

34、istLen = m_lbUser.GetCount();CString strMsg;for(int index=m_lbUser.GetTopIndex(); indexSendMsg(netMsg);/ 加工信息strMsg.LoadString(IDS_NEW_CLIENT);strMsg = p_client-GetName() + strMsg;strcpy(netMessage-data, (LPCTSTR)strMsg);/ 显示该用户进入ShowInDisplay(strMsg);/ 显示普通消息void CServerDlg:ShowMessage(NETMESSAGE n

35、etMessage)CString strTo = netMessage.to;if(strTo=_T(“)strTo = “所有人“;CString strForm = netMessage.form;CString strMsg = netMessage.data;CString strOut = strForm + “对“ + strTo + “说:“ + strMsg;ShowInDisplay(strOut);II 客户端:/ ClientDlg.cpp : implementation file/#include “stdafx.h“#include “Client.h“#incl

36、ude “ClientDlg.h“#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV supportprotect

37、ed:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CClientDlg dialogCClientDlg:CClientDlg(CWnd* pParent /*=NULL*/): CDialog(CClientDlg:IDD, pParent

38、)m_strDisplay = _T(“);m_strSend = _T(“);m_bWhispering = FALSE;m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CClientDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DIAPLAY, m_strDisplay);DDX_Text(pDX, IDC_EDIT_SEN

39、D, m_strSend);DDX_Check(pDX, IDC_CHECK_WHISPERING, m_bWhispering);BEGIN_MESSAGE_MAP(CClientDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BN_CONNECT, OnBnConnect)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_BN_CLICKED(IDC_BN_SEND, OnBnSend)ON_MESSAGE(WM_RECEIVE, OnRec

40、eive)ON_MESSAGE(WM_SOCKETCLOSE, OnServerClose)ON_MESSAGE(WM_SEND, OnSend)ON_MESSAGE(WM_CONNCET, OnConnect)ON_LBN_DBLCLK(IDC_LIST_USER, OnDblclkListUser)END_MESSAGE_MAP()/ CClientDlg message handlersBOOL CClientDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMen

41、u(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ 参数初始化m_Socket.Initialize(this);m_strNetIP = _T(“127.0.0.1“);m_iNetPort = 3127;m_bConnect = FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);Ge

42、tDlgItem(IDC_BN_SEND)-EnableWindow(FALSE);return TRUE; / return TRUE unless you set the focus to a controlvoid CClientDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CClientDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context

43、for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);elseCDialog:O

44、nPaint();HCURSOR CClientDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CClientDlg:OnBnConnect() CString strConnectError;/ 获取用户名字CInputDlg inputDlg;int iResult = inputDlg.DoModal();if(iResult=IDCANCEL)return;m_strName = inputDlg.m_strName;/ 创建套接字if(!m_Socket.Create()strConnectError.LoadString(IDS

45、_FAIL_CREATE_SOCKET);ShowInDisplay(strConnectError);return;CString strInfo;strInfo.LoadString(IDS_CONNECTING);ShowInDisplay(strInfo);/ 连接服务器if(!m_Socket.Connect(m_strNetIP, m_iNetPort)int n = m_Socket.GetLastError();strConnectError.LoadString(IDS_FAIL_CONNECT);ShowInDisplay(strConnectError);return;s

46、trInfo.LoadString(IDS_SUCCEED_CONNECT);ShowInDisplay(strInfo);m_bConnect = TRUE;/ 发送自已的名字NETMESSAGE netMessage(PTC_NEW, m_strName, _T(“), _T(“);m_Socket.SendMsg(netMessage);GetDlgItem(IDC_BN_CONNECT)-EnableWindow(FALSE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(TRUE);GetDlgItem(IDC_BN_SEND)-EnableWindow

47、(TRUE);void CClientDlg:OnBnClose() if(m_bConnect) m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)-EnableWindow(TRUE);GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);GetDlgItem(IDC_BN_SEND)-EnableWindow(FALSE);m_lbUser.ResetContent();CString strMsg;strMsg.LoadString(IDS_BREAK);ShowInDisplay(strMsg);void CClientDlg:OnBnSend()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报