p2p即时聊天系统
- 格式:doc
- 大小:1.10 MB
- 文档页数:19
网络实时聊天与他人实时交流的互联网小工具推荐随着互联网技术的快速发展和普及,人们对即时交流的需求不断增加。
为了满足这种需求,各种网络实时聊天工具应运而生。
本文将为您推荐几种常用的互联网小工具,帮助您实现与他人的实时交流。
一、QQQQ是由腾讯公司开发的一款著名的网络实时聊天工具。
它提供了文字聊天、语音聊天、视频聊天等多种功能,用户可以通过QQ号码进行互相添加好友,并与好友进行实时交流。
QQ还可以创建群组,方便用户与多人进行群聊,分享信息和讨论问题。
此外,QQ还提供了一系列的娱乐功能,如QQ游戏、QQ空间等,为用户带来更多的互动乐趣。
二、微信微信是由腾讯公司开发的一款热门的社交类应用程序。
它不仅可以实现文字聊天、语音聊天、视频聊天等实时交流功能,还提供了朋友圈、公众号、小程序等多种功能。
微信号作为用户的唯一标识,方便用户之间添加好友,并进行互相的实时交流。
微信还支持群聊功能,用户可以创建或加入不同的群组,和多人进行实时的群聊、共享和讨论。
微信还支持钱包功能,用户可以通过微信进行支付、转账等操作。
三、SkypeSkype是一个著名的网络电话工具,提供了免费的实时语音通话和视频聊天功能。
用户可以通过Skype账号添加好友,并与好友进行实时语音和视频的交流。
Skype还提供了文本消息、文件传输等功能,方便用户在实时通话过程中分享信息和文件。
此外,Skype还支持多人会议功能,用户可以通过Skype进行多人语音、视频会议,实现远程团队协作和互动交流。
四、微博微博是一种基于网络平台的社交媒体工具,用户可以在上面发布和分享文字、图片、视频等多媒体内容,并与其他用户进行互动交流。
微博不仅可以实现点赞、评论、转发等基本功能,还提供了私信、@提醒等实时交流功能。
用户可以通过关注其他用户,及时获取他们发布的动态信息,并与其进行实时的互动交流。
微博还支持创建和加入不同主题的话题讨论,用户可以在话题下与其他用户一起讨论、分享观点和交流见解。
P2P怎么用什么是P2PP2P,即点对点,是指一种计算机网络结构,其中所有计算机节点在网络中具有同等的地位,可以进行互相通信和共享资源,而不需要经过集中的服务器。
P2P的应用P2P网络在许多领域中得到广泛应用,如文件共享、实时通信、视频流媒体等。
其中最著名的应用之一是BitTorrent,它以P2P的方式进行文件共享,用户可以通过该协议下载和分享各种文件。
P2P如何使用想要使用P2P进行文件共享或其他操作,可以按照以下步骤进行:1. 选择P2P软件首先,需要选择适合自己需求的P2P软件。
目前市面上有很多P2P软件可供选择,其中一些最受欢迎的软件包括BitTorrent、eMule和Ares等。
它们都提供了各自独特的功能和界面,根据自己的需求选择一个合适的软件。
2. 下载并安装软件选择好合适的P2P软件后,需要前往官方网站或可信的软件下载网站下载该软件。
根据操作系统的不同,选择对应的版本进行下载。
下载完成后,按照软件的安装向导进行软件的安装,完成后即可打开软件进行配置。
3. 配置P2P软件打开安装好的P2P软件,根据软件提供的向导或界面进行配置。
通常需要设置一些基本信息,例如下载目录、上传带宽限制等。
在配置过程中,可以根据自己的需求进行适当的调整,以便获得最佳的使用体验。
4. 查找资源并下载配置完成后,可以通过软件提供的搜索功能查找到所需资源。
一般来说,P2P软件都有一个搜索框,用户可以输入关键字搜索感兴趣的文件。
搜索结果将显示出符合条件的资源列表,用户可以选择合适的资源进行下载。
5. 共享自己的资源P2P不仅可以下载资源,还可以共享自己的资源给其他用户。
在P2P软件中,一般有一个共享目录,用户可以将自己想要分享的文件放置在这个目录中。
其他用户可以通过搜索功能找到并下载这些文件。
6. 保护隐私和安全在使用P2P软件时,要注意保护个人隐私和计算机安全。
确保自己的操作系统和安全软件都是最新的,并避免下载不安全的文件或使用未经验证的软件。
点对点聊天和文件传输程序摘要本程序使用VB语言编程,使用WinSock控件完成的点对点(P2P)聊天和文件传输程序。
可以实现两台机器间互发消息,并且有聊天和文件传输记录,安全可靠。
关键词p2p WinSock,聊天和文件传输程序,VB目录第一章开发背景 (3)1.1P2P的概念 (3)1.2P2P的思想溯源 (5)1.3P2P内容转移到“边缘” (7)1.4重新解读P2P (9)第二章开发环境及实现技术 (12)2.1开发环境 (12)2.2开发工具简介 (12)第三章系统设计 (14)3.1概要设计 (14)3.2详细设计 (15)第四章系统的实现 (17)4.1主界面的实现 (17)4.2点对点聊天模块的实现 (20)4.2.1服务器端子模块的实现 (20)4.2.2客户端子模块的实现 (23)4.3点对点文件传输模块的实现 (26)4.3.1服务器端子模块的实现 (26)4.3.3客户端子模块的实现 (31)4.4上网功能模块的实现 (35)设计心得 (38)参考文献 (39)第一章开发背景P2P是一种技术,但更多的是一种思想,有着改变整个互联网基础的潜能的思想。
1.1p2p的概念P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。
这样一来,P2P也就可以理解为“伙伴对伙伴”的意思,或称为对等联网。
目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。
简单的说,P2P直接将人们联系起来,让人们通过互联网直接交互。
P2P 使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。
P2P 就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。
P2P另一个重要特点是改变互联网现在的以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。
P2P 看起来似乎很新,但是正如B2C、B2B是将现实世界中很平常的东西移植到互联网上一样,P2P并不是什么新东西。
即时通信是目前互联网最为流行的通信方式,各种各样的即时通信软件页层出不穷。
随着互联网的发展以及3G网络的到来,即时通信的应用将更加广泛,因此,研究并学习即时通信系统的开发技术对未来发展很有意义。
1..系统规划:需要了解系统设计的基本目录、组织结构及功能结构等,对任何系统开发而言这是最基本的要求,只有规划好了。
后面开发中不过才会做到有放矢。
(1).系统功能结构:1.登录认证与注册创建的功能。
2.peer间的即时通讯功能。
3.文件交互功能。
4.文件共享功能。
5.其他功能1.登录认证与注册创建的功能。
在程序启动后又一个登录与注册的界面,在这个界面中用户可以有两种选择。
%第一个选择:可以根据当前的频道列表显示的的信息,选择当前网络中已有的一个P2P频道,输入此频道的认证密码后。
加入该频道、%第二个选择:用户可以创建一个新的P2P频道,输入用户明显横、频道的名称和认证密码后,一个新的频道就窗前好了。
注意:这里所说的频道是一个模拟的P2P网络,用在即时通信系统中类似聊天室的功能。
以上两种选择等价于。
第一种选择,当你要加入一个聊天室时,只需选择一个已有聊天室的名字,然后输入你的用户名和聊天室的认证密码,就可以加入此聊天室了。
而第二种选择,可以创建一个新聊天室,自定义聊天室的名字和密码,这样,别人就可以加入这个聊天室2.peer间的即时通讯功能Peer的即时通信,确切的说应该是同一个P2P频道内的所有peer间的通信,这个通信过程包括两个方面:%一方面:所有peer间的广播通信,类似于多人聊天室,某一peer发布的信息,在同一个P2P频道内的所有peer到能接收到此信息。
%另一方面:两个peer间的私有通信,通信过程是在两个peer之间进行的,其他peer不参与这一过程,通信的消息内容对其他peer不可见。
3.文件交互功能。
文件交互功能包括文件的发送和接收,peer一端可以向同一频道内的所有peer发送文件,也可以接收来自同一频道内的其他任何peer 发送的文件。
本科毕业论文(设计)博网即时通讯软件的设计与实现目录1. 绪论 (1)1.1. 开发背景 (1)1.2. 开发意义 (1)2. 系统设计相关技术 (1)2.1 Java语言 (1)2.2 MySQL数据库 (2)2.3 Socket (2)3. 系统需求分析 (3)3.1 可行性分析 (3)3.2 需求分析 (4)3.3 系统流程图 (5)3.4 非功能性需求 (6)4. 系统设计 (7)4.1 系统功能结构 (7)4.2 数据库设计 (8)5. 系统实现 (10)5.1 系统运行环境和开发平台 (10)5.2 系统实现 (11)6. 系统测试 (17)6.1 测试内容 (18)6.2 测试预期结果 (18)6.3 测试用例 (18)6.4 测试结果 (19)7. 结语 (20)参考文献 (21)博网即时通讯软件的设计与实现摘要:即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。
使用ECLIPSE作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,SWING技术等进行实际开发相对比较合适。
通过一些轻松的注册登录后,在局域网中即时聊天便可以成功进行。
关键字:即时通讯软件,局域网聊天,Java,Socket1. 引言1.1 开发背景随着信息社会的快速发展,网络作为改变世界的最重要的因素。
众多的企业纷纷使用局域网聊天来满足工作与交流高效、快速执行的需求。
企业中使用内部局域网可以使内部信息交互的过程得以简化,从而达到提高工作效率的目的[1]。
所以经上所述,公司内部使用即时通讯的方式在各台计算机之间进行交流已经是时代发展的趋势。
即时通讯软件即所谓的聊天工具,作为进行文字传输、文件传输的工具被使用在互联网的客户端上。
从专业角度来介绍,即时通讯软件一般分为依赖于服务器的与依赖于P2P的[2]。
从现状来看,互联网上深受用户喜爱的即时通讯软件主要有以下几个:微信、QQ、YY、飞秋等等[5]。
什么是P2P1点对点技术(peer-to-peer,简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。
P2P 网络通常用于通过Ad Hoc连接来连接节点。
这类网络可以用于多种用途,各种档案分享软件已经得到了广泛的使用。
P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中。
2 P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。
这样一来,P2P也就可以理解为“伙伴对伙伴”的意思,或称为对等联网。
目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。
简单的说,P2P直接将人们联系起来,让人们通过互联网直接交互。
P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。
P2P就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载。
P2P 另一个重要特点是改变互联网现在的以大网站为中心的状态、重返“非中心化”,并把权力交还给用户。
P2P看起来似乎很新,但是正如B2C、B2B是将现实世界中很平常的东西移植到互联网上一样,P2P并不是什么新东西。
在现实生活中我们每天都按照P2P模式面对面地或者通过电话交流和沟通。
P2P的发展简史1999年,文件共享系统Napster诞生。
Napster是最早的P2P实用系统,参与系统的是大量个人计算机用户,每个用户将自己愿意共享的文件提供出来,同时可以下载其他用户共享的文件。
Napster需要解决的核心问题是必须知道哪些机器上有哪些文件,这样当用户提出文件搜索请求时才可以得到正确的匹配结果。
在Napster中使用一个中心服务器,称为目录服务器,存放所有文件的元数据信息(文件的标题和一些简单的描述信息)以及其存放结点的IP地址。
结点加入系统时首先要连接目录服务器并报告自身地址及共享的文件列表。
ICQ,互联网上最流行的即时信息传递软件。
名称来自I seek you (我在找你),它支持在 Internet 上聊天、发送消息和文件等。
作为IM软件领域的缔造者,不得不说它成就了一个辉煌。
1996年7月成立的Mirabilis公司于同年11月推出了全世界第一款即时通讯软件ICQ(目前ICQ已经归AOL旗下所有),取意为"我在找你"--"I Seek You",简称ICQ。
这款软件一经推出,即刻全球响应,凭借着前所未有的创意很快在全世界拥有了大批的用户,即使在当时互联网不太发达的亚洲,市场用户量也占到了70%,在国内更是占到了80%。
但是到了现在,根据调查显示,国内如今的IM软件排名中ICQ只排到了第8位,差距竟如此之大。
QQ是XX市腾讯计算机系统XX开发的一款基于Internet的即时通信(IM)软件。
腾讯QQ支持在线聊天、视频、点对点断点续传文件、共享文件、网络硬盘、自定义面板、QQ等多种功能。
并可与移动通讯终端等多种通讯方式相连。
1999年2月,腾讯正式推出第一个即时通信软件——“腾讯QQ”,QQ在线用户由1999年的2人到现在已经发展到上亿用户了,在线人数超过一亿。
是目前使用最广泛的聊天软件之一。
MSN全称Microsoft Service Network(微软网络服务),是微软公司推出的即时消息软件,可以与亲人、朋友、工作伙伴进行文字聊天、语音对话、视频会议等即时交流,还可以通过此软件来查看联系人是否联机。
微软MSN移动互联网服务提供包括手机MSN(即时通讯Messenger)、必应移动搜索、手机SNS(全球最大Windows Live在线社区)、中文资讯、手机娱乐和手机折扣等创新移动服务,满足了用户在移动互联网时代的沟通、社交、出行、娱乐等诸多需求,在国内拥有大量的用户群。
另外,msn还表示“忙啥呢”以与“美少年or 美少女”等的简称。
Google Talk是Google 的即时通讯方式,简称Gtalk。
一、课程设计题目基于P2P的局域网即时通信系统二、实验环境及工具1.计算机:PC机,PC虚拟机,2.操作系统:Windows2000,WindowsXP3.程序设计语言:VC 6.0三、设计要求1.实现一个图形用户界面局域网内的消息系统。
2.功能:建立一个局域网内的简单的P2P消息系统,程序既是服务器又是客户,服务器端口使用3333。
a)用户注册及对等方列表的获取:对等方A启动后,用户设置自己的信息(用户名,所在组);扫描网段中在线的对等方(3333端口打开),向所有在线对等方的服务端口发送消息,接收方接收到消息后,把对等方A加入到自己的用户列表中,并发应答消息;对等方A把回应消息的其它对等方加入用户列表。
双方交换的消息格式自己根据需要定义,至少包括用户名、IP地址。
b)发送消息和文件:用户在列表中选择用户,与用户建立TCP连接,发送文件或消息。
3.用户界面:界面上包括对等方列表;消息显示列表;消息输入框;文件传输进程显示及操作按钮或菜单。
四、设计内容与步骤1.学习Socket和TCP的基本原理和通信机制;2.功能设计和界面设计3.服务器功能的设计和实现4.客户功能的设计和实现5.课程设计任务说明书五、方案设计1.消息格式本系统采用的消息格式是,文件头+消息内容文件头为‘1’-‘9’,消息格式分配如下:‘1’+本机名:登陆,发送给所有在线对等方的服务端口‘2’+本机名:对登陆消息的回馈‘3’+本机名:退出‘4’+本机名:对话请求“51”或”52”:对话请求的回应(是否同意)‘6’+本机名+”退出对话”:退出对话‘7’+对话内容:对话‘8’+文件名长度+文件名+文件长度(转换成CString):请求传送“91”同意传输“92”拒绝“93”磁盘已满2.该软件分别开了3个监听端口:3333、3334、3335。
之所以分开3个端口是因为各种传送的不同,在设计实验的过程中我发现对于登陆消息,退出消息,应该用的socket是即用即断,即比如我收到登陆消息,并发送回馈消息后就断开连接,这样就不用一个用户同时连接很多用户,如果用完不断,就是全连接了。
而文件传输应该跟对话传输分开,因此应该再开一个端口。
3.在线用户的扫描:本软件是通过扫描局域网内的在线用户(不一定打开软件),然后一一发送登陆信息,如果收到登陆信息就在列表上增加用户并发送回馈,如果收到回馈就在列表上增加用户,如果收到退出消息就删除用户。
4.文件传输原本打算使用多线程文件传输,及发送端开多个线程同时读一个文件并发送,接收端在磁盘开辟一个与接收文件大小一致的一个文件,然后接收端开多个线程接收并各自负责写进特定文件位置,不过由于Socket匹配问题,因此还是使用单线程传输比较简单一点。
六、方案实现及主要程序1.工程中的类(1).本软件中分别有三个CAsyncSocket的派生类,分别是C CtrlSocket,CTalkSocket,CFileSocketa)CCtrlSocket:用于接收及发送控制信息,包括文件头为‘1’(登陆);‘2’(回馈);‘3’(退出);‘4’(对话请求);’5’(对话请求的回应)的消息,对应监听端口是CTRLPORT——3333b)CTalkSocket:用于接收及发送对话信息,及部分文件控制信息。
包括文件头为‘6’(退出对话);‘7’(对话);‘8’(请求传送);‘9’(传送回应)的消息,对应监听端口是TALKPORT——3334c)CFileSocket:用于发送及接收文件,对应监听端口是FILEPORT——3335其它类如CPathDialog,CFileDlg与本设计的主要部分无紧要联系,故不一一说明了2.类的具体实现(1).CCtrlSocket类:主要部分有FD_READ及FD_CONNECT触发的事件,OnConnect在建立连接后发送出相应的消息,而OnReceive在有消息到来的情况下处理消息void CCtrlSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classchar q[50];char t;unsigned int j;CString tempaddr;CString Ctemp;UINT tempport;this->Receive(q,strlen(q)+1,0);t=q[0];for(j=0;j<strlen(q);j++){q[j]=q[j+1];}CChatApp *pApp=(CChatApp *) AfxGetApp();CChatDlg *pDlg = (CChatDlg *) pApp->m_pMainWnd; pDlg->UpdateData(true);switch(t)//对控制信息的判断{case '1'://登陆pDlg->m_listonline.InsertItem(0,q);this->GetPeerName(tempaddr,tempport);pDlg->m_listonline.SetItemText(0,1,tempaddr);Ctemp="2"+pDlg->m_hostname;this->Send(Ctemp,strlen(Ctemp)+1,0);break;case '2'://回馈pDlg->m_listonline.InsertItem(0,q);this->GetPeerName(tempaddr,tempport);pDlg->m_listonline.SetItemText(0,1,tempaddr);break;case '3'://退出for(j=0;j<pDlg->m_listonline.GetItemCount();j++) {if(pDlg->m_listonline.GetItemText(j,0)==q){pDlg->m_listonline.DeleteItem(j);}}break;case '4'://请求对话Ctemp.Format("%s",q);Ctemp="是否接受"+Ctemp+"的对话请求?";if(AfxMessageBox(Ctemp, MB_YESNO|MB_ICONQUESTION) != IDYES){Ctemp="52";//拒绝this->Send(Ctemp,strlen(Ctemp)+1,0);break;}elseif(TalkSocket.m_hSocket!=INVALID_SOCKET){Ctemp="6"+pDlg->m_hostname+"退出对话";//断开原来对话TalkSocket.Send(Ctemp,strlen(Ctemp)+1,0);}Ctemp="51";//同意this->Send(Ctemp,strlen(Ctemp)+1,0);this->GetPeerName(tempaddr,tempport);pDlg->GetDlgItem(IDC_CUT_OFF)->EnableWindow(true);pDlg->GetDlgItem(IDC_SEND_MSS)->EnableWindow(true);pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(true);_tcpSocketClose(TalkSocket);_tcpSocketConnect(TalkSocket,tempaddr,TALKPORT);pDlg->m_linkip=tempaddr;pDlg->m_linkname.Format("%s",q);break;case '5'://请求对话的回应if(q[0]=='1'){pDlg->m_editrec+="完成连接\r\n";pDlg->GetDlgItem(IDC_CUT_OFF)->EnableWindow(true);pDlg->GetDlgItem(IDC_SEND_MSS)->EnableWindow(true);pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(true);}elseif(q[0]=='2')AfxMessageBox("对方不想与你对话或者对方正忙!");else AfxMessageBox("Error!");break;default:break;}pDlg->UpdateData(false);CAsyncSocket::OnReceive(nErrorCode);}void CCtrlSocket::OnConnect(int nErrorCode){// TODO: Add your specialized code here and/or call the base class if(nErrorCode==0){this->AsyncSelect(FD_READ);CChatApp *pApp=(CChatApp *) AfxGetApp();CChatDlg *pDlg = (CChatDlg *) pApp->m_pMainWnd;pDlg->UpdateData(true);CString Ctemp;switch(SendMssKind){case 1:Ctemp="1"+pDlg->m_hostname;this->Send(Ctemp,strlen(Ctemp)+1,0);break;case 3:Ctemp="3"+pDlg->m_hostname;this->Send(Ctemp,strlen(Ctemp)+1,0);break;case 4:Ctemp="4"+pDlg->m_hostname;this->Send(Ctemp,strlen(Ctemp)+1,0);break;default:break;}}CAsyncSocket::OnConnect(nErrorCode);}(2).CTalkSocket类:主要部分有FD_READ及FD_CLOSE触发的事件,OnClose对方关掉软件后响应,而OnReceive在有消息到来的情况下处理消息void CTalkSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classchar q[150];unsigned int j;CString tempaddr;CString Ctemp;CString filename;CString filelen;long file_length;char RootPathName[4]; // root pathDWORD SectorsPerCluster; // sectors per clusterDWORD BytesPerSector; // bytes per sectorDWORD NumberOfFreeClusters; // free clustersDWORD TotalNumberOfClusters; // total clusterslong DiskFree;this->Receive(q,strlen(q)+1,0);CChatApp *pApp=(CChatApp *) AfxGetApp();CChatDlg *pDlg = (CChatDlg *) pApp->m_pMainWnd;pDlg->UpdateData(true);char t=q[0];for(j=0;j<strlen(q);j++){q[j]=q[j+1];}Ctemp.Format("%s",q);switch(t){case '6'://结束对话pDlg->m_editrec=pDlg->m_editrec+Ctemp+"\r\n";_tcpSocketClose(TalkSocket);pDlg->GetDlgItem(IDC_CUT_OFF)->EnableWindow(false);pDlg->GetDlgItem(IDC_SEND_MSS)->EnableWindow(false);pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(false);break;case '7'://对话信息pDlg->m_editrec=pDlg->m_editrec+Ctemp+"\r\n";break;case '8'://请求文件传输//q[0]=q[0]-48;filename=Ctemp.Mid(1,q[0]);file_length=atol(Ctemp.Right(Ctemp.GetLength()-q[0]-1));if(file_length<1024)filelen.Format("%ld字节",file_length);elseif(file_length<1048576)filelen.Format("%.2fK",file_length/(float)1024);elseif(file_length<1073741824)filelen.Format("%.2fM",file_length/(float)1048576);elsefilelen.Format("%.2fG",file_length/(float)1073741824);Ctemp="是否接受对方的文件["+filename+"]?[约"+filelen+"]";if(AfxMessageBox(Ctemp, MB_YESNO|MB_ICONQUESTION) != IDYES){Ctemp="92";//拒绝this->Send(Ctemp,strlen(Ctemp)+1,0);}else{RootPathName[0]=pDlg->m_editdir[0];RootPathName[1]=pDlg->m_editdir[1];RootPathName[2]=pDlg->m_editdir[2];RootPathName[3]=0;GetDiskFreeSpace(RootPathName,&SectorsPerCluster,&BytesPerSector, &NumberOfFreeClusters,&TotalNumberOfClusters);DiskFree=(long)SectorsPerCluster*BytesPerSector*NumberOfFreeClust ers;//大于一定数目会变成负数,不过只要小于2G,即1073741824*2就不会了if(DiskFree<0||DiskFree>file_length){pDlg->m_editfile=pDlg->m_editdir+"\\"+filename;pDlg->m_filelen=filelen;Ctemp="91";//同意this->Send(Ctemp,strlen(Ctemp)+1,0);CFile file;if(!file.Open(pDlg->m_editfile,CFile::modeCreate))AfxMessageBox("文件建立失败");file.Close();pDlg->file_length=file_length;pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(false);}else{AfxMessageBox("磁盘空间不足,自动放弃接收文件!");Ctemp="93";//磁盘空间不足this->Send(Ctemp,strlen(Ctemp)+1,0);}}break;case '9'://请求文件传输的回应if(q[0]=='1'){pDlg->m_editrec+="准备传输……(请不要使用或移动传输的文件)\r\n";_tcpSocketClose(FileConn);_tcpSocketConnect(FileConn,pDlg->m_linkip,FILEPORT);pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(false);}elseif(q[0]=='2'){AfxMessageBox("对方不想接收你的文件!");}elseif(q[0]=='3'){AfxMessageBox("对方磁盘已满,不能接收!");}else{AfxMessageBox("Error!");}break;case 'A'://结束文件传输break;default:break;}pDlg->UpdateData(false);CAsyncSocket::OnReceive(nErrorCode);}void CTalkSocket::OnClose(int nErrorCode){// TODO: Add your specialized code here and/or call the base classCChatApp *pApp=(CChatApp *) AfxGetApp();CChatDlg *pDlg = (CChatDlg *) pApp->m_pMainWnd;pDlg->UpdateData(true);pDlg->m_editrec+="对方下线\r\n";_tcpSocketClose(TalkSocket);pDlg->GetDlgItem(IDC_CUT_OFF)->EnableWindow(false);pDlg->GetDlgItem(IDC_SEND_MSS)->EnableWindow(false);pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(false);pDlg->UpdateData(false);CAsyncSocket::OnClose(nErrorCode);}(3).CFileSocket类:主要部分有FD_READ及FD_WRITE触发的事件,OnSend是在Connect建立连接后或缓存为空,可以准备发送,而OnReceive在有消息到来的情况下处理消息,不过由于其它响应也比较重要,便也附上了void CFileSocket::OnAccept(int nErrorCode){// TODO: Add your specialized code here and/or call the base class_tcpSocketClose(FileSocket);if(!FileListen.Accept(FileSocket)){AfxMessageBox("接收连接失败!");return;TotalRecv=0;TotalSend=0;FileSocket.AsyncSelect(FD_READ);CAsyncSocket::OnAccept(nErrorCode);}void CFileSocket::OnConnect(int nErrorCode){// TODO: Add your specialized code here and/or call the base classTotalRecv=0;TotalSend=0;FileConn.AsyncSelect(FD_WRITE);CAsyncSocket::OnConnect(nErrorCode);}void CFileSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base classFileSocket.AsyncSelect(FD_CLOSE);CChatApp *pApp=(CChatApp *) AfxGetApp();CChatDlg *pDlg = (CChatDlg *) pApp->m_pMainWnd;pDlg->UpdateData(true);char recvbuf[4096];CString Ctemp;CFile file;int dwRecv;int per;//文件进度if(!file.Open(pDlg->m_editfile,CFile::modeWrite|CFile::shareDenyNone))else{dwRecv=0;memset(recvbuf,0,4096);dwRecv=this->Receive(recvbuf,4096,0);if(dwRecv!=0){file.SeekToEnd();file.Write(recvbuf,dwRecv);TotalRecv+=dwRecv;per=(int)((float)TotalRecv/(float)pDlg->file_length*100);pDlg->m_prog.SetPos(per);pDlg->m_per.Format("%d",per);}if(TotalRecv==pDlg->file_length){pDlg->m_editrec+="接收完毕……\r\n";TotalRecv=0;pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(true);}pDlg->UpdateData(false);file.Close();FileSocket.AsyncSelect(FD_READ|FD_CLOSE);}CAsyncSocket::OnReceive(nErrorCode);}void CFileSocket::OnSend(int nErrorCode){// TODO: Add your specialized code here and/or call the base class this->AsyncSelect(FD_CLOSE);CChatApp *pApp=(CChatApp *) AfxGetApp();CChatDlg *pDlg = (CChatDlg *) pApp->m_pMainWnd;pDlg->UpdateData(true);CString Ctemp;CFile file;char buf[4096];UINT dwread;int per;//文件进度if(!file.Open(pDlg->m_editfile,CFile::modeRead)){ }else{memset(buf,0,4096);file.Seek(TotalSend,CFile::begin);dwread=file.Read(buf,4096);if(dwread!=0){TotalSend+=(long)dwread;FileConn.Send(buf,dwread,0);}per=(int)((float)TotalSend/(float)pDlg->file_length*100);pDlg->m_prog.SetPos(per);pDlg->m_per.Format("%d",per);if(dwread<4096){pDlg->m_editrec+="发送完毕……\r\n";file.Close();TotalSend=0;pDlg->GetDlgItem(IDC_SEND_FILE)->EnableWindow(true);}else{file.Close();this->AsyncSelect(FD_WRITE|FD_CLOSE);}pDlg->UpdateData(false);}CAsyncSocket::OnSend(nErrorCode);}void CFileSocket::OnClose(int nErrorCode){// TODO: Add your specialized code here and/or call the base classthis->Close();TotalRecv=0;TotalSend=0;CAsyncSocket::OnClose(nErrorCode);}七、调试1.调试发现的问题:用虚拟机调试发现,虚拟机内看到宿机的IP跟宿机自己看到的IP是不同的(图表1 及图表 2)图表 1 虚拟机1,TRAVIS3图表 2 宿机TRAVIS2.功能调试a)对话请求:A方选择B方IP,并请求对话,如果请求成功,相应按钮激活,B方接收到对话请求后可以选择是否对话,同意则相应按钮激活,对话是的界面如(图表1 及图表 2)b)文件传输:A方建立对话之后,按发送文件按钮,弹出文件选择框,然后选择文件(如图表3),B方接收请求之后决定是否接收(图表4),同意后A方发送,B方接收(图表5)图表 3 文件选择框图表 4 文件传输请求图表 5 宿机与虚拟机1传输文件八、分析与总结这次课程设计完成了所有的功能,所有功能调试通过,不过感觉外观有待美化。