基于VC的聊天工具设计(西南科技大学)_第1页
基于VC的聊天工具设计(西南科技大学)_第2页
基于VC的聊天工具设计(西南科技大学)_第3页
基于VC的聊天工具设计(西南科技大学)_第4页
基于VC的聊天工具设计(西南科技大学)_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西南科技大学专业方向设计报告课程名称: 专业方向设计 设计名称:网络通信聊天工具 姓 名:何沐星 学 号: 20096103班 级:通信0903 指导教师:起止日期: 2012.11.26-2012.12.16 西南科技大学信息工程学院制28 / 33方 向 设 计 任 务 书学生班级: 通信0903 学生: 何沐星 学号: 20096103 设计名称: 网络通信聊天工具的设计 起止日期: 2012.11.26-2012.12.16 指导教师:设计要求:(1)通过实际软件项目的分析、设计、编码、测试等工作,掌握用软件工程的方法来开发和维护软件。(2)按要求编写课程设计报告书,能正确编写分析、设

2、计、编码、测试等技术文档和用户使用手册。 (3)进行系统的联合调试,编写系统使用说明。(4)完成系统的文档、设计说明工作方 向 设 计 学 生 日 志时间设计容2012.1128在图书馆以与网上查阅相关资料并整理2012.12. 3运用VC+6.0编写初步源代码2012.126发现并纠正源代码上的错误2012.128找学长帮我做客户端2012.12.13设计成型能发送和接收代码初步达到预期效果2012.12.14写论文并完善相关代码课 程 设 计 评 语 表指导教师评语:成绩: 指导教师: 年 月 日网络通信聊天工具的设计摘 要计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常

3、的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯 、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普与,各种聊天工具也层出不穷,但当我们学习了TCP/IP协议与网络编程这门课程之后,我们便会觉得,其实要实现简单的网络通讯其实并不难。接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。在课程设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C+,数据库采用MS SQL 2000,程序运行平台为Win

4、dows 98/2000/XP。关键词 聊天软件;网络通讯;MFC;课程设计;Visual C+1 引 言1.1课题背景与意义当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。在互联网相当普与的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。而在SOCKET API的帮助下,开发基于SOCKET的局域网通信软件也是易于

5、实现的。1.2 实验平台介绍Visual C+(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C+可视化开发环境。VC基于C,C+语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在Windows平台无所不能。VC主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层的调用。在VC里边嵌入汇编语言很简单。当对系统性能要求很高的时候,可用VC开发。VC在多线程、网络通信、分布应用方面,有着不可比拟的优势。1.3 可行性分析本课程设计主要解决在客户端于客户端的信息交

6、换和客户端于服务器的信息交换与服务器的信息处理上的管理的课程设计。此程序主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。在服务器端的成员列表栏中会显示在线的所有人,有人退出聊天室,成员列表会自动除名。服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。 先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以与服务器的网络地址与服务器

7、进行通信。在这里,把端口号成为“聊天频道” 。在后面的程序代码分析中将看到,端口号并不等同于聊天频道,而是在聊天频道上增加一个固定的偏移值,使得这个聊天频道不会和系统保留的端口发生冲突。 服务器启动后将在这个指定的端口号中等待客户的连接。对于公共聊天室,服务器对客户的数目不做任何限制。而对于私人聊天室,每个聊天频道则只能允许两个客户互相连接,使得一方发送的信息只能到达对方的主机中。这里的服务器提供的是公共聊天服务。 通过分析发现,该程序完全可以通过Visual C+中MFC完成。2需求分析2.1 设计目的综合运用本课程与计算机网络的相关知识设计并实现一个网络应用程序,以Visual C+作为开

8、发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2.2 设计要求 采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。课程设计要求设计并编程完成两个方面的容:首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。2.3 功能要求 支持多个客户端的连接,在服务器和

9、多个客户端之间进行数据传输; 接收客户端发送的消息,并显示在一个列表框中; 在用户连接上后有提示,显示出连接的用户名字; 发送信息时可以显示聊天的所有记录;2.4 系统主要功能和主要功能描述:服务器端聊天程序必须能够做3件事情:(1) 服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。(2) 服务器聊天程序要与时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。(3) 服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项

10、,并与时更新连接表。这些要求可以通过CSocket类提供的功能实现。从CSocket派生出两个类CListenSocket和CClientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字CListenSocket,然后根据客户的连接请求动态创建客户套接字CClientSocket。客户套接字的数量是不可预知的,因此需要一个列表来记录。MFC的CPtrList类就能实现这种功能。客户端聊天程序需要完成以下几个功能:(1) 客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。(2) 客户端聊天程序要把

11、用户输入的信息与时发送到聊天服务器。一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信息发送出去,才能与时地满足用户的交互需求。(3) 要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,让用户与时看到对方的响应。(4) 在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够与时掌握客户端的连接状态,把对方客户的退出信息与时发送到对等实体上。客户端聊天程序需要使用一个通过CSocket类派生出来的CChatSocket类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收聊天信

12、息,完成上述各项功能。3设计流程图根据对用户的要求与功能设置可以得到以下的流程图3.1,用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息,用户向服务器发送信息,服务器处理用户的数据,然后用户开始聊天。客户端的聊天分为对所有人的信息和私聊的信息,该信息应通过程序控制分别进行处理。启动登陆等待客户端登陆客户端用户创建子套接字MessageCListenSocketCClientSocketMessage登陆成功连接上发送message显示找到客户端并显示登陆失败发送ID和IP图3.1 设计流程图4 调试分析过程描述Login服务器:在启动聊天

13、室服务端的时候,会出现图4.1的界面,该界面为服务器的登陆界面。图4.1登陆服务器界面启动服务器:在登陆页面的环境下,点击启动服务器按钮,即可创建一个新的服务器,服务器界面如图4.2所示。图4.2 启动服务器界面Login客户端:在启动客户端服务端的时候,会出现图4.3的界面,该界面为客户端的连接界面。图4.3 登陆客户端界面图4.4为创建三客户端,输入用户名三:图4.4 输入名称三图4.5为用户三连接服务器界面,在输入用户名三并点击确定后,出现如下界面:图4.5 三登陆服务器图4.6为用户四的连接界面,在四连接后,三和四用户同时出现在用户列表:图4.6 四登陆服务器图4.7为用户四的连接界面

14、,在王五连接后,三,四和王五用户同时出现在用户列表:图4.7 王五登陆服务器服务器显示:在三,四,王五进入聊天室后的界面为图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 C+6

17、.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 Aboutclass CAboutDl

18、g : 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:CServerDlg(CWnd* pParent

19、 /*=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(CServerDlg, CDialog)ON_WM_S

20、YSCOMMAND()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 handlersBOOL CServerD

21、lg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = 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.Initia

22、lize(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 & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);

23、void CServerDlg:OnPaint() if (IsIconic()CPaintDC 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(&rect);int x = (rect.Width() - cxIcon + 1) /

24、2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, 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);Sh

25、owInDisplay(strInfo);m_bServer = TRUE;GetDlgItem(IDC_BN_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

26、 *pNewClient = new CMySocket;pNewClient-Initialize(this);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-Rec

27、eive(buffer, BUFFERSIZE)0);p_delClient-Close();/ 在用户链表中删除该用户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;/ 发送信息告诉其他用户该客户

28、退出CString strMsg;strMsg.LoadString(IDS_CLIENT_CLOSE);NETMESSAGE 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() + s

29、trMsg);/ 删除该用户delete p_delClient;void CServerDlg:OnReceive(WPARAM wParam, LPARAM lParam)CMySocket *p_curClient = (CMySocket*)wParam;NETMESSAGE netMessage;p_curClient-Receive(char *)&netMessage, sizeof(netMessage);switch(netMessage.type)case PTC_NEW:/ 新客户加入NewClientAdd(p_curClient, &netMessage);break

30、;case PTC_SAY:/ 普通聊天ShowMessage(netMessage);break;/ 把加工过的信息发送给其他用户SendToAllClient(netMessage);void CServerDlg:CloseServer()if(!m_bServer) return;/ 向所有客户发送服务端关闭的信息CString strInfo;strInfo.LoadString(IDS_CLOSESERVER);NETMESSAGE netMessage(PTC_SYSTEM, _T(), _T(), strInfo);SendToAllClient(netMessage);/ 服

31、务端界面显示关闭信息ShowInDisplay(strInfo);/ 关闭服务端m_Server.Close();/ 关闭客户端char bufferBUFFERSIZE;CMySocket *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_pClien

32、t-Close();delete m_pClient;m_lsClient.RemoveAll();m_bServer = FALSE;/ 向所有户发出信息void CServerDlg:SendToAllClient(const NETMESSAGE &netMessage)CMySocket *m_pClient;POSITION psList = m_lsClient.GetHeadPosition();while(psList!=NULL)m_pClient = (CMySocket *)m_lsClient.GetNext(psList);m_pClient-SendMsg(netM

33、essage);void CServerDlg:ShowInDisplay(CString str)m_strDisplay += str + rn;UpdateData(false);void CServerDlg:OnDestroy() CDialog:OnDestroy();/ TODO: Add your message handler code here/ 新用户加入 void CServerDlg:NewClientAdd(CMySocket *p_client, NETMESSAGE *netMessage)/ 存入用户名字p_client-SetName(netMessage-

34、form);/ 在列表框中显示该用户m_lbUser.AddString(p_client-GetName();/ 发送用户列表给该客户NETMESSAGE netMsg(PTC_USER_LIST, _T(), _T(), _T();int iListLen = m_lbUser.GetCount();CString strMsg;for(int index=m_lbUser.GetTopIndex(); indexSendMsg(netMsg);/ 加工信息strMsg.LoadString(IDS_NEW_CLIENT);strMsg = p_client-GetName() + str

35、Msg;strcpy(netMessage-data, (LPCTSTR)strMsg);/ 显示该用户进入ShowInDisplay(strMsg);/ 显示普通消息void CServerDlg:ShowMessage(NETMESSAGE netMessage)CString strTo = netMessage.to;if(strTo=_T()strTo = 所有人;CString strForm = netMessage.form;CString strMsg = netMessage.data;CString strOut = strForm + 对 + strTo + 说: +

36、strMsg;ShowInDisplay(strOut);II客户端:/ ClientDlg.cpp : implementation file/#include stdafx.h#include Client.h#include 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(

37、);enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV supportprotected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_M

38、ESSAGE_MAP()/ CClientDlg dialogCClientDlg:CClientDlg(CWnd* pParent /*=NULL*/): CDialog(CClientDlg:IDD, pParent)m_strDisplay = _T();m_strSend = _T();m_bWhispering = FALSE;m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CClientDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Co

39、ntrol(pDX, IDC_LIST_USER, m_lbUser);DDX_Text(pDX, IDC_EDIT_DIAPLAY, m_strDisplay);DDX_Text(pDX, IDC_EDIT_SEND, 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, OnBnCo

40、nnect)ON_BN_CLICKED(IDC_BN_CLOSE, OnBnClose)ON_BN_CLICKED(IDC_BN_SEND, OnBnSend)ON_MESSAGE(WM_RECEIVE, OnReceive)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 ha

41、ndlersBOOL CClientDlg:OnInitDialog()CDialog:OnInitDialog();ASSERT(IDM_ABOUTBOX & 0xFFF0) = 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 icon/ 参数初始化m_Socke

42、t.Initialize(this);m_strNetIP = _T(127.0.0.1);m_iNetPort = 3127;m_bConnect = FALSE;GetDlgItem(IDC_BN_CLOSE)-EnableWindow(FALSE);GetDlgItem(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 & 0

43、xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);void CClientDlg:OnPaint() if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon =

44、GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();HCURSOR CClientDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;void CClientDlg:OnBnConnect() CString strConnectE

45、rror;/ 获取用户名字CInputDlg inputDlg;int iResult = inputDlg.DoModal();if(iResult=IDCANCEL)return;m_strName = inputDlg.m_strName;/ 创建套接字if(!m_Socket.Create()strConnectError.LoadString(IDS_FAIL_CREATE_SOCKET);ShowInDisplay(strConnectError);return;CString strInfo;strInfo.LoadString(IDS_CONNECTING);ShowInDis

46、play(strInfo);/ 连接服务器if(!m_Socket.Connect(m_strNetIP, m_iNetPort)int n = m_Socket.GetLastError();strConnectError.LoadString(IDS_FAIL_CONNECT);ShowInDisplay(strConnectError);return;strInfo.LoadString(IDS_SUCCEED_CONNECT);ShowInDisplay(strInfo);m_bConnect = TRUE;/ 发送自已的名字NETMESSAGE netMessage(PTC_NEW,

47、 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(TRUE);void CClientDlg:OnBnClose() if(m_bConnect) m_Socket.Close();m_bConnect = FALSE;GetDlgItem(IDC_BN_CONNECT)-EnableWi

48、ndow(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() OnSend();m_strSend = _T();UpdateData(FALSE);void CClientDlg:OnReceive()NETMESSAGE netMessage;m_Socket.Receive(char *)&netMessage, sizeof(netMessage);CString strForm = netMessage.form;/ 过滤自已发出的信息if(strForm=m_strName) return;CString strTo = netMes

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论