版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 一、 设计目的通过综合课程设计,使学生能够运用数字信号处理、信号与系统、通信原理、面向对象的程序设计、计算机通信网、通信协议开发及应用等课程的知识来设计一个基于Socket 的即时通讯系统,培养学生的动手能力以及分析问题、解决问题的能力。二、 设计内容1. 大部分网络协议的实现都由客户端(Client和服务器端(Server来协作完成。这种模型本质上涉及两个不同的程序,通常这两个程序在不同机器上运行。这些机器之间都有网络连接。服务器端程序提供服务并对来自客户程序的请求作成响应。而客户端程序则是在使用者和服务器端程序之间建立某种沟通的渠道,或者是作为使用服务器端提供的某种网络服务的工具。一个典
2、型的服务器与客户机之间的交互可能如下所示:1 客户机提出一个请求;2 服务器收到客户机的请求,进行分析处理;3 服务器将运行处理的结果返回给客户机。服务器与客户端的Socket 通信类型:Socket 的连接类型可以分为两种,分别是面向连接的字节流类型(Sock_stream和面向无连接数据报类型(Sock_dgram。面向无连接数据报类型的Socket 工作流程比较简单,双方不需要进行太多的沟通与交互。客户机直接将用户的请求打包发送到服务器端,省略了建立一个固定信息通道的过程。服务器端也是直接将处理的结果发送给客户端。每个发送的数据报都携带有传递所需要的所有地址信息。其工作流程如图1 所示。
3、面向连接的字节流类型的Socket 工作中有比较严格的操作次序, 工作的原理也比较复杂。在这种类型的Socket 的工作过程中, 必须首先启动服务器端, 通过调用socket(函数建立一个Socket 对象,然后调用Bind(函数将该Socket 对象和本地网络地址绑定到一起。再调用Listen(函数使该Socket 对象处于侦听状态,并规定它的最大请求的数量。三、 设计要求1 熟练掌握面向对象的程序设计方法;2 实现点对点通讯,能进行文字对话传输,包括客户端与服务器端;3 能对系统参数进行配置;4. 实现文件传输;5. 友好的对话界面。四、 设计原理Delphi ,是Windows 平台下著
4、名的快速应用程序开发工具(Rapid Application Development,简称RAD 。Delphi 是一个集成开发环境(IDE ),使用的核心是由传统Pascal 语言发展而来的Object Pascal ,以图形用户界面为开发环境,透过IDE 、VCL 工具与编译器,配合连结数据库的功能,构成一个以面向对象程序设计为中心的应用程序开发工具。4.1 Delphi Socket1.Delphi 中Socket 的操作方式根据连接发起的方式以及本地Socket 要连接的目标,Socket 之间的连接可以分为:客户端连接、监听连接以及服务器端连接。Delphi 分别使用ClientSo
5、cket 组件和ServerSocket 组件来操纵客户端Socket 和服务器端Socket 的连接和通信。ClientSocket 组件为客户端组件。它是通信的请求方,也就是说,它是主动地与服务器端建立连接。ServerSocket 组件为服务器端组件。它是通信的响应方,也就是说,它的动作是监听以及被动接受客户端的连接请求,并对请求进行回复。ServerSocket 组件可以同时接受一个或多个ClientSocket 组件的连接请求,并与每个ClientSocket 组件建立单独的连接,进行单独的通信。2.ServerSocket 的属性设置Port 是通信的端口,必须设置。在本文实例中设
6、置为2010;ServerType 服务器端读写信息类型,设置为StNonBlocking 表示异步读写信息,本文实例中采用这种方式。ThreadCacheSize ,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接。本文实例采用默认值10。3.ClientSocket 的属性Port ,是通信的端口,必须与服务器端的设置相同。否则可能导致两个组件发送的目标端口和接收的端口不一致,无法建立有效的信息传送连接。ClientType ,客户端读写信息类型,应该与服务器端的设置相同,为ctNonBlocking 表示异步读写信息.Host ,客户端要连接的服务器的ip 地址。必须设置,当然
7、也可以在代码中动态设置4. 利用Buffer 一次性传输文件数据,采用交互式的传送控制,一次就把文件读入Buffer 中再发送.4.2设计思路实例包括一个服务器端程序与一个客户端程序。客户端程序可以放到其他计算机上运行, 同时与服务器端进行连接通信。服务器程序实现以下基本功能:1 记录客户端主机名称等;2 显示当前聊天内容;3 能接收文件并显示文件的相关信息。客户端程序实现一些基本功能:1 显示当前程序的工作状况;2 实现服务器端发送的注销、重启、关机的操作;3 能实现信息以及文件的发送,以及信息的接收。4.3 服务器端设计ServerSocket 组件为服务器端组件, 是通信的响应方, 它的
8、动作是监听及被动接收客户端的连接请求, 并对请求进行回复. 服务器端主要包括系统信息. 服务器端可实现服务器的启动、停止等功能. 系统信息界面显示服务器是否正常启动; 需自定义的数据类型用于设置socket 中的Data. 添加Label1、Label2、RichEdit1、ToolBar1、StartBtn 、StopBtn 、SaveBtn 、SS 等并做相关设置。并在相关控件下添加控制事件,在控制事件中添加相应函数使之完成相应功能。4.4 客户端设计ClientSocket 组件为客户端组件, 是通信的请求方, 能主动与服务器端建立连接. 需自定义function GetFileSize
9、(const FileName:string:integer;用获取文件长度。还需要添加一些主要的控件包括Edit1、Label1、RichEdit1、ToolBar1、ConnectBtn 、OpenBtn 、DisconnectBtn 、SendBtn 、Cs 、OpenDialog1等并做相关设置,添加相应的控制事件,在控制事件中添加相应函数使之能完成相应的功能。五、 软件设计1. 程序流程图 2. 程序清单1.客户端程序代码如下:function getfilesize(const filename:string:integer;var f:Tfilestream;beginf:=Tf
10、ilestream.Create(filename,fmopenread orfmsharedenynone;result :=f.Size;f.Free;end;procedure TForm1.Button2Click(Sender: TObject;beginend;procedure TForm1.csRead(Sender: TObject;Socket: TCustomWinSocket;begintimetostr(time+=+socket.receivetext;end;procedure TForm1.FormClose(Sender: TObject; var Actio
11、n: TCloseAction; beginif cs.Active /:=truethencs.Active:=false;cs.Close;end;procedure TForm1.ConnectBtnClick(Sender: TObject;varremotehost:string;beginremotehost:=inputbox(建立连接, 请输入对方IP 地址或名称:,; if trim(remotehost thenbeginif cs.Active thencs.Active :=true;cs.Port:=9999;cs.Host:=remotehost;trycs.Act
12、ive :=true;except/show messsage(连接失败!;end;end;end;procedure TForm1.DisconnectBtnClick(Sender: TObject;begincs.Close;end;procedure TForm1.OpenBtnClick(Sender: TObject;vartmpstr:string;beginwith opendialog1 dobeginexecute;if filename thenbegintmpstr:=FILESEND +ExtractFilename(Filename+ +inttostr(getfi
13、lesize(filename;edit1.text:=filename;end;end;end;procedure TForm1.SendBtnClick(Sender: TObject;varfs: Tfilestream;buf: pointer;beginfs:=Tfilestream.Create(edit1.Text,fmopenread or fmsharedenynone;GetMem(Buf,fs.size;fs.Seek(0,sofrombeginning;fs.ReadBuffer(buf,fs.size;end;procedure TForm1.csConnect(Se
14、nder: TObject; Socket: TCustomWinSocket; begintimetostr(time+=+主机连接成功:;end;end.2. 服务器端程序代码如下:typeTDataflag = recordFileName: string;FileSize: integer;WorkFlag: integer;end;PDataFlag =TDataflag;procedure TForm1.ssClientRead(Sender: TObject;Socket: TCustomWinSocket;vardf : pdataflag;cmd:string;buffer
15、: pointer;nretr : integer;fs : tfilestream;const buffersize = 1024;begindf:=Socket.Data;case df.WorkFlag of 0,3 :/修改begincmd :=trim(Socket.receivetext;if pos(filesend ,uppercase(cmd 0 thenbegindf.FileName := trim(copy(cmd,pos( ,cmd+1,length(cmd; df.FileSize := strtoint(copy(df.FileName,pos( ,df.File
16、Name+1,length(df.FileName;df.FileName := trim(copy(df.FileName,1,pos( ,df.FileName;df.WorkFlag :=1;socket.Data := df;timetostr(time+=+文件名+df.FileName+文件大小:+inttostr(df.filesize+#13#10 文件传送服务准备完毕,可以传送!; end;end;1 : begingetmem(buffer,buffersize;nretr := socket.receivebuf(buffer,buffersize;if not file
17、exists(label5.caption+df.FileNamethenbeginfs :=tfilestream.Create(label5.Caption+df.FileName,fmcreate or fmsharedenynone;fs.Seek(0,sofrombeginning;end/xiugaielsebeginfs :=tfilestream.Create(label5.Caption+df.FileName,fmopenwrite or fmsharedenynone;fs.Seek(0,sofromend;end;/xiugaifs.WriteBuffer(buffer
18、,nretr;fs.Destroy;freemem(buffer;df.WorkFlag:=0;socket.SendText(文件传送服务准备完毕,可以传送下一个文件!#13#10; end;end;end;procedure TForm1.Button1Click(Sender: TObject;beginss.open;end;procedure TForm1.Button2Click(Sender: TObject;beginend;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction; beginss
19、.Active:=false;end;procedure TForm1.FormCreate(Sender: TObject;beginStartBtnClick(sender;end;procedure TForm1.StartBtnClick(Sender: TObject;beginss.Port :=9999;ss.Active := True;timetostr(time+=+文件传送服务启动!;end;procedure TForm1.StopBtnClick(Sender: TObject;beginss.Active :=false;timetostr(time+=+文件传送服
20、务停止!;end;procedure TForm1.SaveBtnClick(Sender: TObject;varpath:string;beginpath:=Extractfilepath(application.exename;/if SelectDirectory(path,sdallowcreate,sdperformcreate,sdprompt, /1000 thenbeginif path then beginif copy(path,length(path,1 thenpath:=path+;/修改label5.Caption:=path;timetostr(time+=+文
21、件存储路径设置为:+path;end;end;end;procedure TForm1.ssClientConnect(Sender: TObject;Socket: TCustomWinSocket;var df : pdataflag;beginDf :=new(pdataflag;Df.FileName := ;Df.FileSize := 0 ;df.WorkFlag := 0;socket.data := df;timetostr(time+=+文件传送服务器连接用户:+socket.remotehost+ +socket.remoteaddress;end;end.六、 调试过程程
22、序调试过程中,出现了一些基础的问题,比如一些标点符号的错误,字母错误,还有一些变量未被未初始化的情况,这种问题一般发生在数据库定义的字段属性和赋的属性不一致, 或者数据库字段长度不够, 假如var(5你给个长度10的字符串, 就会报这种错. 。出现这几个变量未定义 我去网上找了很多解决的办法,尝试很多次,最后由于时间资源有限,最终还是没解决,最后只好把它屏蔽掉啦,因此没了修改存储路径的功能,还好还是能传输,影响还是不是很大吧。以后有机会再继续改进吧。解决方法: 编译程序可以对的程序进行初步的调试,排除一些故障。但是仅仅这样是完全不够的,需要更加强大的调试能力才能胜任更加复杂的程序调试任务。在遇
23、到一些大的问题时,使用一些基本、最重要的调试手段包括:单步跟踪、断点、变量观察、堆栈检查等。所有这些功能在Delphi 的集成调试程序中都能提供。按下F9(Compile and Run,编译并运行)一个程序时,就已经启动了Delphi 的集成调试程序,而按下Ctrl+Break(Program Pause ,程序暂停)时则会暂停被调试程序返回到集成调试程序中去,再次按下F9会从暂停地地方继续执行,而Alt+F2(Program Reset,程序复位)则会完全中止被调试程序的执行,返回集成调试程序中去。对于某些递归调用和复杂的嵌套调用来说,使用Call Stack 功能能够方便的检查函数的调用
24、情况。按Ctrl+Alt+S可以显示这个窗体,在最上面的是当前过程或函数,在最下面的往往是你的主程序。例如:TForm1.Button1Click(?;Project1这表示Project1调用了方法TForm1.Button1Click ,由于其参数是一个对象(Sender:TObject),不能求值,所 以用? 表示。双击Project1可以看出在什么地方调用了TForm1.Button1Click (如果调用点没有源代码,则显示有源代码的第一 行)。七、 实验结果分析在这个即时通信程序中,首先打开服务器端程序再打开客户端程序,服务器端与客户端界面如下: 此通信系统的设计可以满足一对一通信,单方面传送文件的要求。如下图所示: 八
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论