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

上传人:1777****777 文档编号:38828772 上传时间:2021-11-09 格式:DOC 页数:24 大小:185.51KB
返回 下载 相关 举报
基于TCP局域网聊天程序设计_第1页
第1页 / 共24页
基于TCP局域网聊天程序设计_第2页
第2页 / 共24页
基于TCP局域网聊天程序设计_第3页
第3页 / 共24页
点击查看更多>>
资源描述
基于TCP局域网聊天程序第一章 系统分析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 temptextedit1.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 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 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数据库服务器上的数据库,这对于最终用户是完全透明的。在本次课设中要记录那些注册了的人的信息,就要使用Delphi中的DataBase Desktop数据库来保存,要正确运行本次聊天程序,就需要建立chat的数据库别名指向table目录,可以使用Database Desktop 建立别名。服务器先运行,自动到监听模式,然后可以运行N个客户端,这样就能进行聊天了。第四章 系统测试调试4.1测试调试过程测试调试:1.打开Delphi7,在form里面添聊天程序所需要的控件,对部分控件编程,完成聊天程序总体设计之后,按下F9运行看看是否出错。2.如果第一步骤出错,看看错误的外部表现,定位错位位置。3.由第二步骤在来分析有关程序代码,找出错误的内在原因。 4.修改程序代码,排除这个错误。5.重复进行暴露了这个错误的原始测试以及某些回归测试,以确保该错误确实被排除且没有引入新的错误。6.如果所作的修正无效,则撤消这次改动,重复上述过程,直到找到一个有效的办法为止。7.测试调试完所有错误之后,点下Run看看设计的界面是否和要求一致,如果不一致就说程序编译达不到要求,这就要重新修改程序直到达到要求为止。4.2 调试中出现的问题1.在客户端设计时,不知道怎么保留注册了的人的信息,经过查找资料,发现可以使用Delphi中自带的DataBase Desktop数据库记录注册信息,这样问题就解决了。2.在服务器端设计时,不知道怎么显示在线用户以及他们的个人信息,通过socket打开监听,使它处在监听状态,这样就能显示在线用户。3.数据库的设计部分的设计出现了很多的问题,如怎样记录信息,怎么样使聊天程序正常运行,以及怎么使服务器端的监听自动,经查阅有关数据库方面的书和请教了老师最后这些问题一一解决了。4.局域网聊天时,发送信息过去在对方那里需10几秒之后才能显示出来,这个问题困扰了好几天,后面就简化界面,能不用的控件就不用,尽量简单,果然把这个问题解决了,现在局域网聊天时候,一发送完信息,在对方那立刻显示。第五章 结论通过本次专业课程设计,本人对软件开发过程有了更清晰的了解,首先是问题定义、需求分析,然后是功能设计、详细设计等,并对软件测试的方法、手段有了较深的理解。在设计过程还认真学习了与系统相关的知识,极大地拓宽了本人的知识面,本人感到收获不小。 在课程设计的初期,从开始熟悉这些知识到对整体设计有了解,再从概要设计、详细设计到开始编码,以及最后的测试,整个过程感觉很充实,虽然遇到了不少困难,但当本人通过自己查资料、或是向指导老师请教以及向同学请教,而设计出解决方案并成功实现时,那种成就感和满足感足以鼓励自己加班加点的辛苦。 因为以前没有设计软件的经验,在这次设计的过程中,本人遇到专在面向对象程序开发知识方面的困难不是非常多,主要困难集中在数据库、socket等方面的不足上,还有就是操作界面方面的问题。 经过这2个星期的专业课程设计,确实学到了不少的东西,同时也深感自己知识的欠缺。使本人在以后的学习工作中,一定要继续坚持不断地学习新兴的专业知识及相关的非专业知识,只有这样才能紧跟时代的潮流。参考文献1 Marco Cantu.Delphi7从入门到精通M.北京:电子工业出版社,20032 刘艺.Delphi面向对象编程M.北京:清华大学出版社,2004 3 黄超. Delphi网络应用开发技术与实例M.北京:清华大学出版社,20054 甘志.DELPHI7高级应用开发篇M.北京:清华大学出版社,20065 王沛.Delphi7编程入门M.北京:机械工业出版社,2006附录A:socket事件的应答当使用sockets写应用程序时,大多数工作发生在socket控件的handler事件中.当通过socket连接开始读或写时,OnRead和OnWrite事件在non-blocking client sockets中发生从而通知sockets.同样的,服务器sockets(blocking or non-blocking)收到OnClientRead和OnClientWrite事件. 当服务器结束一个连接时,客户scokets收到一个OnDisconnect事件.当客户端结束一个连接时,服务器socket收到一个OnClientDisconnect事件. 另外,客户端Sockets和服务器端socket从连接中收到一个错误信息时,都将产生有个错误事件. 错误事件:客户sockets和服务器sockets通常会产生一个OnError事件,当他们从连接中收到一个错误信息的时候.你能够写一个OnError事件处理去响应这些错误信息.这个OnError事件处理提供传送关于socket试图做什么的时候这个错误发生的信息,以及错误信息提供的错误代码.可以在OnError事件处理中对这个错误作出响应,并且把错误代码改为0,以避免socket产生一个例外. 当开始和完成发生时,socket控件通常会收到一个事件号(number of events).如果应用程序需要改变socket开始操作的处理过程或通过连接开始读或写操作时,将写事件handlers去应答这些client events和server events. client events 当一个客户socket打开一个连接时,以下事件发生: 1.一个OnLookup事件最先发生,它试图去定位server socket.在这里不能改变Host,Address,Port,Service属性去改变想定位的服务器,但能够使用Socket属性去访问client windows socket object,并且使用它的SocketHandle属性去调用windows API,以便改变socket的客户属性.例如,如果想在客户应用软件中设置端口号,必须在server client连接前做这件事. 2.windows socket设置和初始化事件通知. 3.当找到server socket时一个OnConnecting事件发生.在这事件中,windows Socket object可以利用的是通过socket属性提供关于连接的另一端的服务socket的一些信息.这是获得实际使用来连接的端口和IP地址的第一个机会,它可能不同于从监听socket处同意连接时得到的端口或IP地址. 4.服务器同意连接请求,客户端socket完成连接. 5.当一个连接得到确定后,一个OnConnect事件发生.如果socket立即开始通过连接读或写,就应写一个OnConnect事件Handler去作这件事. 服务器端事件(server events) 服务器socket控件通过两中方式连接:监听连接和连接到客户应用.服务器socket收到这两个连接的所有事件. 监听时事件 当构成监听连接前,OnListen事件发生.在这个时候能够通过socket属性获得server windows socket object.能够使用它的SocketHandle属性去改变socket,在socket打开监听之前.例如,如果想限定监听服务使用的IP地址,可以在这个OnListen事件Handler中做. 与客户端连接的事件 当一个服务器socket同意一个客户连接请求时,接下来的事件发生: 1.服务器socket产生一个OnGetSocket事件,通过windows socket handle传送给连接的另一端的socket.如果想提供自己定义的TServerClientWinSocket of descendant,你可以在OnGetSocket 事件 handler中建立,将被用来替代TServerClientWinSocket. 2.一个OnAccept事件发生,传送新的TServerClientWinSocket对象给事件句柄.这是第一个要点,当使用TServerClientWinSocket的属性去获得被连接中服务的那端的客户的信息时. 3.如果服务类型是stThreadBlocking,一个OnGetThread事件发生.如果想提供自己定义的TServerClientThread子类可以在OnGetThread事件句柄中建立一个,它将替代TServerClientThread. 4.如果服务类型是stThreadBlocking,一个ONThreadStart事件发生当这个线程(thread)开始执行时.如果想执行任何初始化这个线程,或调用一些windows socket API在这线程开始通过连接读和写之前,应该使用OnThreadStart事件句柄. 5.当客户端完成一个连接时,一个OnClientConnect事件发生.如果是non-blocking服务,可能想开始通过socket连接在这端进行读或写操作. 附录B:通过socket连接进行读和写通过socket连接到其他机器的原因是想通过这些连接来读和写信息.什么信息是要读和写的,或者想读和写时是依靠哪些socket连接的相关服务的. 通过sockets进行读和写可以是异步的,所以在网络应用中不需要阻塞其他代码的执行.这是调用non-blocking connection也同样可以通过blocking connection,这时下一行代码的执行必须等到读或写操作完成. 读和写操作事件 Non-blocking sockets想通过连接读或写时,它会产生一个读和写操作事件通知socket.在客户端sockets,可以在OnRead或OnWrite事件句柄中对这些事件做出反应.在服务器端Scokets,可以在OnClientRead或OnClientWrite事件句柄中对这些事件做出反应.与socket连接相关联的windows socket object在事件句柄的读或写中被当作一个参数.Windows socket object提供一个方法号(number of methods)以允许通过连接读或写. 通过socket连接读,使用ReceiveBuf或ReceiveText方法.在使用ReceiveBuf方法前,使用Receivelength方法去确定在连接的另一端socket准备发送的字节数(number of bytes). 通过socket连接写,使用SendBuf,SendStream,或SendText方法.如果通过socket发送信息后不在需要socket连接,可以使用SendStreamThenDrop方法. Sen
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 任务书类


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!