欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

    • 资源ID:2400786       资源大小:129.50KB        全文页数:24页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    第一章 系统分析11 系统设计要求:12312 系统原理框图本次课程设计的原理框图如图1.1所示:图1.1系统原理框图13 系统设计原理局域网聊天程序的实现主要为局域网内的计算机提供交流的平台。完成一个基于服务器和客户端的局域网通讯软件,类似于聊天室,可进行注册、登录、系统信息记录、聊天等功能。用户容易使用,便于管理。第二章 系统设计理论基础2.1 TCP/IP协议TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中设计。因此用户一般不涉及。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。编程时,编程界面有两种形式:一、是由内核心直接提供的系统调用;二、使用以库函数方式提供的各种函数。前者为核内设计,后者为核外设计。用户服务要通过核外的应用程序才能设计,所以要使用套接字(socket)来设计。2.2 客户机/服务器模式C/S结构(Client/Server结构)是大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。首先服务器方要启动,并根据请求提供相应服务: (1)打开一通信通道并告知本地主机,它在某一公认地址端口上(如http为80)接受客户请求。 (2)等待客户请求到达该端口。 (3)接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。 (4)返回第二步,等待另外的客户请求 (5)关闭服务器。 客户方: (1)打开一通信通道,并连接到服务器所在主机的特定端口。 (2)向服务器发出服务请求报文,等待并接收应答;继续提出请求。 (3)请求结束后关闭通信通道并终止。 从上面的描述过程可知: (1)客户与服务器进程的作用是非对称的。因此编码不同。 (2)服务进程一般是先于客户请求启动的。只要系统运行,该进程一直存在,直到 正常终止或者强迫终止。在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。2.3 Socketsocket之间的连接可以分为三种类型:客户端连接,监听连接以及服务器端连接。 客户端连接是指由客户端的socket提出连接请求,要连接的目标是服务器端的socket。为此,客户端的socket必须首先描述它要连接的服务器端socket(主要是指服务器 端socket的地址和端口号),然后再定位所要连接的服务器端socket,找到以后,就向服务器端 socket请求连接。当然,服务器端的socket此时未必正好处于准备好状态,不过,服务器端的 socket会自动维护客户请求连接的队列,然后在它认为合适的时候向客户端socket发出"允许连接" (accept)的信号,这时客户端socket与服务器端socket的连接就建立了。监听连接,服务器端 socket并不定位具体的客户端socket,而是处于等待连接的状态。当服务器端socket监听到或者说 接收到客户端socket的连接请求,它就响应客户端socket的请求建立一个新的socket句柄并与客户 端连接,而服务器端socket继续处于监听状态,还可以接收其它客户端socket的连接请求。服务器端连接,是指当服务器端socket接收到客户端socket的连接请求后,就把服务器端socket的描述发给客户端,一旦客户端确认了此描述,连接就建立了。在本文中的聊天程序用的就是监听连接,即服务器设置连接个数后进行监听,客户端进行对服务器端的连接,这样就可以进行相互通信了。第三章 系统设计3.1 系统设计目标局域网聊天程序的设计目标为一个高性能的,易于使用的,面向局域网的即时信息软件。最终的程序应具有如下功能:(1)客户端使用简便,服务器端运行稳定。客户端与服务器端可运行在多种系统平台,具有良好的兼容性能。(2)客户端与服务器端功能独立,可独立运行在不同的计算机上或运行在同一台计算机上,具有最大的灵活性。(3)能够进行注册,设置自己的用户名和密码,自动更新其他用户的名单。(4)选择特定用户并与其交谈,还可以向在所有在线的用户发送消息。3.2客户端设计 客户端设计界面图为: 图3.1 聊天客户端界面图 从聊天客户端界面图知道设计步骤为: 添加一个客户端socket控件(ClientSocket)到form中使之成为一个TCP/IP客户。客户sockets允许你指定你想连接的服务器socket和你希望服务器提供的服务。一但你描述你想得到的连接,你可以使用客户socket控件去完成连接服务。       每个客户socket控件使用独立的客户windows socket对象(TClientWinSocket)去应答连接中的客户终端。使用客户sockets去: A.指定想得到的服务       客户socket控件有一个数字properties,允许你指定想连接的服务器系统和端口。可以通过主机名来指定服务器系统,使用Host property。       如果不知道主机名,或者关心找到服务器的速度,你可以指定服务器系统的IP地址,通过使用Address  property。你必须指定IP地址和主机名中的一个。       如果两个都指定,客户socket控件将使用主机名。除服务器系统外,必须指定客户socket将连接的在服务器系统上的端口。能够直接使用Port property来指定服务端口号。或者直接在Service  property使用想得到的服务的名字。如果指定端口号和服务名,客户socket控件将使用服务名。          B.建立连接       一旦在客户socket控件中完成了设置所连接的服务器的属性,就可以进行连接,通过调用Open方法。如果想要启动时自动建立连接,在设计时设置Active   property为true,通过使用Object Inspector来设置。C.取得关于连接的信息       完成连接到服务器socket后,可以使用客户socket控件和相关的客户windows socket object去取得关于连接的信息。使用Socket property去访问client windows socket object。windows  socket  object 有一个properties,它能让你确定在连接的两端客户和服务器使用的地址和端口号。       当使用一个windows socket API调用时,可以使用SocketHandle   property区获得socket连接使用的handle。可以使用Handle property去访问windows,以便接收来自socket连接的信息。AsyncStyles property决定哪种信息类型是windows  handle要接收的。D.关闭连接       当完成通讯想关闭socket 连接时,能够通过调用Close方法来关闭连接。连接可能要由服务器端来关闭。如果是这种情况,将收到一个OnDisconnect 事件的通知。        聊天客户端程序代码如下:procedure TForm1.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 statusbar1.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: TObject);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.Edit4KeyPress(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 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.SendText(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.Text+'$%$%$%'); 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(temptext,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.Socket.SendText(usename+'*&%#)'); end end else if pos('()&*%',temptext)<>0 then / 他人登陆信息 begin temptext:=copy(temptext,1,length(temptext)-9); if temptext<>edit1.Text then begin memo1.Lines.Add(temptext+' 进入聊天室.'); listbox1.Items.add(temptext); end; end else if pos('$%#$',temptext)<>0 then /off line begin temptext:=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(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 clientsocket1.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允许指定想提供的服务或想用来监听客户请求时使用的端口。也可以使用服务器socket控件去监听和允许客户连接请求。每个服务器socket控件使用一个单一的服务器windows socket Object(TServerWinSocket)去应答在服务器端监听到的连接。它通常使用一个服务器客户winodws socket Object(TServerClientWinSocket)应答在服务器端每个活动的,连接着得到允许服务的客户socket。使用服务器sockets去: A.指定端口       在服务器socket能够监听客户请求之前,必须指定一个端口给你的监听服务。可以使用Port property来指定这个端口。如果服务器应用提供一个标准的服务,这个服务使用一个习惯使用的相关联的端口。能够使用Service property直接指定端口号。使用Service  property是一个好的主意,能够减少设置端口号时的错误。如果既指定了Port property,又指定了Service property,服务socket将使用服务名。B.监听客户请求 一旦在serversocket控件上设置好了端口号,就能够通过在运行时通过调用Open方法来监听一个连接。如果希望应用程序能够在启动的时候自动监听连接,在设计的时候通过使用Object Inspector设置Active 属性为true。C.连接到客户端       当监听服务socket控件接收到一个客户端连接请求时他们将自动接受这个请求。当没次收到通知时,OnClientConnetc事件将发生。     D.取得关于连接的信息       一但服务器socket打开了监听连接,就能够使用与服务器socket控件相关联的服务器windows socket object来取得关于连接的信息。使用Socket property去访问server windows socket object.windows socket object有一个属性是关于所有活动的客户socket连接这些客户socket是通过服务器socket控件允许连接的。使用Handle属性去存取windows通过socket连接收到的信息。       每个活动的,连接到客户应用是通过服务、客户windows socket bject(TServerClientWinSocket)封装的。你能够通过server windows socket object的连接属性来访问所有的这些。这些server client windows socket object有些属性能够决定哪些地址和端口号给连接的两端-客户和服务器socket使用。当使用windows socket API调用时,可以使用SocketHandle属性去获得socket连接使用的handle。也可以使用Handle属性去访问windows从socket连接处得来的信息。AsyncStyles属性决定windows handle将接收哪种类型的信息。E.关闭连接       当决定关闭监听连接时,调用Close方法。这将关闭所有打开着的,连接到客户应用的连接,取消任何尚未同意的连接,接着关闭监听连接以便服务socket控件不在接受任何新的连接。当客户端关闭他们自己独立的连接到的server socket的连接时,可以在OnClientDisconnect事件中得到讯息。 聊天服务器端程序代码如下:procedure TForm1.ServerSocket1Listen(Sender: TObject; Socket: TCustomWinSocket);begin 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.SimpleText:= 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('%&%&%&',tmptext)<>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 counter-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 :=(table1.lookup('usename',tmptext,'password'); socket.SendText(check+'#$%&'); if counter>0 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 pos('?*#',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(member,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+'$%#$'); 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);begin 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 ErrorCode: 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)+''); end 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;procedure 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 的一个强有力的功能之一是可以将基于本地桌面数据库系统的应用程序很容易地修改成客户/服务器模式的应用。一个Delphi 数据库应用程序访问的是本地数据库还是远程SQL数据

    注意事项

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

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开