基于局域网的文件传输系统的设计与实现_第1页
基于局域网的文件传输系统的设计与实现_第2页
基于局域网的文件传输系统的设计与实现_第3页
基于局域网的文件传输系统的设计与实现_第4页
基于局域网的文件传输系统的设计与实现_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

基于局域网的文件传输系统的设计与实现摘要随着互联网技术的迅猛发展,计算机通信给人类文明带来了翻天覆地的变化。很多情况下,人们的日常工作需要借助文件传输来完成。但大多数文件传输功能都需要借助移动磁盘等硬件设备或Internet上的服务器才能实现。这就给那些具有大规模内部网络的用户造成了许多问题,如浪费资金、浪费网络资源、病毒入侵、降低了工作效率等。为了方便局域网内主机的资源共享,需要开发一个基于局域网的文件传输工具,在内部网络中实现文件交换。基于局域网的文件传输系统的设计选用Delphi为开发工具,以C/S模式通过建立Socket连接后实现局域网快速,准确,安全的点对点文件以及文件夹传输功能。本系统能够促进局域网内用户之间的文件资源共享,满足主机之间信息交流,确保文件及文件夹传输安全性,有效地提高工作效率。设计共分为五大模块,分别为:一、介绍选题背景及意义和国内外研究现状;二、介绍TCP/IP点对点协议技术,C/S架构的Delphi程序设计技术和Socket网络编程技术;三、对当前局域网文件传输进行需求分析并提出解决方案;四、根据解决方案对系统进行设计;五、对基于局域网的文件传输系统进行测试并得到测试结果。关键词:C/S结构;网络通讯组件;点对点;Socket连接TheDesignandImplementationofFileTransferSystemBasedonLANAbstractAlongwiththeInternettechnologyswiftandviolentdevelopment,thecomputercorrespondencethehumanculturehasbroughttheearth-shakingchangefor.Inverymanysituations,people'sroutineworkneedstodrawsupportfromthefiletransfertocomplete.ButthemajorityfiletransferfunctionallneedstodrawsupportmoveshardwareequipmentortheInternetandsointhefloppydiskservercanrealizeThisgavethesetohavethelarge-scaleinternalnetworkusertocreatemanyproblems,likethewastefund,thewastenetworkresources,theviralinvasion,reducedtheworkingefficiencyandsoon.Inordertofacilitateinthelocalareanetworkmainengineresourcessharing,needstodeveloponebasedonthelocalareanetworkfiletransfertool,realizesthedocumentexchangeininternalnetwork.ThedesignandimplementationoffiletransfersystembaseonLANusesDelphidevelopmenttool,C/SmodethroughtheestablishmentofSocketafterconnectingLANusersfast,accurate,thepoint-to-pointsecurityfilesandfolderstransmissionfunctions.ThesystemcancontributetoLANuserstosharefileresourcestomeettheexchangeofinformationbetweenmainframe,ensurethatthefiletsandfolderstransmissionsecurity,effectivelyimprovingefficiency.Thedesignisdividedintofivemajormodulealtogether,including:First,introductionselectedtopicbackgroundandsignificanceanddomesticandforeignresearchpresentsituation;Second,introducestheTCP/IPpointtopointprotocoltechnology,C/SoverheadconstructionDelphiprogrammingtechniqueandtheSocketnetworkprogrammingtechnology;Third,carriesonthedemandtothecurrentlocalareanetworkfiletransfertoanalyzeandtoproposethesolution;Fourth,carriesonthedesignaccordingtothesolutiontothesystem;Fifth,tocarriesonbasedonthelocalareanetworkfiletransfersystemtestsandobtainsthetestresult.Keywords:C/Sstructure;Networkcommunicationmodule;Point-to-point;Socketconnection.目录论文总页数:26页1 引言 11.1 选题背景 11.2 国内外研究现状 11.3 课题研究的意义 12 理论基础 22.1 TCP/IP点对点协议技术 22.2 C/S架构的DELPHI程序设计技术 22.3 SOCKET网络程序设计技术 33 系统需求分析 43.1 现行业务系统描述 43.2 现行系统存在的主要问题分析 43.3 提出解决方案 44 系统设计 54.1 系统总体架构 54.2 系统界面设计 64.2.1 界面设计 64.2.2 用户信息 74.3 系统功能模块设计 94.3.1 获取用户信息 94.3.2 局域网内文件传输 134.3.3 局域网内文件夹传输 175 系统实施及测试 225.1 实施概况 225.2 测试方案 225.3 测试结果 23参考文献 24致谢 25声明 26引言选题背景当今世界科学技术飞速发展,尤其以计算机通信网络为代表的互联网技术更是日新月异,令人眼花燎乱,目不睱接。在计算机与网络迅速发展的今天,借助于网络进行信息资源交流给人们带来了极大的方便。各种文件传输系统都已被广大用户接受。比如QQ、UC、Internet邮件等互联网中运用最为广泛的文件传输工具,但它们之间的文件传输往往对远程服务器有非常大的依赖性,没有彻底实现点对点安全的文件传输。甚至需要花费大量的金钱购买各种移动磁盘或者其他局域网内连接主机的硬件设备。而达到的效果却总是因为传输效率以及安全威胁而受到很大的限制。在这种形势下,开发一个功能简单而实用,能在Windows操作系统中运行,并且具有可移植性的局域网内文件传输工具势在必行。国内外研究现状目前,国内外企业对局域网的文件传输系统认识和使用情况并不好,各个企业单位在局域网内实现文件传输,资源共享还有很大的缺陷。技术无论是从理论上或实践上都还不够完善。文件传输系统由于比较复杂,可变因素较多,安全性低,因此发展还不成熟。但是随着科学技术的发展,各种以局域网为单位的文件传输系统已经进入稳健发展期,比如说市面上比较普遍使用的QQ、UC、飞鸽传书等以内部网络为中心的资源共享系统也即将进入高速发展期。在国内,随着企业资源管理的规范化和规模的不断扩大,企业的计算机资源管理将不仅仅停留在依靠硬件或者Internet网络获取,而且将会向着安全的内部网络化资源管理方式迈进。课题研究的意义随着网络通信技术的发展与用户需求日益多样化,现代局域网络正处在变革与发展之中,本课题的主要目的之一是为了更清晰地培养学生掌握科学研究方法的能力和使学生迅速体会文件传输系统的研发过程。基于局域网的文件传输系统能够让家庭网络以及各个企业等局域网对内部资料有一个快捷,准确,安全的共享。特别是对如今较大系统研发的模块分工合作得到了绝对保密性,从而使各项工作有计划、更科学的进行及顺利完成,使企业的办事效率得到显著提高。文件传输系统主要功能是自动获取局域网内用户的主机名,IP地址以及工作组名字,最终以C/S模式通过TCP/IP协议实现点到点文件传输功能。本系统既锻炼了我们的实际动手能力,使我们将大学四年所学的理论知识与实际开发相结合,又引导我们进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要的意义。理论基础TCP/IP点对点协议技术系统的文件传输功能主要依赖于建立客户端与服务器之间点对点的的连接后实现。所以就得与TCP/IP协议协合。TCP/IP协议(TransmissionControlProtocol/InternetProtocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。TCP/IP是网络中使用的基本通信协议。虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,只是TCP协议处于运输层,它能够确保文件准确的传送;而IP协议处于网络层,它标识了处于网络中任意主机的唯一身份。TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。·采用TCP/IP详解的原因:第一,局域网内主机之间的是依靠IP地址进行标识。本设计要实现文件及文件夹的传输就需要以IP地址为传送基础进行;第二,新用户上线后需要向局域网内所有用户广播自己的主机信息使网内主机得到本机的IP地址等。需要用到与TCP/IP相对的UDP协议。C/S架构的DELPHI程序设计技术本系统的开发主要采用C/S结构。所谓C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将信息交互任务合理分配到Client端和Server端来实现,降低了系统文件传输过程中的开销。目前大多数应用软件系统都是Client/Server形式的两层结构。传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。

服务器主机客户机A客户机B服务器主机客户机A客户机B客户机C客户机NResponseRequestResponseRequestResponse .. ..Request.Response图1客户机/服务器通讯结构文件传输系统同时采用了Delphi网络组件编程技术。Delphi是美国BORLAND公司推出的功能强大的应用程序开发工具。它具有简单、高效、功能强大的特点。它可是众多程序员至爱的编程工具。Delphi具有很多特性:基于窗体和面向对象的方法,高速的编译器,与Windows编程紧密结合,强大而成熟的组件技术。而且其重要的还有ObjectPascal语言,它是一切的根本。ObjectPascal语言是在Pascal语言的基础上发展起来的,简单易学。Delphi提供了各种开发工具,包括集成环境、图像编辑(ImageEditor),以及各种开发可视化软件的应用程序,如DesktopDataBaseExpert等。除此之外,还允许用户挂接其它的应用程序开发工具,如Borland公司的资源编辑器(ResourseWorkshop)。DELPHI是可视化应用编程开发环境,可重用性面向对象编程语言,快速编译器能够有效快速建立WINDOWS应用程序,快速简化WINDOWS与浏览器客户,WEB服务器以及中间件等开发之外,同时也支持基于WEB服务的Microsoft,.net,Sunone体系,而且提供给WEB开发者需要的可伸缩性和可靠性。用户可以开发支持WEB服务特性的服务器端和客户端应用,而这一切都是通过一套高度集成的可视化开发工具,先进的编译技术和可重用的组件完成。SOCKET网络程序设计技术文件传输系统得以实现的根本在于建立有效的连接以及是否存在文件传输载体。所谓Socket通常也称作"套接字",用于描述IP地址和端口,socket类表现了客户端套接字,它是属于两台计算机的两个TCP通讯端口之间的通讯通道。在网络编程中,客户端使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口。服务器使用Socket监听指定的端口,端口可以随意指定,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。系统需求分析现行业务系统描述目前各种文件资源交流的主要方式可以分为三种:(1)通过局域网内主机之间以文件共享后再经过复制,粘贴方式实现。(2)依靠可移动磁盘的两次信息转移实现。(3)通过Internet邮件方式实现。此三种方法并非不可行,但它们都需要花费较长的时间以及安全性也得不到保证,工作效率将在很大程度上受到限制。如果通过局域网内主机之间复制粘贴来实现文件资源共享,将浪费大量的网络带宽,极大程度上影响了网内用户的工作效率,甚至导致用户不能正常工作;如果依靠移动磁盘实现文件的共享,将花费大量的金钱,而文件较大移动磁盘容量不足的情况下会令人极为头疼,何况移动磁盘是病毒传播的重要途径;如果通过Internet邮件方式实现,用户需要接入Internet服务器,这种方式对远程服务器有非常大的依赖性,即使1KB的文件都要经历极度繁琐的路径,不能彻底实现点对点的即时交流,文件较大的情况下就不言而喻了。最重要的是,在如今病毒黑客横行的网络世界中,信息的安全性也得不到保证。综上所述,依靠Internet网络等方式实现文件资源交互的准确性,快速性及安全性远达不到理想的要求。现行系统存在的主要问题分析针对企业来说,提高工作效率是企业的一个重心;降低成本是企业赢取最大利益的重要方式;保证信息安全却是可能影响企业生死存亡的关键。企业需要对各种因素有足够深刻的认识才可能实现最终目标盈利。而传统的文件资源交互方式却存在很多的问题,大致可以分为:一、不能有效地降低文件交互成本;二、文件交换过程过于繁琐;三、内部机密资料得不到安全保证;四、文件交互的准确性得不到更本保证。提出解决方案解决当前问题的方案主要是指在允许的成本、性能要求下,分析系统实施的可行性,提出功能实现的依据,包括其简单性,安全性以及经济可行性。根据企业简单快速,安全的资源共享等要求,提出以下四种解决方案:1)操作简单性方案:开发的系统需要有以下特点:Windows友好的用户界面和系统快速的应用方法,简单易操作,不需对使用人员进行培训,可以使用户很好的掌握。对传输文件过程中的文件的载入设置都是非常简单可行,比如:如果用户忘记选择文件接收者的时候系统会自动提示“请选择接收用户”要求用户选择主机而不导致错误出现而引发的不便,这样就大大提高工作效率。而且开发的系统应该简单易操作,易维护,减少了不必要的麻烦。对于家庭局域网以及一些比较简单的中小企业网,系统必须做到在实际应用中较为成功。系统应为用户提供Windows所一贯坚持的非常友好、操作简单的用户界面。2)传输安全性方案:系统开发完成后,能有效地使内部资源与外网的完全隔离,从而保证了内部机密文件的安全性。3)经济可行性方案:系统开发完成必须作到提高文件共享效率,不管是在资金上还是效率上都能达到预期的效果的。最重要的一点就是:使用户避免花费高额的资金去购买各种移动磁盘甚至是通过Internet邮件方式,使得用户方便的同时,也让信息少走了不少“弯路”。4)快速准确性方案:鉴于系统的目标要求和特点,能够保证快速准确地实现文件共享。综合上述,本设计在WindowsXP操作系统下,以中文版Delphi7为开发工具,以C/S为系统功能结构,基于点对点的TCP/IP协议理论,通过Socket套节字连接客户端与服务器实现文件及文件夹传输。彻底避免了文件交换过程与外部网络的接触,实现快速的文件资源共享。并能够确保内部文件的机密性,能够在很大程度上有效地提高工作效率。系统设计系统总体架构本系统的设计过程主要分为两部分:第一部分:系统界面的设计以及获取局域网内所有在线用户的主机名,IP地址以及工作组名。使网内所有用户都能够获取其他用户信息。第二部分:文件传输是本设计功能实现的核心。系统采用C/S架构将系统运行载体分为两个部分:客户端与服务器端。文件传输需要建立有效的连接后,通过TCP/IP协议实现点对点的文件传输。通信双方是通过三次握手建立Socket连接,实现文件传输,最后关闭套节字连接。文件传输的整个流程图如下:

服务器端主机客户端主机 TCP/IP服务器端主机客户端主机 连接响应套节字连接请求连接响应套节字连接请求LIANJIETCP 3次握手LIANJIETCP 接收文件流接收文件流并保存写入文件流 SOCKET流写入文件流 断开连接断开连接响应断开连接断开连接响应三次握手 图2文件传输系统框架图系统界面设计界面设计界面是系统功能得以实现的基本平台,这里充分利用Delphi可视化开发环境以各种组件设置。界面的设计可以分为五步:1)创建一个工程,制作一个窗体form1;2)在form1内加入用户列表userlist并设置列表项:用户名,工作组,IP地址以及它们的属性;3)在form1内加入Memo1;4)在Memo1内加入各种DELPHI网络通讯控件,本系统用到的控件分别有:用于传送文件是打开文件的控件OpenDialog1;用于接收端保存文件的控件SaveDialog1;用于点到点文件传输的客户端PClientConnected及服务器端PServerAfterCommandHandler;用于广播主机信息的客户端ClientStatus和服务器端ServerStatus数据报组件;用于设置退出系统和窗口前端显示的PopupMenu1菜单;5)分别创建刷新按钮BitBtn1,文件传输BitBtn2以及文件夹传输BitBtn3按钮。设置的界面如下图:图3基于局域网的文件传输系统界面用户信息用户列表建立以后,将局域网内所有在线用户的主机名,主机IP地址以及工作组名显示于列表中。方法是首先确定用户主机是上线信息,返回信息,握手信息还是离线信息。这里对他们分别设置了一个信息发送的头信息,分别设置为:LOGIN,HAND以及LOGOUT。如果新用户上线,它就向局域网以LOGIN为头信息广播本机的主机名,IP地址以及工作组。局域网内所有在线主机收到该广播信息以后将新上线的主机名,端口,IP地址以及工作组信息添加到自己的在线用户列表并都以HAND为头信息向局域网广播本机的握手信息;当包括刚上线主机在内的局域网所有主机收到这个握手信息以后线判断自己的在线用户列表中是否存在这个主机广播的主机信息,如果不存在就说明它是刚上线主机,最后将这个信息添加到自己在线列表,否则就不加;当用户下线的时候也将自己的信息以LOGOUT为头信息广播给局域网,其他在线用户收到这个消息以后将其主机信息从本地在线用户列表删除。其部分的源代码分别如下:procedureTForm1.FormCreate(Sender:TObject);procedureTForm1.FormCreate(Sender:TObject);//新用户上线以LOGIN为头信息varwsadata:twsadata;myinfobuf:array[0..1023]ofchar;//本机信息pmyname:array[0..1023]ofchar;//本机名wList,clist:TStringList;i,j:integer;beginmainhide;//把程序图标显示在系统托盘里边ifwsastartup($101,wsadata)<>0thenexit;//获取本机名gethostname(pmyname,sizeof(pmyname));//获取主机名myname:=strpas(pmyname);//得到主机名trywlist:=tstringlist.Create;clist:=tstringlist.Create;GetServerList(wList);//获取本机IPfori:=0towlist.Count-1dobegingetusers(wlist.Strings[i],clist);//得到用户名forj:=0toclist.Count-1dobeginif(clist.Strings[j]=uppercase(myname))or(clist.Strings[j]=myname)thenbeginmyworkgroup:=wlist.Strings[i];//获本机工作组end;finallywlist.Free;clist.Free;end;myinfo:=format('%-6s%-255s%-255s',['LOGIN',myname,myworkgroup]);strpcopy(myinfobuf,myinfo);client.Broadcast(myinfobuf,9000);end;functiontform1.handdata(ip,name,workgroup:string;port:integer):string;//向好友发握手信息varminfobuf:array[0..1023]ofchar;minfo:string;beginminfo:=format('%-6s%-255s%-255s',['HAND',name,workgroup]);strpcopy(minfobuf,minfo);server.SendBuffer(ip,port,minfobuf,sizeof(minfobuf));end;procedureTForm1.N10Click(Sender:TObject);//用户离线以LOGINOUT为头信息varmylogoutbuf:array[0..1023]ofchar;mylogoutinfo:string;beginmylogoutinfo:=format('%-6s%-255s',['LOGOUT',myname]);strpcopy(mylogoutbuf,mylogoutinfo);client.Broadcast(mylogoutbuf,9000);//广播自己离线信息Application.Terminate;//销毁线程end;系统功能模块设计获取用户信息本部分主要是显示用户列表中在线用户的主机名,主机的IP地址以及工作组名三部分,代码分别进行介绍如下:Functiontform1.GetUsers(GroupName:string;List:TStringList):Boolean;//获取工作组的计算机名称Functiontform1.GetUsers(GroupName:string;List:TStringList):Boolean;//获取工作组的计算机名称typeTNetResourceArray=^TNetResource;VarNetResource:TNetResource;Buf:Pointer;Count,BufSize,Res:DWord;Ind:Integer;lphEnum:THandle;Temp:TNetResourceArray;TmpStr:String;BeginResult:=False;FillChar(NetResource,SizeOf(NetResource),0);////初始化网络层次信息NetResource.dwDisplayType:=RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)/NetResource.dwUsage:=RESOURCEUSAGE_CONTAINER;NetResource.dwScope:=RESOURCETYPE_DISK;//列举文件资源信Res:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,@NetResource,lphEnum);IfRes<>NO_ERRORThenExit;//执行失败WhileTrueDo//列举指定工作组的网络资源BeginCount:=$FFFFFFFF;//不限资源数目BufSize:=8192;//缓冲区大小设置为8KGetMem(Buf,BufSize);//申请内存,用于获取工作组信息/获取计算机名称Res:=WNetEnumResource(lphEnum,Count,Pointer(Buf),BufSize);procedureTForm1.ServerUDPRead(Sender:TObject;AData:TStream;ABinding:TIdSocketHandle);varreadbuf:array[0..2030]ofchar;procedureTForm1.ServerUDPRead(Sender:TObject;AData:TStream;ABinding:TIdSocketHandle);varreadbuf:array[0..2030]ofchar;msg,head,recvip,recvname,recvworkgroup,recvmsg,memo:string;recvport:integer;f:textfile;beginZeroMemory(@readbuf[0],2030);adata.Read(readbuf,sizeof(readbuf));msg:=Trim(String(Pchar(@Readbuf[0])));//memo1.Lines.Add(msg); head:=trim(copy(msg,1,headlen));ifhead='LOGIN'THEN//添加对方IP1.返回对方IP2.发出Hand握手信息beginrecvip:=abinding.PeerIP;recvport:=9000;IfRes=ERROR_NO_MORE_ITEMSThenbreak;//资源列举完毕If(Res<>NO_ERROR)thenExit;//执行失败Temp:=TNetResourceArray(Buf);ForInd:=0toCount-1do//列举工作组的计算机名称BegintmpStr:=Temp.lpRemoteName;//获取工作组的计算机名称Delete(tmpstr,1,2);list.Add(tmpstr);Inc(Temp);End;End;Res:=WNetCloseEnum(lphEnum);//关闭一次列举IfRes<>NO_ERRORThenexit;//执行失败Result:=True;FreeMem(Buf);End;Functiontform1.GetServerList(varList:TStringList):Boolean;//获取服务列表VarFunctiontform1.GetServerList(varList:TStringList):Boolean;//获取服务列表VarNetResource:TNetResource;//初始化网络层次信息Buf:Pointer;Count,BufSize,Res:DWORD;lphEnum:THandle;//memo1.Lines.Add('loginrecv'+recvip+inttostr(recvport));recvname:=copy(msg,headlen+1,namelen);recvworkgroup:=copy(msg,headlen+namelen+1,length(msg));adduser(recvname,recvworkgroup,recvip,recvport);handdata(recvip,myname,myworkgroup,recvport);{minfo:=format('%-6s%-4d%-255s',['HAND',myname,myworkgroup]);//返回对方IP//端口等信息strpcopy(minfobuf,minfo);server.SendBuffer(recvip,recvport,minfobuf,sizeof(minfobuf));}end;ifhead='REVLOG'then//添加对方返回的自己的ip(对比)begin//memo1.Lines.Add('revlogrecv');RECVPORT:=strtoint(copy(msg,headlen+1,portlen));recvip:=copy(msg,headlen+portlen+1,iplen);end;ifhead='HAND'THEN//处理握手信息添加对方ip返回对方ipBEgin//memo1.Lines.Add('handrecv');RECVNAME:=COPY(msg,headlen+1,namelen);recvworkgroup:=copy(msg,headlen+namelen+1,workglen);recvip:=abinding.PeerIP;recvport:=9000;recvp2pdata(recvip,recvname,recvworkgroup,recvport);END;ifhead='LOGOUT'then//处理logoutdelete其ipbeginrecvname:=copy(msg,headlen+1,namelen);ifmyname<>recvnamethendeleteuser(recvname);end;p:p:TNetResourceArray;i,j:SmallInt;NetworkTypeList:TList;//返回局域网中的工作组类型BeginResult:=False;NetworkTypeList:=TList.Create;//获取局域网中的工作组信息List.Clear;//获取整个网络中的文件资源的句柄,lphEnum为返回名柄Res:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,Nil,lphEnum);//得到网络中的所有工作组的名称IfRes<>NO_ERRORThenexit;//RaiseException(Res);//执行失败//获取整个网络中的网络类型信息Count:=$FFFFFFFF;//不限资源数目BufSize:=8192;//缓冲区大小设置为8KGetMem(Buf,BufSize);//申请内存,用于获取工作组信息Res:=WNetEnumResource(lphEnum,Count,Pointer(Buf),BufSize);//获取计算机名称If(Res=ERROR_NO_MORE_ITEMS)//资源列举完毕or(Res<>NO_ERROR)//执行失败thenbreak;P:=TNetResourceArray(Buf);ForI:=0ToCount-1Do//列举各个工作组的信息BeginList.Add(StrPAS(P^.lpRemoteName));//取得一个工作组的名称Inc(P);End;End;Res:=WNetCloseEnum(lphEnum);//关闭一次列举IfRes<>NO_ERRORThenbreak;//执行失败End;Result:=True;FreeMem(Buf);NetworkTypeList.Destroy;End;局域网内文件传输文件传输实现之前,需要获取在线用户列表中的用户信息。所以系统设置一个“刷新”按钮,当用户点击“刷新”后将更新界面的用户列表中所有在线用户的主机名,主机IP地址和工作组名。并显示在线人数。源代码如下:procedureTForm1.BitBtn1Click(Sender:TObject);procedureTForm1.BitBtn1Click(Sender:TObject);//显示在线人数varf:textfile;beginLabel2.Caption:=INTTOSTR(USERLIST.Items.Count);end;文件以及文件夹传输功能是本设计能够实现的理论核心。系统实现主要依靠发送端与接收端建立有效的连接后,客户端不断地向SOCKET写入文件流,服务器端不断接受来自客户端的SOCKET文件流。直到文件传输完毕关闭套节字连接并释放空间。文件传输的整个过程可以分别表示为:客户端和服务器端。1)客户端连接并发送功能:客户端点击文件发送按钮以后,系统首先判断是否选择文件接受者。如果没有选择就提示用户选择接收者。然后以组件opendialog1.Execute打开传输文件。建立文件流并执行TSendThread.Execute。在TSendThread.Execute中写入接收主机的IP及端口号。向服务器发送连接请求。连接成功后发送文件流。代码依次如下:ProcedureTForm1.ProcedureTForm1.BitBtn2Click(Sender:TObject);//发送按钮文件传输事件varfilename:string;tempItem:TListItem;begintempItem:=UserList.Selected;//获取文件接收者 if(notassigned(tempItem))or(tempItem=nil)thenbegin MessageBox(self.Handle,'请选择消息接收者!','提示',0);exit;end;ifopendialog1.Executethen//如果文件打开。。。beginfilename:=opendialog1.FileName;filename:=opendialog1.FileName;//获取文件名TSendThread.createThread(tempitem.SubItems.Strings[1],extractfilename(filename));//创建线程并立刻执行end;end;文件打开后客户端调用函数TSendThread.createThread建立文件传输流。此函数的源代码如下:onstructorTSendThread.createThread(IP,FileName:string);onstructorTSendThread.createThread(IP,FileName:string);//创建文件线程beginFip:=IP;FFilename:=filename;FreeonTerminate:=true;//完成后自动关闭inheritedcreate(false);//表示创建线程后立刻执行end;文件流建立后由inheritedcreate(false)提示系统自动执行TSendThread.Execute函数发送文件。码如下:procedureTSendThread.Execute;procedureTSendThread.Execute;//运行线程varsocket:tidtcpclient;//定义客户端套节字fs:tfilestream;//定义文件流begin trysocket:=tidtcpclient.Create(nil);//创建客户端套界字 socket.Host:=Fip;//写入IPsocket.Connect();//进行套节字连接 ifsocket.Connectedthenfs:=tfilestream.Create(FFileName,fmopenread);//创建文件流和文件建立关联设置 //参数fmopenread=filemodeopenreadtrysocket.WriteLn('TRANSFILE');//写入套接字类型为TRANSFILEsocket.WriteLn(FFileName);//写入传输的文件名socket.WriteLn(inttostr(fs.Size));//整型转字符型fs.Size为字节流的长度socket.WriteStream(fs,false,false,fs.Size);socket.WriteStream(fs,false,false,fs.Size);//写入文件 finallyfs.Free;//释放文件流 end; getmem(hostname,255);//postthehostname//分配监视器内存zeromemory(hostname,255); //清空内存move(myname[1],hostname^,length(myName)); //获取传输文件名postmessage(TranSuVisorform.handle,TransferSupervisorTwo,integer(hostname),0);getmem(pname,255); zeromemory(pname,255);//postfnameandsizemove(FFileName[1],pname^,length(FFileName));postmessage(TranSuVisorform.handle,TransferSupervisor,integer(pname),lSize); end;文件传输完毕以后断开SOCKET连接并释放套节字空间。2)服务器端响应功能:当服务器收到来自客户端文件传输连接请求后,对其进行连接响应建立连接。连接建立后得到文件的基本信息,进行自动初始化并分配临时空间。如果文件大小为OK就认为是文件传输完毕自动断开连接。否则接收文件开始。当传输完毕后断开连接。其源代码如下:procedureTForm1.PServerExecute(AThread:TIdPeerThread);procedureTForm1.PServerExecute(AThread:TIdPeerThread);//服务器端...varcmd,tmpfn,msg,targetname,localdir,com:string;lsize:int64;fs:tfilestream;filename:pchar;sign,i:integer;ldir:stringarray;lSavePath,Savedir:String;beginwithathread.Connectiondobegincmd:=trim(readln);//memo1.Lines.Add(cmd);ifcmd='TRANSFILE'thenbeginGetMem(filename,255);zeromemory(filename,255);tmpfn:=readln;tmpfn:=readln;move(tmpfn[1],filename^,length(tmpfn));sendmessage(form1.Handle,WM_USER+100,integer(filename),0);writeln('BEGIN');lsize:=strtointdef(readln,0);iflsize=0thenbegindisconnect;exit;end;fs:=TFileStream.Create(filename,fmcreate);readstream(fs,lsize);fs.Free;end;ifcmd='START'thenbeginmsg:=readln();//接收文件名ldir:=split(msg,'\');localdir:=strpas(localroot);fori:=0tohigh(ldir)-1dobeginlocaldir:=localdir+ldir[i]+'\';ifnotdirectoryexists(localdir)thencreatedir(localdir);//创建接收到的文件夹下边的文件夹end;targetname:=strpas(localroot)+msg;//本地文件名writeln('BEGIN');//发送开始信号lsize:=strtointdef(readln,0);//接收文件大小iflsize=0thenbegindisconnect;exit;end;//如果发过来的文件是0KB的会收不到所以Deletefs:=TFileStream.Create(targetname,fmcreate);readstream(fs,lsize);fs.Free;//openrevfilepath:=trim(strpas(localroot))+trim(ldir[0]);end;end;end;end;服务器端将收到的文件流重组以后通过Delphi组件SaveDialog设置保存路径并保存到本地文件夹,其源代码如下:Proceduretform1.UMRcvfile(varmsg:tmessage);Proceduretform1.UMRcvfile(varmsg:tmessage);//保存文件varfilename:pchar;beginfilename:=pchar(msg.WParam);savedialog1.FileName:=string(filename);//保存文件名ifsavedialog1.Executethenmove(SaveDialog1.filename[1],filename^,length(SaveDialog1.FileName);end;局域网内文件夹传输在人们的日常生活中,很多时候不仅仅需要进行单个文件的共享,而是需要进成百上千个文件组成的文件夹的共享。但是用户不可能进行一次又一次的单文件的传送,不但浪费时间,而且很不值得。所以这个时候我们需要对整个文件夹都进行传输。这样就可以避免一个文件夹中的大量文件重复进行多次单文件的传输,很大程度上减少了用户的工作量,从而有效地提高工作效率。其过程同样的分为服务器与客户口端两部分:首先是客户口端向服务器发送连接请求,服务器响应后建立连接实现文件传输。具体过程如下:1)客户端请求建立连接并发送文件夹用户选择文件夹接收者后点击“文件夹传输”按钮。如果用户忘记选择文件接收者,系统弹出提示框“请选择消息接收者”,然后打开本地文件路径,并将本地文件夹路径得出来。procedureTForm1.Bitbtn3Click(Sender:TObject);procedureTForm1.Bitbtn3Click(Sender:TObject);vardir:string;tempItem:TListItem;Rdir:stringarray;i:integer;beginPOSI:=0;tempItem:=UserList.Selected;if(notassigned(tempItem))or(tempItem=nil)thenbeginMessageBox(self.Handle,'请选择消息接收者!','提示',0);exit;end;toip:=trim(tempitem.SubItems.Strings[1]);Dir:='';ifSelectDirectory('目录文件夹','我的电脑',Dir)=truethenbeginrdir:=split(dir,'\');remotefilename:=''; fori:=0tohigh(rdir)-1dobeginremotefilename:=remotefilename+rdir[i];//E:\due\why\ee.txtremotefilename:=remotefilename+'\'; end;dir:=dir+'\';tsendfilethread.createThread(toip,dir);end;end;文件夹选取以后调用tsendfilethread.createThread(toip,dir)建立文件夹传输流,其源代码如下:constructorTsendFilethread.createThread(IP:string;localdir:string);constructorTsendFilethread.createThread(IP:string;localdir:string);beginFIP:=IP;Flocaldir:=localdir;//Fremotename:=remotename;//Fcount:=count;freeonterminate:=true;inheritedcreate(false);end;文件夹传输流建立以后,由函数inheritedcreate(false)提示立刻执行文件传输流函数TsendFilethread.Execute。此部分的主要功能是向套节字写入传输文件的目标IP地址等信息,如果连接成功,写入文件传输信息csocket.WriteLn('TRANSDIR')以及调用函数putdir(Flocaldir)写入文件流。其源代码分别如下:procedureTsendFilethread.Execute;procedureTsendFilethread.Execute;varcsocket:tidtcpclient;fs:tfilestream;begintrycsocket:=tidtcpclient.Create(nil);csocket.Host:=fip;csocket.Port:=9923;csocket.Connect();ifcsocket.Connectedthenbegincsocket.WriteLn('TRANSDIR');ifcsocket.ReadLn()='TRUE'thenputdir(Flocaldir);ifcsocket.ReadLn()='FALSE'thenCsocket.DisconnectSocket;end;finallycsocket.DisconnectSocket;csocket.Free; end;end;proceduretsendfilethread.PutDir(LocalDir:String);varF:TSearchRec;Iremotefile,localfile:string;beginifFindFirst(LocalDir+'*.*',faAnyFile,F)=0thenrepeatif(F.Name<>'.')and(F.Name<>'..')thenbeginifF.attrandfaDirectory<>faDirectorythenbegininc(POSI,1);localfile:=localdir+f.Name;Iremotefile:=trim(Copy(localfile,length(remotefilename)+1,length(localfile)));putfile(localfile,Iremotefile);endelsebeginPutDir(LocalDir+F.Name+'\');end;end;untilFindNext(F)<>0;findClose(F);end;procedureTsendfilethread.PutFile(LocalName:String;Remotedir:String);varlSize:Int64;lStream:TFileStream; Sfilename:Sfilename:string;psocket:tidtcpclient;begintrypsocket:=tidtcpclient.Create(nil);psocket.Host:=FIP;psocket.Port:=9923;psocket.Connect();ifpsocket.Connectedthenbeginlstream:=tfilestream.Create(localname,fmopenread);trypsocket.WriteLn('START');psocket.writeln(remotedir);lsize:=lstream.Size;iftrim(psocket.ReadLn())='BEGIN'thenbeginpsocket.writeln(inttostr(lsize));psocket.writestream(lstream,false,false,lsize);end; finallylstream.Free;end;end;finallypsocket.Disconnect;end;end;客户口端文件夹传输完毕以后断开连接,释放套节字空间。2)服务器端接收到文件夹传输请求以后,初始化分配临时空间,获取文件夹基本信息。以及设置存放路径。procedureTForm1.PServerExecute(AThread:TIdPeerThread);procedureTForm1.PServerExecute(AThread:TIdPeerThread);varcmd,tmpfn,msg,targetname,localdir,com:string;lsize:int64;fs:tfilestream;filename:pchar;sign,i:integer;ldir:stringarray;lSavePath,Savedir:String;beginwithathread.Connectiondobegincmd:=trim(readln);ifcmd='TRANSDIR'then//接收文件夹信号beginifselectdirectory('保存文件夹','我的电脑',Savedir)=truethenbeginiftrim(copy(Savedir,length(Savedir),1))<>'\'thenSavedir:=Savedir+'\';GetMem(localroot,255); zeromemory(localroot,255);move(Savedir[1],localroot^,length(Savedir));writeln('TRUE');endelsewriteln('FALSE');end;ifcmd='START'thenbeginmsg:=readln();//接收文件名ldir:=split(msg,'\');localdir:=strpas(localroot);fori:=0tohigh(ldir)-1dobeginlocaldir:=localdir+ldir[i]+'\';ifnotdirectoryexists(localdir)thencreatedir(localdir);//创建接收到的文件夹下边的文件夹end;targetname:=strpas(localroot)+msg;//本地文件名writeln('BEGIN');//发送开始信号lsize:=strtointdef(readln,0);//接收文件大小iflsize=0thenbegindisconnect;exit;end;fs:=TFileStream.Create(targetname,fmcreate);readstream(fs,lsize);fs.Free;end;end;end;文件夹接收完毕保存到本地路径,其源代码如下:Proceduretform1.UMRcvfileTWO(varmsg:tmessage);//Proceduretform1.UMRcvfileTWO(varmsg:tmessage);//接收文件夹名字及设置存放路径varlocalroot:pchar;savedir,cmd,tempdir:string;ldir:stringarray;i:integer;begin Savedir:='';//filename:=pchar(msg.WParam);取得文件夹名字//ldir:=split(string(filename),'\');//cmd:=extractfil

温馨提示

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

评论

0/150

提交评论