ImageVerifierCode 换一换
格式:DOC , 页数:24 ,大小:185.50KB ,
资源ID:1129625      下载积分:20 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 微信支付   
验证码:   换一换

加入VIP,免费下载资源
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.wodocx.com/d-1129625.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于TCP局域网聊天程序设计.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(发送邮件至2622162128@qq.com或直接QQ联系客服),我们立即给予删除!

基于TCP局域网聊天程序设计.doc

1、基于TCP局域网聊天程序第一章 系统分析11 系统设计要求:12312 系统原理框图本次课程设计的原理框图如图1.1所示:图1.1系统原理框图13 系统设计原理局域网聊天程序的实现主要为局域网内的计算机提供交流的平台。完成一个基于服务器和客户端的局域网通讯软件,类似于聊天室,可进行注册、登录、系统信息记录、聊天等功能。用户容易使用,便于管理。第二章 系统设计理论基础2.1 TCP/IP协议TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。因此用户一般不涉及。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用

2、telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内设计,后者为核外设计。用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。2.2 客户机/服务器模式C/S结构(Client/Server结构)是大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开

3、销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。首先服务器方要启动,并根据请求提供相应服务: (1)打开一通信通道并告知本地主机,它在某一公认地址端口上(如http为80)接受客户请求。 (2)等待客户请求到达该端口。 (3)接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激

4、活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。 (4)返回第二步,等待另外的客户请求 (5)关闭服务器。 客户方: (1)打开一通信通道,并连接到服务器所在主机的特定端口。 (2)向服务器发出服务请求报文,等待并接收应答;继续提出请求。 (3)请求结束后关闭通信通道并终止。 从上面的描述过程可知: (1)客户与服务器进程的作用是非对称的。因此编码不同。 (2)服务进程一般是先于客户请求启动的。只要系统运行,该进程一直存在,直到 正常终止或者强迫终止。在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服

5、务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。2.3 Socketsocket之间的连接可以分为三种类型:客户端连接,监听连接以及服务器端连接。 客户端连接是指由客户端的socket提出连接请求,要连接的目标是服务器端的socket。为此,客户端的socket必须首先描述它要连接的服务器端socket(主要是指服务器 端socket的地址和端口号),然后再定位所要连接的服务器端socket,找到以后,就向服务器端 socket请求连接。当然,服务器端的socket此时未必正好处于准备好状态,不过,服务器端的 socket会自

6、动维护客户请求连接的队列,然后在它认为合适的时候向客户端socket发出允许连接 (accept)的信号,这时客户端socket与服务器端socket的连接就建立了。监听连接,服务器端 socket并不定位具体的客户端socket,而是处于等待连接的状态。当服务器端socket监听到或者说 接收到客户端socket的连接请求,它就响应客户端socket的请求建立一个新的socket句柄并与客户 端连接,而服务器端socket继续处于监听状态,还可以接收其它客户端socket的连接请求。服务器端连接,是指当服务器端socket接收到客户端socket的连接请求后,就把服务器端socket的描述发

7、给客户端,一旦客户端确认了此描述,连接就建立了。在本文中的聊天程序用的就是监听连接,即服务器设置连接个数后进行监听,客户端进行对服务器端的连接,这样就可以进行相互通信了。第三章 系统设计3.1 系统设计目标局域网聊天程序的设计目标为一个高性能的,易于使用的,面向局域网的即时信息软件。最终的程序应具有如下功能:(1)客户端使用简便,服务器端运行稳定。客户端与服务器端可运行在多种系统平台,具有良好的兼容性能。(2)客户端与服务器端功能独立,可独立运行在不同的计算机上或运行在同一台计算机上,具有最大的灵活性。(3)能够进行注册,设置自己的用户名和密码,自动更新其他用户的名单。(4)选择特定用户并与其

8、交谈,还可以向在所有在线的用户发送消息。3.2客户端设计 客户端设计界面图为: 图3.1 聊天客户端界面图 从聊天客户端界面图知道设计步骤为: 添加一个客户端socket控件(ClientSocket)到form中使之成为一个TCP/IP客户。客户sockets允许你指定你想连接的服务器socket和你希望服务器提供的服务。一但你描述你想得到的连接,你可以使用客户socket控件去完成连接服务。 每个客户socket控件使用独立的客户windows socket对象(TClientWinSocket)去应答连接中的客户终端。使用客户sockets去: A.指定想得到的服务 客户socket控件

9、有一个数字properties,允许你指定想连接的服务器系统和端口。可以通过主机名来指定服务器系统,使用Host property。 如果不知道主机名,或者关心找到服务器的速度,你可以指定服务器系统的IP地址,通过使用Address property。你必须指定IP地址和主机名中的一个。 如果两个都指定,客户socket控件将使用主机名。除服务器系统外,必须指定客户socket将连接的在服务器系统上的端口。能够直接使用Port property来指定服务端口号。或者直接在Service property使用想得到的服务的名字。如果指定端口号和服务名,客户socket控件将使用服务名。 B.建立

10、连接 一旦在客户socket控件中完成了设置所连接的服务器的属性,就可以进行连接,通过调用Open方法。如果想要启动时自动建立连接,在设计时设置Active property为true,通过使用Object Inspector来设置。C.取得关于连接的信息 完成连接到服务器socket后,可以使用客户socket控件和相关的客户windows socket object去取得关于连接的信息。使用Socket property去访问client windows socket object。windows socket object 有一个properties,它能让你确定在连接的两端客户和服务器

11、使用的地址和端口号。 当使用一个windows socket API调用时,可以使用SocketHandle property区获得socket连接使用的handle。可以使用Handle property去访问windows,以便接收来自socket连接的信息。AsyncStyles property决定哪种信息类型是windows handle要接收的。D.关闭连接 当完成通讯想关闭socket 连接时,能够通过调用Close方法来关闭连接。连接可能要由服务器端来关闭。如果是这种情况,将收到一个OnDisconnect 事件的通知。 聊天客户端程序代码如下:procedure TForm1

12、.Button1Click(Sender: TObject);begin clientsocket1.Address:=edit3.Text;/ edit3.Clear; clientsocket1.Active:=true; button1.Enabled:=false; button3.Enabled:=true; button2.Enabled:=true;button7.Enabled:=true;end;procedure TForm1.ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket);begin s

13、tatusbar1.SimpleText:=正在连接. + clientsocket1.Address;end;procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.SimpleText:=连接到 + clientsocket1.Address;end;procedure TForm1.Button4Click(Sender: TObject);begin close;end;procedure TForm1.Button3Click(Sender: T

14、Object);begin if clientsocket1.Active then begin clientsocket1.Socket.SendText(usename+*&%#); clientsocket1.Active:=false; end; statusbar1.SimpleText:=断开连接; edit1.Enabled:=true; edit2.Enabled:=true; button1.Enabled:=true; button6.Enabled:=true; memo1.Clear; listbox1.Clear;end;procedure TForm1.Edit4K

15、eyPress(Sender: TObject; var Key: Char);begin if key=#13 then if button6.Enabled then button6.Click;end;procedure TForm1.Button6Click(Sender: TObject);var chatname : string; i : integer;begin if edit4.Text= then begin showmessage(发送消息不能为空!); exit; end;if radiobutton2.Checked=true then begin for i:=0

16、 to listbox1.items.count do begin if listbox1.selectedi then begin chatname:= listbox1.items.stringsi; memo1.lines.add(你对+chatname+悄悄说:+edit4.Text); /edit4.Clear; break; end end; clientsocket1.Socket.SendText(edit4.Text+&+chatname+$+usename+%&%&%&); edit4.Clear; end else begin clientsocket1.Socket.S

17、endText(edit1.Text+对大家说:+edit4.Text); edit4.Clear; end;end;procedure TForm1.Button2Click(Sender: TObject);begin if edit1.Text= then begin showmessage(请输入用户名!); edit1.SetFocus; exit; end; if edit2.Text= then begin showmessage(请输入密码!); edit2.SetFocus; exit; end; clientsocket1.Socket.SendText(edit1.Tex

18、t+$%$%$%); usename:=edit1.Text; password:=edit2.Text;end;procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);var temptext : string; /chatname: string; mssge : string;begin temptext:=clientsocket1.Socket.ReceiveText; if pos(#$%&,temptext)0 then /回送密码 begin temptext:=copy(tem

19、ptext,1,length(temptext)-6); if temptext=password then begin Memo1.Lines.Add(登陆成功,欢迎进入本聊天室!); listbox1.Items.Add(usename); button6.Enabled:=true; button2.Enabled:=false; edit1.Enabled:=false; edit2.Enabled:=false; button7.Enabled:=true; end else begin showmessage(密码错误,登陆失败,请检查后重新登陆!); clientsocket1.

20、Socket.SendText(usename+*&%#); end end else if pos()&*%,temptext)0 then / 他人登陆信息 begin temptext:=copy(temptext,1,length(temptext)-9); if temptextedit1.Text then begin memo1.Lines.Add(temptext+ 进入聊天室.); listbox1.Items.add(temptext); end; end else if pos($%#$,temptext)0 then /off line begin temptext:=

21、copy(temptext,1,length(temptext)-6); memo1.Lines.Add(temptext+ 离开聊天室.);/ showmessage(inttostr(listbox1.Items.IndexOf(temptext); if listbox1.Items.IndexOf(temptext)-1 then listbox1.Items.Delete(listbox1.Items.IndexOf(temptext); end else if pos(#$%&*,temptext)0 then begin mssge:=copy(temptext,1,length

22、(temptext)-8); memo1.Lines.Add(mssge); end else memo1.Lines.Add(temptext);end;procedure TForm1.Button7Click(Sender: TObject);begin form2.ShowModal;end;procedure TForm1.Button5Click(Sender: TObject);begin memo1.Clear;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin if c

23、lientsocket1.Active then begin clientsocket1.Socket.SendText(usename+*&%#); clientsocket1.Active:=false; end;end;procedure TForm1.Memo1Change(Sender: TObject);beginend;end. 3.3 服务器端设计 服务器端设计界面图为: 图3.2 聊天服务器界面图从聊天服务器端界面图知道设计步骤为: 添加一个服务端socket控件(ServerSocket)到form中使之成为一个TCP/IP服务器。服务器sockets允许指定想提供的服务或

24、想用来监听客户请求时使用的端口。也可以使用服务器socket控件去监听和允许客户连接请求。每个服务器socket控件使用一个单一的服务器windows socket Object(TServerWinSocket)去应答在服务器端监听到的连接。它通常使用一个服务器客户winodws socket Object(TServerClientWinSocket)应答在服务器端每个活动的,连接着得到允许服务的客户socket。使用服务器sockets去: A.指定端口 在服务器socket能够监听客户请求之前,必须指定一个端口给你的监听服务。可以使用Port property来指定这个端口。如果服务器

25、应用提供一个标准的服务,这个服务使用一个习惯使用的相关联的端口。能够使用Service property直接指定端口号。使用Service property是一个好的主意,能够减少设置端口号时的错误。如果既指定了Port property,又指定了Service property,服务socket将使用服务名。B.监听客户请求 一旦在serversocket控件上设置好了端口号,就能够通过在运行时通过调用Open方法来监听一个连接。如果希望应用程序能够在启动的时候自动监听连接,在设计的时候通过使用Object Inspector设置Active 属性为true。C.连接到客户端 当监听服务so

26、cket控件接收到一个客户端连接请求时他们将自动接受这个请求。当没次收到通知时,OnClientConnetc事件将发生。 D.取得关于连接的信息 一但服务器socket打开了监听连接,就能够使用与服务器socket控件相关联的服务器windows socket object来取得关于连接的信息。使用Socket property去访问server windows socket object.windows socket object有一个属性是关于所有活动的客户socket连接这些客户socket是通过服务器socket控件允许连接的。使用Handle属性去存取windows通过socket

27、连接收到的信息。 每个活动的,连接到客户应用是通过服务、客户windows socket bject(TServerClientWinSocket)封装的。你能够通过server windows socket object的连接属性来访问所有的这些。这些server client windows socket object有些属性能够决定哪些地址和端口号给连接的两端-客户和服务器socket使用。当使用windows socket API调用时,可以使用SocketHandle属性去获得socket连接使用的handle。也可以使用Handle属性去访问windows从socket连接处得来的

28、信息。AsyncStyles属性决定windows handle将接收哪种类型的信息。E.关闭连接 当决定关闭监听连接时,调用Close方法。这将关闭所有打开着的,连接到客户应用的连接,取消任何尚未同意的连接,接着关闭监听连接以便服务socket控件不在接受任何新的连接。当客户端关闭他们自己独立的连接到的server socket的连接时,可以在OnClientDisconnect事件中得到讯息。 聊天服务器端程序代码如下:procedure TForm1.ServerSocket1Listen(Sender: TObject; Socket: TCustomWinSocket);begin

29、statusbar1.SimpleText:=监听状态.; counter:=0;end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.SimpleText:=连接到 + socket.RemoteAddress;end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);begin statusbar1.S

30、impleText:= Socket.RemoteAddress + 已连接;end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var tmptext: string; check :string; i,j: integer; chattext:string; signpos : integer; member : string; usename : string;begin tmptext := socket.ReceiveText; if pos(%&%&%&,t

31、mptext)0 then / 当有%&%&%&字符串时表示私聊 begin tmptext := copy(tmptext,1,length(tmptext)-6); signpos:= pos(&,tmptext); chattext:= copy(tmptext,1,signpos-1); member:=copy(tmptext, signpos+2,pos($,tmptext)-2-signpos); usename:=copy(tmptext,pos($,tmptext)+2,length(tmptext)-pos($,tmptext)+2); for i:=0 to counte

32、r-1 do begin if member=chatnamei then begin serversocket1.Socket.Connectionsi.SendText(usename+悄悄对你说:+chattext); break; end; end; endelse if pos($%$%$%,tmptext)0 then / 当有$%$%$%表示有登陆信息 begin tmptext := copy(tmptext,1,length(tmptext)-6); chatnamecounter:=tmptext; listbox1.Items.add(tmptext); check :=

33、(table1.lookup(usename,tmptext,password); socket.SendText(check+#$%&); if counter0 then begin for i:=0 to counter-1 do begin serversocket1.Socket.Connectionscounter.SendText(chatnamei+()&*%); serverSocket1.Socket.Connectionsi.SendText(tmptext+()&*%); sleep(300); end; end; inc(counter); end else if p

34、os(?*#,tmptext)0 then /表示注册信息 begin signpos:=pos(?*#,tmptext); member:=copy(tmptext,1,signpos-1); chattext:=copy(tmptext,signpos+6,length(tmptext)-6-length(member); with table1 do begin if table1.FindField(usename).AsString=member then socket.SendText(用户名已经有人用了,请检查后重新注册。) else begin insertrecord(mem

35、ber,chattext); memo1.Lines.Add(新用户:+member+注册成功!); socket.SendText(注册成功,请先登陆再进行聊天!); end; end; endelse if pos(*&%#),tmptext)0 then / 有人走了 begin tmptext:=copy(tmptext,1,length(tmptext)-8);/ memo1.Lines.Add(用户+tmptext+离开聊天室。); for i:=0 to counter-1 do serversocket1.Socket.Connectionsi.SendText(tmptext

36、+$%#$); for i:=listbox1.items.Count downto 1 do if listbox1.Items.Stringsi-1=tmptext then begin listbox1.Items.Delete(i-1); dec(counter); end; endelse / 当无任何标记时表示公聊 begin for i:=0 to counter-1 do serversocket1.Socket.Connectionsi.SendText(tmptext); end;end;procedure TForm1.N1Click(Sender: TObject);b

37、egin serversocket1.Active:=false; serversocket1.Close;end;procedure TForm1.ServerSocket1Accept(Sender: TObject; Socket: TCustomWinSocket);begin clientip:=socket.RemoteAddressend;procedure TForm1.ServerSocket1ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCod

38、e: Integer);begin if errorcode=10054 then errorcode:=0;end;procedure TForm1.FormCreate(Sender: TObject);begin table1.Active:=true;end;procedure TForm1.Button1Click(Sender: TObject);begin if not serversocket1.Active then begin serversocket1.Active:=true; memo1.Lines.Add(服务器连接!+Datetimetostr(now)+); e

39、nd else showmessage(已经在监听状态);end;procedure TForm1.Button2Click(Sender: TObject);begin serversocket1.Active:=false; serversocket1.Close; statusbar1.SimpleText:=服务器已经关闭; memo1.Lines.Add(服务器关闭!+Datetimetostr(now)+); listbox1.Clear;end;procedure TForm1.Button3Click(Sender: TObject);begin Close;end;proce

40、dure TForm1.FormShow(Sender: TObject);beginbutton1.Click;end;procedure TForm1.Button4Click(Sender: TObject);begin Form3.ShowModal;end;end.3.3 数据库设计Delphi中的DataBase Desktop数据库允许用户创建、查看、排序、修改及查询一系列的Paradox、dBASE及SQL格式的数据表格,选用Edit|Paste Link可以用DDE(动态数据交换Dynamic Data Exchange)与在其它应用程序中的数据建立激活动连接。利用Delphi的客户/服务器功能,可以在本地数据库上或远程数据库服务器上开发客户/服务器模式的应用程序。Delphi 的一个强有力的功能之一是可以将基于本地桌面数据库系统的应用程序很容易地修

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922