p2p即时聊天系统
- 格式:doc
- 大小:1.08 MB
- 文档页数:25
网络实时聊天与他人实时交流的互联网小工具推荐随着互联网技术的快速发展和普及,人们对即时交流的需求不断增加。
为了满足这种需求,各种网络实时聊天工具应运而生。
本文将为您推荐几种常用的互联网小工具,帮助您实现与他人的实时交流。
一、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地址。
结点加入系统时首先要连接目录服务器并报告自身地址及共享的文件列表。
常用聊天/传输工具/下载软件的协议及端口,记录并封堵的协议列表如下,一般有固定的通讯协议端口的软件、工具都是比较容易用网路岗封掉的,如果不是固定的端口或是服务器地址的话,也可以用网路岗7新增的专业的IP包分析模块工具进行抓包分析,再设置相应的规则进行封堵。
序号协议名称协议类别协议简介1腾讯QQ聊天工具QQ默认使用UDP通讯方式,默认端口为UDP 8000和8001。
QQ 默认采用UDP 通讯方式,端口8000,8001。
如果UDP 的两个端口不通,会自动转换到TCP 80端口或者TCP 443端口进行通讯。
QQ 同时也支持HTTP 代理模式及SOCK5 代理模式。
2雅虎通聊天工具雅虎通Yahoo!使用TCP通讯方式,默认端口为TCP 5050。
Yahoo! 采用TCP 通讯方式,默认端口5050,当5050 端口不通时会自动转换为23、21、25、110 等十几个端口。
Yahoo! 支持代理服务器模式。
3MSN聊天工具MSN使用TCP通讯,支持TCP 1863端口和http 80端口。
MSN(Live)messenger 采用TCP 通讯方式,支持1863 端口和80 端口,并在登录过程中使用HTTPS,端口443。
MSN 支持代理服务器(HTTP 代理,SOCK4/SOCK5 代理)。
4AIM/ICQ聊天工具ICQ和AIM是AOL的即时通讯软件,都采用OSCAR通讯协议。
ICQ 和AIM 采用TCP 通讯方式,默认端口5190,也会自动转换到80,443 等其他端口,并且支持代理模式。
从AIM6.5版起,开始采用TLS加密协议。
5HTTP网页浏览HTTP协议使用TCP通讯,默认端口是80(可以自定义)。
6FTP文件传输TCP方式,常见为21端口。
连接分为控制端口和数据端口。
7QQ文件传输TCP方式,通讯端口443(HTTPS)。
FTP 服务一般运行在20 和21 两个端口。
端口20 用于在客户端和服务器之间传输数据流,而端口21 用于传输控制流,并且是命令通向FTP 服务器的进口。
聊天通讯方案聊天通讯是指通过网络或者其他通信手段来进行人与人之间的信息传输。
在现代社会中,聊天通讯已成为了我们生活中必不可少的一部分,例如 QQ、微信、电子邮件等我们使用频率较高的聊天工具。
这篇文章将会探讨一些常见的聊天通讯方案及其特点。
基于服务器的聊天方案基于服务器的聊天方案是指通过一台服务器,将用户之间的消息进行转发。
这种聊天方案需要一个稳定的服务器,客户端和服务器之间建立起一个长连接,即客户端需要一直维护着和服务器之间的连接才能保证消息的实时性。
常见的基于服务器的聊天软件如 QQ、微信、钉钉等。
基于服务器的聊天方案有以下几个优缺点:优点1.实时性好:因为客户端一直和服务器保持着连接,所以消息的实时性很高,一旦有消息推送到服务器,服务器就能立即将消息转发到指定的客户端上。
2.稳定性好:因为基于服务器的聊天通讯方案需要一个稳定的服务器,所以服务器的稳定性关系到系统的可用性,当服务器出现故障时,系统会进行相应的修复,从而能够保证用户的正常使用。
3.功能丰富:基于服务器的聊天通讯方案有很多高级功能,例如消息的漫游、阅后即焚、加密聊天等等。
缺点1.扩展性有限:基于服务器的聊天通讯方案要求服务器必须足够稳定,而且随着用户的增加,服务器的计算和存储压力也会越来越大,因此服务器的扩展性受到了限制。
2.保密性差:基于服务器的聊天通讯方案存在隐私泄露的风险,因为用户的聊天记录存储在服务器上,一旦服务器遭到攻击或者泄露,用户的聊天记录就会暴露。
基于 P2P 的聊天方案P2P(Peer-to-Peer)是指点对点的通讯模式。
在P2P 的聊天方案中,每个用户都能够直接链接到其他用户,进行点对点的通讯传输,而无需通过服务器进行中转。
常见的基于 P2P 的聊天软件如飞秋、QQ飞车聊天、迅雷等。
基于 P2P 的聊天方案有以下几个优缺点:优点1.扩展性好:P2P 的聊天方案不需要服务器进行支撑,因此不会出现服务器扩展性不足的情况,随着用户数量的增加,P2P 的聊天方案会更加高效,也具有更多的扩展性。
一、课程设计题目基于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 class char 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 path DWORD SectorsPerCluster; // sectors per cluster DWORD BytesPerSector; // bytes per sector DWORD NumberOfFreeClusters; // free clusters DWORD TotalNumberOfClusters; // total clusters long 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,&BytesPerSec tor,&NumberOfFreeClusters,&TotalNumberOfClusters);DiskFree=(long)SectorsPerCluster*BytesPerSector*NumberOfFreeC lusters;//大于一定数目会变成负数,不过只要小于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 class CChatApp *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 class TotalRecv=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 class FileSocket.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::shareD enyNone)){ }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 classthis->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传输文件八、分析与总结这次课程设计完成了所有的功能,所有功能调试通过,不过感觉外观有待美化。