客户端与服务器端的Socket通信
- 格式:doc
- 大小:19.50 KB
- 文档页数:5
客户端与服务器端的Socket通信作者:夏玲王伟平来源:《电脑知识与技术》2009年第04期摘要:介绍有关网络客户服务模型的socket通信应用,采用delphi中对Windows API进行了完美封装的套接字组件,设计了一个实现面向连接的通信方式的实际例子,说明两者是如何进行通信。
关键词:socket;delphi;通信;客户端;服务器端中图分类号:TP393文献标识码:A1文章编号:1009-3044(2009)04-812-02The Socket Communication about Client and ServerXIA Ling, WANG Wei-ping(School of Information Science and Engineering, Central South University, Changsha 410083,China)Abstract: Customer service on the network model of the socket communications applications, using the Windows API delphi in the perfect package for the socket components, a design-oriented means of communication linking the actual example, to explain how they are communicating.Key words: socket; delphi; communication; client; server1 引言大部分网络协议的实现都由客户端(Client)和服务器端(Server)来协作完成。
这种模型本质上涉及两个不同的程序,通常这两个程序在不同机器上运行。
这些机器之间都有网络连接。
服务器端程序提供服务并对来自客户程序的请求作成响应。
而客户端程序则是在使用者和服务器端程序之间建立某种沟通的渠道,或者是作为使用服务器端提供的某种网络服务的工具。
一个典型的服务器与客户机之间的交互可能如下所示:1) 客户机提出一个请求;2) 服务器收到客户机的请求,进行分析处理;3) 服务器将运行处理的结果返回给客户机。
通常一个服务器需要向多个客户机提供服务。
因此对服务器来说,还需要考虑如何有效地处理多个客户的请求。
2 服务器与客户端的Socket通信类型Socket的连接类型可以分为两种,分别是面向连接的字节流类型(Sock_stream)和面向无连接数据报类型(Sock_dgram)。
面向无连接数据报类型的Socket工作流程比较简单,双方不需要进行太多的沟通与交互。
客户机直接将用户的请求打包发送到服务器端,省略了建立一个固定信息通道的过程。
服务器端也是直接将处理的结果发送给客户端。
每个发送的数据报都携带有传递所需要的所有地址信息。
其工作流程如图1所示。
面向连接的字节流类型的Socket工作中有比较严格的操作次序,工作的原理也比较复杂。
在这种类型的Socket的工作过程中,必须首先启动服务器端,通过调用socket()函数建立一个Socket对象,然后调用Bind()函数将该Socket对象和本地网络地址绑定到一起。
再调用Listen()函数使该Socket对象处于侦听状态,并规定它的最大请求的数量。
其工作流程如图2所示。
总的来说,无连接和面向连接的通信方式各有长处和短处。
在仅仅涉及少量的信息传递的场合可以使用无连接操作;如果涉及大量信息传递的场合可以采用面向连接操作。
3 Delphi的Socket组件3.1 Delphi中Socket的操作方式根据连接发起的方式以及本地Socket要连接的目标,Socket之间的连接可以分为:客户端连接、监听连接以及服务器端连接。
Delphi分别使用ClientSocket组件■和ServerSocket组件■来操纵客户端Socket和服务器端Socket的连接和通信。
ClientSocket组件为客户端组件。
它是通信的请求方,也就是说,它是主动地与服务器端建立连接。
ServerSocket组件为服务器端组件。
它是通信的响应方,也就是说,它的动作是监听以及被动接受客户端的连接请求,并对请求进行回复。
ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的通信。
3.2 ServerSocket的属性设置· Port是通信的端口,必须设置。
在本文实例中设置为95;· ServerType服务器端读写信息类型,设置为stThreadBlocking表示异步读写信息,本文实例中采用这种方式。
· ThreadCacheSize,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接。
本文实例采用默认值10。
3.3 ClientSocket的属性· Port,是通信的端口,必须与服务器端的设置相同。
否则可能导致两个组件发送的目标端口和接收的端口不一致,无法建立有效的信息传送连接。
· ClientType,客户端读写信息类型,应该与服务器端的设置相同,为ctNonBlocking表示异步读写信息.· Host,客户端要连接的服务器的ip地址。
必须设置,当然也可以在代码中动态设置。
4 应用实例4.1 设计思路实例包括一个服务器端程序与一个客户端程序。
客户端程序可以放到多个计算机上运行,同时与服务器端进行连接通信。
服务器程序实现以下基本功能:1) 在用户登录的时候记录用户登录所在主机的IP、主机名称等;2) 显示当前在线用户数量;3) 可对当前在线用户执行注销、重启、关机等操作。
客户端程序实现一些基本功能:1) 显示当前程序的工作状况;2) 实现服务器端发送的注销、重启、关机的操作。
4.2 程序说明根据功能的实际需要,服务端程序一运行,窗体的StringGrid控件就显示已在线用户的基本信息。
代码如下:procedure TfrmServer.displayconnectionsinfo ;//在stringgrid中显示在线用户数据Var i: integer;beginlistbox1.Items.Clear;with ServerSocket1 dobeginif (length(arrayconnectionstatus)>=1) thenstringgrid1.RowCount:=length(arrayconnectionstatus)+1elsestringgrid1.RowCount:=2;with stringgrid1 dobeginfor i:= 0 to high(arrayconnectionstatus) dobeginwith arrayconnectionstatus[i] dobegincells[0,i+1]:=inttostr(tcsactiveconnections);cells[1,i+1]:=''+tcsremotehost;cells[2,i+1]:=''+tcsremoteaddress;cells[3,i+1]:=''+inttostr(tcsremoteport);cells[4,i+1]:=''+tcslocalhost;cells[5,i+1]:=''+tcslocaladdress;cells[6,i+1]:=''+inttostr(tcslocalport);listbox1.items.Add(tcsremotehost);end;end;end;end;end;在窗体上,“执行”按钮的Click事件负责向指定的在线用户或全体在线用户发送注销、重启、关机操作指令。
客户端程序通过通信端口接收指令,并做出响应,弹出关机提示对话框,如需要继续使用计算机的在线用户,可点击“取消”按钮。
5 结束语综上所述,Socket组件相比其它高级协议组件如FastNet组件,它的封装层次较低,程序员可以在它们的基础上自己定义新的高级协议或者是规定自己的信息交互流程。
利用以上代码,进一步拓展的余地也很大,还可以加入一些更细化的功能,如局域网在线聊天、点对点传输文件等。
参考文献:[1] 赵秀英.Delphi 网络高级编程[M].北京:人民邮电出版社?,2001.83-85.[2] 申普兵,行明顺,王兆祥,等.计算机网络与通信[M].北京:人民邮电出版社,2006.9-11.[3] 王丰锦,邵新宇.基于SOCKET和多线程的应用程序间通信技术的研究[J].计算机应用,2000,20(6):65-67.[4] 谢希仁.计算机网络[M].第4版.北京:电子工业出版社,2003.100-113.[5] 计世网.统一通信的五大技术热点[EB/OL]. /166/a275630.html.[6] 谢安明,邵美珍.使用Socket设计网络通讯程序[EB/OL]./Article/CJFD2001-XXGC200101019.htm.[7] 曹伟.基于网络的远程控制系统[D].长春:吉林大学,2005.。