ImageVerifierCode 换一换
格式:DOC , 页数:26 ,大小:1.03MB ,
资源ID:3778418      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/3778418.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(用VC++简单的多线程聊天室程序完整课程设计分析知识分享.doc)为本站上传会员【w****g】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

用VC++简单的多线程聊天室程序完整课程设计分析知识分享.doc

1、 课 程 设 计 书 学院 计算机学院 专业 计算机科学与技术 班级 题目 局域网聊天室程序 教师 学生 课程设计任务书 课程名称 VC++课程设计 时间 题 目 局域网聊天室程序 主要内容: 该系统要求完成聊天室的全过程,包括客户端和

2、服务器两大部分的编程及其连接。服务器端聊天程序负责接收和发送来自客户端的聊天信息,客户端聊天程序负责建立和维护与服务器端的连接,想服务器发送本客户的聊天内容。系统采用VISUAL C++语言程序设计编程实现。 要求: (1)通过实际软件项目的分析、设计、编码、测试等工作,掌握用软件工程的方法来开发和维护软件。 (2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户使用手册。 (3)进行系统的联合调试,编写系统使用说明。 (4)完成系统的文档、设计说明工作 任务分配: 计科098班:XX主要负责程序框架设计和服务端代码编写 计科098班:XX主要

3、负责客服端代码编写 计科096班:XX主要负责软件测试及调试 目录 摘 要 2 1 引 言 3 1.1课题背景及意义 3 1.2 实验平台介绍 3 1.3 可行性分析 3 2需求分析 5 2.1 设计目的 5 2.2 设计要求 5 2.3 功能要求 5 2.4 系统主要功能和主要功能描述 5 3设计流程图 7 4 调试分析过程描述 9 5核心代码 16 5.1服务端 16 5.2客服端 21 6 设计的总结和体会 24 7 参考文献 24 局域网聊天室程

4、序 摘 要 计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷,但当我们学习了《windows程序设计》这门课程之后,我们决定设计一个简单的聊天系统来巩固我们的学习。接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。在课程设计中,系统开发平台为Windows XP,程

5、序设计设计语言采用Visual C++,数据库采用Access,程序运行平台为Windows 98/2000/XP。 关键词 聊天软件;局域网;MFC; Visual C++;多线程 1 引 言 1.1课题背景及意义 当今世界正处于信息时代,计算机和通信网络是这一时代所谓“信息基础设施”。在互联网相当普及的今天,在互联网上聊天对很多“网虫”来说已经是家常便饭了。聊天室程序可以说是网上最简单的多点通信程序。一个简单的聊天室, 从程序员的观点来看就是在多个I/O端点之间实现多对多的通信。基于SOCKET的局域网通信是一种灵活的、易于实现的、低成本的方法。它可以运行在各种使用TC

6、P/IP协议作为通讯协议的网络上。而在SOCKET API的帮助下,开发基于SOCKET的局域网通信软件也是易于实现的。 1.2 实验平台介绍 Visual C++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 Windows平台无所不能。VC主要是针对Windows系统,适合一些系统级 的开发,可以方便实现一些底层 的调用。在VC里边嵌入汇编语言很简单。当对系统性能要求很高

7、的时候,可用VC开发。VC在多线程、网络通信、分布应用方面,有着不可比拟的优势。 1.3 可行性分析 本课程设计主要解决在客户端于客户端的信息交换和客户端于服务器的信息交换及服务器的信息处理上的管理的课程设计。 此程序主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。整个程序的主体

8、使用了CSocket类的方法,实现了网络通讯聊天。 先启动服务器端聊天程序,这是聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的网络地址与服务器进行通信。在这里,把端口号成为“聊天频道” 。 在后面的程序代码分析中将看到,端口号并不等同于聊天频道,而是在聊天频道上增加一个固定的偏移值,使得这个聊天频道不会和系统保留的端口发生冲突。 服务器启动后将在这个指定的端口号中等待客户的连接。对于公共聊天室,服务器对客户的数目不做任何限制。而对于私人聊天室,每个聊天频道则只能允许两个客户互相连接,使得一方发送的信息只能到达对方的主机中。这里的服务器提供的是公共聊天服务。

9、通过分析发现,该程序完全可以通过Visual C++中MFC完成。 2需求分析 2.1 设计目的   综合运用本课程及计算机网络的相关知识设计并实现一个网络应用程序,以Visual C++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。 2.2 设计要求 采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接

10、 课程设计要求设计并编程完成两个方面的内容:首先建立一个使用TCP协议的聊天室服务器,这个服务器可以同时支持多个用户的在线聊天;其次设计一个可以和服务器通信的聊天室客户端。 2.3 功能要求 ² 支持多个客户端的连接,在服务器和多个客户端之间进行数据传输; ² 接收客户端发送的消息,并显示在一个列表框中; ² 在用户连接上后有提示,显示出连接的用户名字; ² 发送信息时可以显示聊天的所有记录; 2.4 系统主要功能和主要功能描述 服务器端聊天程序必须能够做3件事情: (1) 服务器聊天程序要在待定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记

11、录所有成功的连接。 (2) 服务器聊天程序要及时接受从各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。对于公共聊天室,服务器将把接受到的信息向除源端外的所有客户发送过去。 (3) 服务器还要监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。 客户端聊天程序需要完成以下几个功能: (1) 客户端聊天程序要负责建立和维护与服务器的连接,通过获取用户的设置尝试与服务器的连接,并且随时检测连接的状态。 (2) 客户端聊天程序要把用户输入的信息及时发送到聊天服务器。一般情况下,当用户输入一行信息并且按下回车键后聊天程序就要把这一行信

12、息发送出去,才能及时地满足用户的交互需求。 (3) 要随时准备好接受来自服务器的信息,随时把接受到的信息显示出来,让用户及时看到对方的响应。 (4) 在用户退出聊天过程是要关闭与服务器的连接。比较好的做法是提前通知服务器或者直接给服务器发送一条退出通知,使得服务器能够及时掌握客户端的连接状态,把对方客户的退出信息及时发送到对等实体上。 3设计流程图 根据对用户的要求及功能设置可以得到以下的流程图3.1,用户首先启动客户端,登陆服务器并向服务器发送信息,启动服务器,服务器等待客户要求并向客户反馈在线用户信息,用户向服务器发送信息,服务器

13、处理用户的数据,然后用户开始聊天。客户端的聊天分为对所有人的信息和私聊的信息,该信息应通过程序控制分别进行处理。 图3.1 设计流程图 4 调试分析过程描述 n 在聊天客服端启动的时候对端口进行监听,会出现图4.1的界面。 图4.1登陆服务器界面 n 在客户端启动的时候,会出现图4.2的界面,该界面为客户端的连接界面。 图4.2 登陆客户端界面(客服端1) 图4.2 登陆客户端界面(客服端2) n 图4.3为用户张三和李四连接服务器时的界面 图4.3

14、 张三登陆服务器 图4.3李四登陆服务器 n 图4.4为用户李四发送消息的服务器界面 图4.4 李四发送消息服务端界面 n 图4.5为用户张三发送消息的服务器界面 图4.4 张三发送消息服务端界面 n 图4.6为用户李四发送消息的客服端界面 图4.6李四发送消息的客服端界面 n 图4.7为用户张三发送消息的客服端界面 图4.7张三发送消息的客服端界面 5核心代码 5.1服务端 (1).启动监听 UpdateData(TRUE); //更新数据到类成员 GetDlgIte

15、m(IDC_BTNSTART)->EnableWindow(FALSE); GetDlgItem(IDC_BTNSEND)->EnableWindow(TRUE); g_ServerSocket=socket(AF_INET,SOCK_STREAM,0); //创建套接字 if( INVALID_SOCKET == g_ServerSocket) { MessageBox("创建套接字失败!"); return ; } SOCKADDR_IN svraddrsock; svraddrsock.sin_addr.S_un.S_addr=hton

16、l(INADDR_ANY); svraddrsock.sin_family=AF_INET; svraddrsock.sin_port=htons(m_port); if ( SOCKET_ERROR == bind(g_ServerSocket,(SOCKADDR*)&svraddrsock,sizeof(SOCKADDR))) { MessageBox("套接字绑定失败!"); return ; } listen(g_ServerSocket,10); //监听套接字 //创建接收线程 m_hAcceptthread=CreateThread(

17、NULL,0,AcceptThread,NULL,0,NULL); if (m_hAcceptthread ==NULL) { MessageBox("创建接收连接线程失败!"); return ; } g_hmutex=CreateMutex(NULL,FALSE,NULL); //创建互斥量 (2).监听请求连接线程 //接收连接 DWORD WINAPI AcceptThread( LPVOID lpParameter) { SOCKADDR_IN serveraddr; int addrlen=sizeof(SOCKADDR);

18、 SOCKET RecvSocket;//recv后返回的套接字 RecvSocket=accept(g_ServerSocket,(SOCKADDR *)&serveraddr,&addrlen); g_ClientSocket = RecvSocket; if ( INVALID_SOCKET==RecvSocket) { AfxMessageBox("接受连接失败!"); return FALSE; } BOOL ContinueFlag=TRUE; while (ContinueFlag&&TRUE) { g_Mutex.Lock()

19、 BYTE recvBuff[RECV_DATA_SIZE + 2]={0}; int recvlength=sizeof(recvBuff); int recvedSize = 0; recvedSize = recv(RecvSocket,(char*)recvBuff,recvlength,0); if(SOCKET_ERROR == recvedSize) { int x=WSAGetLastError(); CString str; //WSANOTINITIALISED str.Format("错误代码:%

20、d", x); AfxMessageBox(str); break ; } CStringArray RecvData; UINT CmdFlag; CChatRoomServerDlg::Split((char*)recvBuff,'|',RecvData); //将收到的数据进行分离 if (RecvData.GetSize()<=0) { continue ; } CmdFlag=atoi(RecvData.GetAt(0).GetBuffer(RecvData.GetAt(0).GetLength())

21、); int i=0; //记录循环次数的变量 BOOL comeFlag=TRUE ;//是否加入用户列表的标记 CTime iotime; CString StrRecord=""; //聊天内容 CString strTemp=""; CString strTemp1=""; char sendBuff[1024]={0}; int j=0; CChatRoomServerDlg *ServerDlg=(CChatRoomServerDlg *)AfxGetApp()->GetMainWnd(); //解析客服端发来的

22、消息以便确定消息的类型 switch(CmdFlag) { case CONNECT: //用户发来的连接请求 //对用户发来的用户名和密码进行判断 strTemp = CString(RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength())); ZeroMemory(sendBuff,1024); //将JOIN命令和用户名填入缓冲区 sprintf(sendBuff,"5|%s|",RecvData.GetAt(1).GetB

23、uffer(RecvData.GetAt(1).GetLength())); for( i=0;iUserSocket; if (RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()) != User[i].UserName) { if(SOCKET_ERROR == send(User[i].UserS

24、ocket,sendBuff,strlen(sendBuff),0)) { AfxMessageBox("connect 中向各用户发送消息失败!"); break; } } } //向该用户发送一条LIST消息使其将所有在线用户加入用户列表 ZeroMemory(sendBuff,1024); strTemp="3|"; for(i=0;i

25、GetAt(1).GetLength()) != User[i].UserName) { strTemp+=User[i].UserName; strTemp+="|"; } } sprintf(sendBuff,"%s",strTemp); if(count>0) { if(SOCKET_ERROR ==send(RecvSocket,sendBuff,strlen(sendBuff),0)) { AfxMessageBox("connect中发送List数据

26、失败!"); break ; } } //将该用户加入用户列表 for(i=0;i

27、uffer(RecvData.GetAt(1).GetLength()); User[count].UserSocket=RecvSocket; count++; } //将用户登陆成功发送给用户 ZeroMemory(sendBuff,1024); sprintf(sendBuff,"1|%s|", RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength())); if( SOCKET_ERROR ==send(RecvSocket,sendB

28、uff,strlen(sendBuff),0)) { AfxMessageBox("CONNECT中向客户端发送登陆成功消息失败!"); break ; } //在服务器上加入用户信息 ServerDlg->AddToUserList( RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()));//将用户加入用户列表 strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).

29、GetLength()); iotime=CTime::GetCurrentTime(); strTemp1=iotime.Format(" 于:%Y年%m月%d日 %H:%M:%S登录"); strTemp+=strTemp1; strTemp1="服务器"; ServerDlg->SetChatRecord(strTemp1,strTemp); break; case CHAT: //群聊 ZeroMemory(sendBuff,1024); //向所有其他在线的用户转发收到的消

30、息 sprintf(sendBuff,"2|%s|%s|", RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()), RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength())); for( i=0;i

31、{ send(User[i].UserSocket,sendBuff,strlen(sendBuff),0); } } // 将收到的消息显示在服务器消息记录框中 ServerDlg->SetChatRecord( RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()), RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength())

32、); break; case EXIT: for(i=0;i

33、r[j+1].UserName; User[j].UserSocket=User[j+1].UserSocket; } } } //把退出的用户从服务器用户列表中删除,同时向聊天记录中更新一条退出的消息 strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()); ServerDlg->DeleteFromUserList(strTemp);//将用户从服务器“用户列表”中删除 iotime=CTime::Get

34、CurrentTime(); strTemp1=iotime.Format(" 于:%Y年%m月%d日 %H:%M:%S下线"); strTemp+=strTemp1; strTemp1="服务器"; ServerDlg->SetChatRecord(strTemp1,strTemp); //向其他用户发送QUit消息 ZeroMemory(sendBuff,1024) sprintf(sendBuff,"6|%s|", RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength

35、))); for( i=0;iSetChatRecord(strTemp1,strTemp); break; } RecvData.RemoveAll(); g_Mutex.Unlock(); Sleep(10); } return TRUE; } 5.2客服端 (1).建立连接 UpdateData(TRUE); if (m_username.IsEmpty()||m_pwd.IsEmpty()) { MessageBox("用户名或密码不能为空!");

37、 return ; } g_ClientSocket=socket(AF_INET,SOCK_STREAM,0); //创建套接字 if( INVALID_SOCKET == g_ClientSocket) { MessageBox("创建套接字失败!"); return ; } DWORD dwIP; ((CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN clientaddr; clientaddr.sin_family=AF_INET

38、 clientaddr.sin_port=htons(m_port); clientaddr.sin_addr.S_un.S_addr=htonl(dwIP); if ( SOCKET_ERROR == connect(g_ClientSocket,(SOCKADDR *)&clientaddr,sizeof(SOCKADDR))) { MessageBox("连接服务器失败!"); return ; } char sendBuff[1024]={0}; sprintf(sendBuff,"1|%s|%s|",m_username.GetBuffer(

39、m_username.GetLength()),m_pwd.GetBuffer(m_pwd.GetLength())); int sendlength=strlen(sendBuff); if ( SOCKET_ERROR == send(g_ClientSocket,sendBuff,sendlength,0)) //连接成功后将用户名和密码发给服务器 { MessageBox("发送连接请求数据失败!"); return ; } hRecvThread=CreateThread(NULL,0,RecvThread,NULL,0,NULL); //创建客户

40、端接收数据线程 GetDlgItem(IDC_BTNSEND)->EnableWindow(TRUE); GetDlgItem(IDC_USERLOAD)->EnableWindow(FALSE); (2).接受数据线程 DWORD WINAPI RecvThread(LPVOID lpParameter) { while (TRUE) { g_Mutex.Lock(); BYTE recvBuff[RECV_DATA_SIZE + 2]={0}; int bufflength=sizeof(recvBuff); int recv

41、edSize = 0; //Sleep(100); recvedSize = recv(g_ClientSocket,(char*)recvBuff,bufflength,0); if ( SOCKET_ERROR == recvedSize) { AfxMessageBox("接收数据失败!"); break ; } CStringArray RecvData; CChatRoomClientDlg::Split((char*)recvBuff,'|',RecvData); //此函数不会分解AUDIO命令,直接交个cas

42、e处理 if (RecvData.GetSize()<=0) { continue ; } UINT CmdFlag=atoi(RecvData.GetAt(0).GetBuffer(RecvData.GetAt(0).GetLength())); int i=0; //循环时使用的增加量 CString strRecord=""; CString strTemp=""; CChatRoomClientDlg *ClientDlg=(CChatRoomClientDlg *)AfxGetApp()->GetMainWnd();

43、switch( CmdFlag) { case OK: strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()); strRecord="登陆成功"; ClientDlg->SetChatRecord(strTemp,strRecord); break; case CHAT: //群聊 strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()); strRe

44、cord=RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength()); ClientDlg->SetChatRecord(strTemp,strRecord); break case LIST: for(i=1;iAddToUserList(str

45、Temp); } break; case PRIVATE: strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()); strTemp+="悄悄地对你"; strRecord=RecvData.GetAt(2).GetBuffer(RecvData.GetAt(2).GetLength()); ClientDlg->SetChatRecord(strTemp,strRecord); break; case JOIN : st

46、rTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()); ClientDlg->AddToUserList(strTemp); break; case QUIT: strTemp=RecvData.GetAt(1).GetBuffer(RecvData.GetAt(1).GetLength()); ClientDlg->DeleteFromUserList(strTemp); break; default: strTemp="服务器";

47、 strRecord="无法识别的指令"; ClientDlg->SetChatRecord(strTemp,strRecord); if (g_ClientSocket) { closesocket(g_ClientSocket); } break; } RecvData.RemoveAll(); g_Mutex.Unlock(); Sleep(10); } return TRUE; } (3).发送数据 char sendBuff[1024]={0}; CStri

48、ng sendMsg=""; CString strTemp=""; GetDlgItemText(IDC_EDIT_MSG,sendMsg); if (sendMsg.IsEmpty()) { return ; } //将发送的内容发给服务器 sprintf(sendBuff,"2|%s|%s|",m_username,sendMsg.GetBuffer(sendMsg.GetLength())); if(SOCKET_ERROR==send(g_ClientSocket,sendBuff,strlen(sendBuff),0)) { Mess

49、ageBox("数据发送失败!"); return ; } //将发送的内容更新到自己的聊天记录中 GetDlgItemText(IDC_EDITCHATMSG,strTemp); strTemp+="\r\n"; strTemp+=m_username; strTemp+="说:"; strTemp+=sendMsg; SetDlgItemText(IDC_EDITCHATMSG,strTemp); SetDlgItemText(IDC_EDIT_MSG,""); 6 设计的总结和体会 通过这学期对windows的学习以及以往对w

50、indow程序设计的理解并在学校图书馆查阅相关资料,最终通过大家的努力完成了这个简单的局域网通信程序。虽然是个小程序,但通过这个程序的开发,让我们对windows程序设计的一些相关的知识得以巩固,也提升我们对windows程序的认识。 在此次开发过程中,我们使用了多线程的编程方式将数据监听也数据的接受都做为一个线程来处理。并在接受数据线程里分解了发送来的数据并根据不同的命令来执行不同的操作,这也是本程序的核心部分。通过这个程序我们理解了怎样去建立一个TCP连接,以及如何使用TCP进行数据的传输。 7 参考文献 [1] 任泰明著. TCP/IP协议与网络编程. 西安电子科技大学出版社.

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服