资源描述
基于服务器技术的局域网内多点信息交互程序设计摘 要随着互联网技术的迅猛发展,计算机通信给人类文明带来了翻天覆地的变化。很多情况下,人们的日常工作需要借助文件传输来完成。但大多数文件传输功能都需要借助移动磁盘等硬件设备或Internet上的服务器才能实现。这就给那些具有大规模内部网络的用户造成了许多问题,如浪费资金、浪费网络资源、病毒入侵、降低了工作效率等。为了方便局域网内主机的资源共享,需要开发一个基于局域网的多点信息交互程序,在内部网络中实现文件交换。基于局域网的文件传输系统的设计选用Delphi 为开发工具,以C/S模式通过建立Socket连接后实现局域网快速,准确,安全的点对点文件以及文件夹传输功能。本系统能够促进局域网内用户之间的文件资源共享,满足主机之间信息交流,确保文件及文件夹传输安全性,有效地提高工作效率。设计共分为五大模块,分别为:一、介绍选题背景及意义和国内外研究现状;二、介绍TCP/IP点对点协议技术,C/S架构的Delphi程序设计技术和Socket网络编程技术;三、对当前局域网文件传输进行需求分析并提出解决方案;四、根据解决方案对系统进行设计;五、对基于局域网的文件传输系统进行测试并得到测试结果。关键词:C/S结构;网络通讯组件;点对点;Socket连接第 1 页 共 24页The Design and Implementation of File Transfer System Based on LANAbstractAlong with the Internet technology swift and violent development, the computer correspondence the human culture has brought the earth-shaking change for. In very many situations, peoples routine work needs to draw support from the file transfer to complete. But the majority file transfer function all needs to draw support moves hardware equipment or the Internet and so in the floppy disk server can realize This gave these to have the large-scale internal network user to create many problems, like the waste fund, the waste network resources, the viral invasion, reduced the working efficiency and so on. In order to facilitate in the local area network main engine resources sharing, needs to develop one based on the local area network file transfer tool, realizes the document exchange in internal network. The design and implementation of file transfer system base on LAN uses Delphi development tool,C/S mode through the establishment of Socket after connecting LAN users fast, accurate, the point-to-point security files and folders transmission functions. The system can contribute to LAN users to share file resources to meet the exchange of information between mainframe, ensure that the filets and folders transmission security, effectively improving efficiency. The design is divided into five major module altogether, including: First, introduction selected topic background and significance and domestic and foreign research present situation; Second, introduces the TCP/IP point to point protocol technology, C/S overhead construction Delphi programming technique and the Socket network programming technology; Third, carries on the demand to the current local area network file transfer to analyze and to propose the solution; Fourth, carries on the design according to the solution to the system; Fifth, to carries on based on the local area network file transfer system tests and obtains the test result.Key words: C/S structure; Network communication module; Point-to-point; Socket connection.目 录论文总页数:26页1引言11.1选题背景11.2国内外研究现状11.3课题研究的意义12理论基础22.1TCP/IP点对点协议技术22.2C/S架构的DELPHI程序设计技术22.3SOCKET网络程序设计技术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参考文献25致 谢26第一章 绪论1.1 选题背景当今世界科学技术飞速发展,尤其以计算机通信网络为代表的互联网技术更是日新月异,令人眼花燎乱,目不睱接。在计算机与网络迅速发展的今天,借助于网络进行信息资源交流给人们带来了极大的方便。各种文件传输系统都已被广大用户接受。比如QQ、UC、Internet邮件等互联网中运用最为广泛的文件传输工具,但它们之间的文件传输往往对远程服务器有非常大的依赖性,没有彻底实现点对点安全的文件传输。甚至需要花费大量的金钱购买各种移动磁盘或者其他局域网内连接主机的硬件设备。而达到的效果却总是因为传输效率以及安全威胁而受到很大的限制。在这种形势下,开发一个功能简单而实用,能在Windows操作系统中运行,并且具有可移植性的局域网内文件传输工具势在必行。1.2 国内外研究现状目前,国内外企业对局域网的信息传输系统认识和使用情况并不好,各个企业单位在局域网内实现文件传输,资源共享还有很大的缺陷。技术无论是从理论上或实践上都还不够完善。文件传输系统由于比较复杂,可变因素较多,安全性低,因此发展还不成熟。但是随着科学技术的发展,各种以局域网为单位的文件传输系统已经进入稳健发展期,比如说市面上比较普遍使用的QQ、UC、飞鸽传书等以内部网络为中心的资源共享系统也即将进入高速发展期。在国内,随着企业资源管理的规范化和规模的不断扩大,企业的计算机资源管理将不仅仅停留在依靠硬件或者Internet网络获取,而且将会向着安全的内部网络化资源管理方式迈进。1.3 课题研究的意义随着网络通信技术的发展与用户需求日益多样化,现代局域网络正处在变革与发展之中,本课题的主要目的之一是为了更清晰地培养学生掌握科学研究方法的能力和使学生迅速体会文件传输系统的研发过程。基于局域网的文件传输系统能够让家庭网络以及各个企业等局域网对内部资料有一个快捷,准确,安全的共享。特别是对如今较大系统研发的模块分工合作得到了绝对保密性,从而使各项工作有计划、更科学的进行及顺利完成,使企业的办事效率得到显著提高。文件传输系统主要功能是自动获取局域网内用户的主机名,IP地址以及工作组名字,最终以C/S模式通过TCP/IP协议实现点到点文件传输功能。本系统既锻炼了我们的实际动手能力,使我们将大学四年所学的理论知识与实际开发相结合,又引导我们进行了一次模拟实际产品的开发,对于我们以后工作能力的培养具有重要的意义。 第二章 理论基础2.1 TCP/IP点对点协议技术系统的文件传输功能主要依赖于建立客户端与服务器之间点对点的的连接后实现。所以就得与TCP/IP协议协合。TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是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协议。2.2 C/S架构的DELPHI程序设计技术本系统的开发主要采用C/S结构。所谓C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将信息交互任务合理分配到Client端和Server端来实现,降低了系统文件传输过程中的开销。目前大多数应用软件系统都是Client/Server形式的两层结构。传统的CS体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。 服务器主机客户机A客户机B客户机C客户机N Request ResponseRequest Response Request Response . . . . Request . Response图1 客户机/服务器通讯结构文件传输系统同时采用了Delphi网络组件编程技术。Delphi是美国BORLAND公司推出的功能强大的应用程序开发工具。它具有简单、高效、功能强大的特点。它可是众多程序员至爱的编程工具。Delphi具有很多特性:基于窗体和面向对象的方法,高速的编译器,与Windows编程紧密结合,强大而成熟的组件技术。而且其重要的还有Object Pascal语言,它是一切的根本。 Object Pascal语言是在Pascal语言的基础上发展起来的,简单易学。Delphi提供了各种开发工具,包括集成环境、图像编辑(Image Editor),以及各种开发可视化软件的应用程序,如DesktopDataBase Expert等。除此之外,还允许用户挂接其它的应用程序开发工具,如Borland公司的资源编辑器(Resourse Workshop)。DELPHI是可视化应用编程开发环境,可重用性面向对象编程语言,快速编译器能够有效快速建立WINDOWS应用程序,快速简化WINDOWS与浏览器客户,WEB服务器以及中间件等开发之外,同时也支持基于WEB服务的Microsoft,.net, Sun one体系,而且提供给WEB开发者需要的可伸缩性和可靠性。用户可以开发支持WEB服务特性的服务器端和客户端应用,而这一切都是通过一套高度集成的可视化开发工具,先进的编译技术和可重用的组件完成。2.3 SOCKET网络程序设计技术文件传输系统得以实现的根本在于建立有效的连接以及是否存在文件传输载体。所谓Socket通常也称作套接字,用于描述IP地址和端口,socket类表现了客户端套接字,它是属于两台计算机的两个TCP通讯端口之间的通讯通道。在网络编程中,客户端使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口。服务器使用Socket监听指定的端口,端口可以随意指定,等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。第三章 系统需求分析 3.1 现行业务系统描述目前各种文件资源交流的主要方式可以分为三种:(1)通过局域网内主机之间以文件共享后再经过复制,粘贴方式实现。(2)依靠可移动磁盘的两次信息转移实现。(3)通过Internet邮件方式实现。此三种方法并非不可行,但它们都需要花费较长的时间以及安全性也得不到保证,工作效率将在很大程度上受到限制。如果通过局域网内主机之间复制粘贴来实现文件资源共享,将浪费大量的网络带宽,极大程度上影响了网内用户的工作效率,甚至导致用户不能正常工作;如果依靠移动磁盘实现文件的共享,将花费大量的金钱,而文件较大移动磁盘容量不足的情况下会令人极为头疼,何况移动磁盘是病毒传播的重要途径;如果通过Internet邮件方式实现,用户需要接入Internet服务器,这种方式对远程服务器有非常大的依赖性,即使1KB的文件都要经历极度繁琐的路径,不能彻底实现点对点的即时交流,文件较大的情况下就不言而喻了。最重要的是,在如今病毒黑客横行的网络世界中,信息的安全性也得不到保证。 综上所述,依靠Internet网络等方式实现文件资源交互的准确性,快速性及安全性远达不到理想的要求。3.2 现行系统存在的主要问题分析针对企业来说,提高工作效率是企业的一个重心;降低成本是企业赢取最大利益的重要方式;保证信息安全却是可能影响企业生死存亡的关键。企业需要对各种因素有足够深刻的认识才可能实现最终目标-盈利。而传统的文件资源交互方式却存在很多的问题,大致可以分为:一、不能有效地降低文件交互成本;二、文件交换过程过于繁琐;三、内部机密资料得不到安全保证;四、文件交互的准确性得不到更本保证。3.3 提出解决方案解决当前问题的方案主要是指在允许的成本、性能要求下,分析系统实施的可行性,提出功能实现的依据,包括其简单性,安全性以及经济可行性。根据企业简单快速,安全的资源共享等要求,提出以下四种解决方案:1)操作简单性方案:开发的系统需要有以下特点:Windows友好的用户界面和系统快速的应用方法,简单易操作,不需对使用人员进行培训,可以使用户很好的掌握。对传输文件过程中的文件的载入设置都是非常简单可行,比如:如果用户忘记选择文件接收者的时候系统会自动提示“请选择接收用户”要求用户选择主机而不导致错误出现而引发的不便,这样就大大提高工作效率。而且开发的系统应该简单易操作,易维护,减少了不必要的麻烦。对于家庭局域网以及一些比较简单的中小企业网,系统必须做到在实际应用中较为成功。系统应为用户提供Windows所一贯坚持的非常友好、操作简单的用户界面。2)传输安全性方案:系统开发完成后,能有效地使内部资源与外网的完全隔离,从而保证了内部机密文件的安全性。3)经济可行性方案:系统开发完成必须作到提高文件共享效率,不管是在资金上还是效率上都能达到预期的效果的。最重要的一点就是:使用户避免花费高额的资金去购买各种移动磁盘甚至是通过Internet邮件方式,使得用户方便的同时,也让信息少走了不少“弯路”。4)快速准确性方案:鉴于系统的目标要求和特点,能够保证快速准确地实现文件共享。综合上述,本设计在Windows XP操作系统下,以中文版Delphi7为开发工具,以C/S为系统功能结构,基于点对点的TCP/IP协议理论,通过Socket套节字连接客户端与服务器实现文件及文件夹传输。彻底避免了文件交换过程与外部网络的接触,实现快速的文件资源共享。并能够确保内部文件的机密性,能够在很大程度上有效地提高工作效率。第四章 系统设计4.1 系统总体架构本系统的设计过程主要分为两部分:第一部分:系统界面的设计以及获取局域网内所有在线用户的主机名,IP地址以及工作组名。使网内所有用户都能够获取其他用户信息。第二部分:文件传输是本设计功能实现的核心。系统采用C/S架构将系统运行载体分为两个部分:客户端与服务器端。文件传输需要建立有效的连接后,通过TCP/IP协议实现点对点的文件传输。通信双方是通过三次握手建立Socket连接,实现文件传输,最后关闭套节字连接。文件传输的整个流程图如下:服务器端主机客户端主机TCP/IP连接响应套节字连接请求LIANJIETCP3次握手接收文件流并保存写入文件流SOCKET流断开连接断开连接响应 三次握手图2 文件传输系统框架图 4.2 系统界面设计4.2.1 界面设计界面是系统功能得以实现的基本平台,这里充分利用Delphi可视化开发环境以各种组件设置。界面的设计可以分为五步:1)创建一个工程,制作一个窗体form1;2)在form1内加入用户列表userlist并设置列表项:用户名,工作组,IP地址以及它们的属性;3)在form1内加入Memo1;4)在Memo1内加入各种DELPHI网络通讯控件,本系统用到的控件分别有:a. 用于传送文件是打开文件的控件OpenDialog1;b. 用于接收端保存文件的控件SaveDialog1;c. 用于点到点文件传输的客户端PClientConnected及服务器端PServerAfterCommandHandler;d. 用于广播主机信息的客户端ClientStatus和服务器端ServerStatus数据报组件;e. 用于设置退出系统和窗口前端显示的PopupMenu1菜单;5)分别创建刷新按钮BitBtn1,文件传输BitBtn2以及文件夹传输BitBtn3按钮。设置的界面如下图:图 3 基于局域网的文件传输系统界面4.2.2 用户信息用户列表建立以后,将局域网内所有在线用户的主机名,主机IP地址以及工作组名显示于列表中。方法是首先确定用户主机是上线信息,返回信息,握手信息还是离线信息。这里对他们分别设置了一个信息发送的头信息,分别设置为:LOGIN,HAND以及LOGOUT。如果新用户上线,它就向局域网以LOGIN为头信息广播本机的主机名,IP地址以及工作组。局域网内所有在线主机收到该广播信息以后将新上线的主机名,端口,IP地址以及工作组信息添加到自己的在线用户列表并都以HAND为头信息向局域网广播本机的握手信息;当包括刚上线主机在内的局域网所有主机收到这个握手信息以后线判断自己的在线用户列表中是否存在这个主机广播的主机信息,如果不存在就说明它是刚上线主机,最后将这个信息添加到自己在线列表,否则就不加;当用户下线的时候也将自己的信息以LOGOUT为头信息广播给局域网,其他在线用户收到这个消息以后将其主机信息从本地在线用户列表删除。其部分的源代码分别如下:procedure TForm1.FormCreate(Sender: TObject); /新用户上线 以LOGIN为头信息var wsadata:twsadata; myinfobuf:array0.1023of char; /本机信息 pmyname:array0.1023of char; /本机名wList,clist: TStringList ; i,j:integer;begin mainhide; /把程序图标显示在系统托盘里边 if wsastartup($101,wsadata)0 then exit; /获取本机名 gethostname(pmyname,sizeof(pmyname); /获取主机名 myname:=strpas(pmyname);/得到主机名 try wlist:=tstringlist.Create; clist:=tstringlist.Create; GetServerList(wList); /获取本机IP for i:=0 to wlist.Count-1 do begin getusers(wlist.Stringsi,clist);/得到用户名 for j:=0 to clist.Count-1 do begin if (clist.Stringsj=uppercase(myname) or (clist.Stringsj=myname) then begin myworkgroup:=wlist.Stringsi; /获本机工作组 end; finally wlist.Free; clist.Free; end; myinfo:=format(%-6s%-255s%-255s,LOGIN,myname,myworkgroup); strpcopy(myinfobuf,myinfo); client.Broadcast(myinfobuf,9000); end;function tform1.handdata(ip,name,workgroup:string;port:integer):string; /向好友发握手信息 var minfobuf:array0.1023of char; minfo:string;begin minfo:=format(%-6s%-255s%-255s,HAND,name,workgroup); strpcopy(minfobuf,minfo); server.SendBuffer(ip,port,minfobuf,sizeof(minfobuf);end;procedure TForm1.N10Click(Sender: TObject); /用户离线 以LOGINOUT为头信息var mylogoutbuf:array0.1023of char; mylogoutinfo:string;begin mylogoutinfo:=format(%-6s%-255s,LOGOUT,myname); strpcopy(mylogoutbuf,mylogoutinfo); client.Broadcast(mylogoutbuf,9000); / 广播自己离线信息 Application.Terminate; /销毁线程end; 4.3 系统功能模块设计4.3.1 获取用户信息本部分主要是显示用户列表中在线用户的主机名,主机的IP地址以及工作组名三部分,代码分别进行介绍如下:Function tform1.GetUsers( GroupName : string;List : TStringList) : Boolean; /获取工作组的计算机名称type TNetResourceArray = 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);If Res NO_ERROR Then Exit; /执行失败While True Do/列举指定工作组的网络资源BeginCount := $FFFFFFFF;/不限资源数目BufSize := 8192;/缓冲区大小设置为8KGetMem(Buf, BufSize);/申请内存,用于获取工作组信息/获取计算机名称 Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);获取局域网内用户名的源代码如下:procedure TForm1.ServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);var readbuf:array0.2030of char; msg,head,recvip,recvname,recvworkgroup,recvmsg,memo:string; recvport:integer; f:textfile;begin ZeroMemory(readbuf0,2030); adata.Read(readbuf,sizeof(readbuf); msg:=Trim(String(Pchar(Readbuf0); /memo1.Lines.Add(msg); head:=trim(copy(msg,1,headlen); if head=LOGIN THEN /添加对方IP 1.返回对方IP 2. 发出Hand握手信息 begin recvip:=abinding.PeerIP; recvport:=9000;If Res = ERROR_NO_MORE_ITEMS Then break;/资源列举完毕 If (Res NO_ERROR) then Exit; /执行失败 Temp := TNetResourceArray(Buf); For Ind := 0 to Count - 1 do/列举工作组的计算机名称 Begin tmpStr:=Temp.lpRemoteName;/获取工作组的计算机名称 Delete(tmpstr,1,2); list.Add(tmpstr); Inc(Temp); End; End; Res := WNetCloseEnum(lphEnum);/关闭一次列举 If Res NO_ERROR Then exit;/执行失败Result := True; FreeMem(Buf);End;获取局域网的用户IP地址以及添加用户信息的源代码如下:Function tform1.GetServerList( var List : TStringList ) : Boolean; /获取服务列表Var NetResource : TNetResource; /初始化网络层次信息Buf : Pointer;Count,BufSize,Res : DWORD;lphEnum : THandle; / memo1.Lines.Add(login recv+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; if head=REVLOGthen /添加对方返回的自己的ip (对比) begin / memo1.Lines.Add(revlog recv); RECVPORT:=strtoint(copy(msg,headlen+1,portlen); recvip:=copy(msg,headlen+portlen+1,iplen); end;if head=HANDTHEN /处理握手信息 添加对方ip 返回对方ip BEgin / memo1.Lines.Add(hand recv); RECVNAME:=COPY(msg,headlen+1,namelen); recvworkgroup:=copy(msg,headlen+namelen+1,workglen); recvip:=abinding.PeerIP; recvport:=9000; recvp2pdata(recvip,recvname,recvworkgroup,recvport); END;if head=LOGOUTthen /处理logout delete 其ip begin recvname:=copy(msg,headlen+1,namelen); if mynamerecvname then deleteuser(recvname); end;获取局域网的工作组名的源代码如下: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); /得到网络中的所有工作组的名称If Res NO_ERROR Then exit;/Raise Exception(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) /执行失败then break;P := TNetResourceArray(Buf);For I := 0 To Count - 1 Do /列举各个工作组的信息BeginList.Add( StrPAS( P.lpRemoteName ) ;/取得一个工作组的名称Inc(P);End;End;Res := WNetCloseEnum(lphEnum);/关闭一次列举If Res NO_ERROR Then break;/执行失败End;Result := True;FreeMem(Buf);NetworkTypeList.Destroy;End; 4.3.2 局域网内文件传输文件传输实现之前,需要获取在线用户列表中的用户信息。所以系统设置一个“刷新”按钮,当用户点击 “刷新”后将更新界面的用户列表中所有在线用户 的主机名,主机IP地址和工作组名。并显示在线人数。源代码如下:procedure TForm1.BitBtn1Click(Sender: TObject); /显示在线人数var f:textfile;begin Label2.Caption:=INTTOSTR(USERLIST.Items.Count);end;文件以及文件夹传输功能是本设计能够实现的理论核心。系统实现主要依靠发送端与接收端建立有效的连接后,客户端不断地向SOCKET写入文件流,服务器端不断接受来自客户端的SOCKET文件流。直到文件传输完毕关闭套节字连接并释放空间。文件传输的整个过程可以分别表示为:客户端和服务器端。1)客户端连接并发送功能:客户端点击文件发送按钮以后,系统首先判断是否选择文件接受者。如果没有选择就提示用户选择接收者。然后以组件opendialog1.Execute打开传输文件。建立文件流并执行TSendThread.Execute。在TSendThread.Execute中写入接收主机的IP及端口号。向服务器发送连接请求。连接成功后发送文件流。代码依次如下:Procedure TForm1. BitBtn2Click(Sender: TObject); /发送按钮 文件传输事件var filename:string;tempItem:TListItem;begintempItem:=UserList.Selected; /获取文件接收者if (not assigned(tempItem) or (tempItem=nil) thenbegin MessageBox(self.Handle ,请选择消息接收者!,提示,0); exit; end;if opendialog1.Execute then /如果文件打开。 begin filename:=opendialog1.FileName; /获取文件名 TSendThread.createThread(tempitem.SubItems.Strings1,extractfilename(filename); /创建线程并立刻执行 end;end;文件打开后客户端调用函数TSendThread.createThread建立文件传输流。此函数的源代码如下: onstructor TSendThread.createThread(IP,FileName:string); /创建文件线程begin Fip:=IP; FFilename:=filename; FreeonTerminate:=true; /完成后自动关闭 inherited create(false); /表示创建线程后立刻执行end;文件流建立后由inherited create(false)提示系统自动执行TSendThread.Execute函数发送文件。码如下:procedure TSendThread.Execute; /运行线程var socket:tidtcpclient; /定义客户端套节字 fs:tfilestream; /定义文件流begintry socket:=tidtcpclient.Create(nil); /创建客户端套界字 socket.Host:=Fip; /写入IPsocket.Connect(); /进行套节字连接 if socket.Connected then fs:=tfilestream.Create(FFileName,fmopenread); /创建文件流和文件建立关联设置 /参数 fmopenread=file mode openread try socket.WriteLn(TRANSFILE); /写入套接字类型为 TRANSFILE socket.WriteLn(FFileName); /写入传输的文件名 socket.WriteLn(inttostr(fs.Size); /整型转字符型 fs.Size为字节流的长度 socket.WriteStream(fs,false,false,fs.Size); /写入文件 finally fs.Free; /释放文件流 end; getmem(hostname,255); /post the hostname /分配监视器内存 zeromemory(hostname,255);/清空内存 move(myname1,hostname,length(myName);/获取传输文件名 postmessage(TranSuVisorform.handle,TransferSupervisorTwo,integer(hostname),0); getmem(pname,255); zeromemory(pname,255); /post fname and size move(FFileName1,pname,length(FFileName); postmessage(TranSuVisorform.handle,TransferSupervisor,integer(pname),lSize); end;文件传输完毕以后断开SOCKET连接并释放套节字空间。2)服务器端响应功能:当服务器收到来自客户端文件传输连接请求后,对其进行连接响应建立连接。连接建立后得到文件的基本信息,进行自动初始化并分配临时空间。如果文件大小为OK就认为是文件传输完毕自动断开连接。否则接收文件开始。当传输完毕后断开连接。其源代码如下:procedure TForm1.PServerExecute(AThread: TIdPeerThread); /服务器端.var cmd,tmpfn,msg,targetname,localdir,com:string; lsize:int64; fs:tfilestream;filename:pchar; sign,i:integer; ldir:stringarray; lSavePath,Savedir:String;begin with athread.Connection do begin cmd:=trim(readln); / memo1.Lines.Add(cmd); if cmd=TRANSFILEthen begin GetMem(filename,255); zeromemory(filename,255); tmpfn:=readln;move(tmpfn1,filename,length(tmpfn);sendmessage(form1.Handle,WM_USER+100,integer(filename),0);writeln(BEGIN);lsize:=strtointdef(readln,0);if lsize=0 thenbegindisconnect;exit;end;fs:=TFileStream.Create(filename,fmcreate);readstream(fs,lsize);fs.Free;end;if cmd=STARTthenbeginmsg:=readln(); /接收文件名ldir:=split(msg,);localdir:=strpas(localroot);for i:=0 to high(ldir)-1 dobeginlocaldir:=localdir+ldiri+;if not directoryexists(localdir) thencreatedir(localdir); /创建接收到的文件夹下边的文件夹end;targetname:=strpas(localroot)+msg; /本地文件名writeln(BEGIN); /发送开始信号lsize:=strtointdef(readln,0); /接收文件大小if lsize=0 thenbegindisco
展开阅读全文