Socket网络编程Delphi语言掌握网络编程的基本原理掌握网络控制的使用方法具备通过使用网络控制开发简单网络应用程序的能力Delphi的Socket编程概述Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,它定义两台计算机间进行通信的规范(即一种编程规范),如果说两台计算机是利用一个“通道”进行通信,那么这个“通道”的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。在Delphi中,其底层的Socket也应该是Windows的Socket。Socket减轻了编写计算机间通信软件的难度。Inprise在Delphi中对WindowsSocket进行了有效的封装,使用户可以很方便地编写网络通信程序。TCP/IP协议及特点1.TCP/IP体系结构TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务,而IP则是提供网络层服务。TCP/IP协议簇(如图1所示)包括协议如下。(1)IP:网间协议(InternetProtocol)。此协议负责主机间数据的路由和网络上数据的存储。同时为ICMP,TCP,UDP提供分组发送服务,用户进程通常不需要涉及这一层。(2)ARP:地址解析协议(AddressResolutionProtocol)。此协议将网络地址映射到硬件地址。(3)RARP:反向地址解析协议(ReverseAddressResolutionProtocol)。此协议将硬件地址映射到网络地址(4)ICMP:网间报文控制协议(InternetControlMessageProtocol)。此协议处理信关和主机的差错和传送控制。(5)TCP:传送控制协议(TransmissionControlProtocol)。这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务,并为数据可靠传输建立检查(注:大多数网络用户程序使用TCP)。(6)UDP:用户数据报协议(UserDatagramProtocol)。这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。用户端程序客户端程序WindowsSockets网络通信协议服务界面(如:TCP/IP)Windows物理层通信介质(7)FTP:文件传输协议(FileTransferProtocol)。此协议允许用户以文件操作的方式(文件的增、删、改、查、传送等)与另一主机相互通信。(8)SMTP:简单邮件传送协议(SimpleMailTransferProtocol)。SMTP协议的作用是为系统之间传送电子邮件。(9)Telnet:终端协议(TelnetTerminalProcotol)。允许用户以虚终端方式访问远程主机(10)HTTP:超文本传输协议(HypertextTransferProcotol)(11)TFTP:简单文件传输协议(TrivialFileTransferProtocol)如图12.TCP/IP特点TCP/IP协议的核心部分是传输层协议(TCP、UDP),网络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时的编程界面有两种形式:其一是由内核心直接提供的系统调用;其二是使用以库函数方式提供的各种函数。前者为核内实现,后者为核外实现。用户服务要通过核外的应用程序才能实现,所以网络编程要使用套接字(Socket)来实现,如图2所示是TCP/IP协议核心与应用程序关系图。如图2Socket套接字1.SocketFTPSMTPTelnetHTTPTFTPFTPFTPICMPIPARPRARP硬件接口应用程序1应用程序2应用程序3网络应用程序界面(Socket)TCP/IP核心协议物理介质Socket是网络的基本构件,它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连接的进程。2.基本套接字方法在Socket编程规范中定义了许多套接字方法,为了更好地理解套接字编程原理,下面介绍几个基本的套接字方法。1)创建套接字——socket()功能:使用前创建一个新的套接字格式:SOCKETPASCALFARsocket(intaf,inttype,intprocotol);参数:af:通信发生的区域type:要建立的套接字类型procotol:使用的特定协议2)指定本地地址——bind()功能:将套接字地址与所创建的套接字号联系起来。格式:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数:s:是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。其他:如果没有错误,bind()返回0,否则返回SOCKET_ERROR3)建立套接字连接——connect()和accept()功能:共同完成连接工作格式:intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);参数:同上4)监听连接——listen()功能:用于面向连接服务器,表明它愿意接收连接。格式:intPASCALFARlisten(SOCKETs,intbacklog);5)数据传输——send()与recv()功能:数据的发送与接收格式:intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);intPASCALFARrecv(SOCKETs,constcharFAR*buf,intlen,intflags);参数:buf:指向存有传输数据的缓冲区的指针。6)多路复用——select()功能:用来检测一个或多个套接字状态。格式:intPASCALFARselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);参数:readfds:指向要做读检测的指针writefds:指向要做写检测的指针exceptfds:指向要检测是否出错的指针timeout:最大等待时间7)关闭套接字——closesocket()功能:关闭套接字格式:BOOLPASCALFARclosesocket(SOCKETs);Socket工作过程在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel),客户机/服务器模式在操作过程中采取的是主动请示方式:服务器方的工作过程如下。(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。(2)等待客户请求到达该端口。(3)接收到客户端服务请求,处理该请求并发送应答信号,等待客户端连接。(4)返回第二步,等待另一客户请求。(5)接受客户端连接,建立新的套接字,并在该套接字上传输数据。(6)关闭套接字。(7)关闭服务器。客户方工作过程如下。(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求。(3)请求结束后关闭通信通道并终止。上述客户机/服务器模式工作过程用套接字方法描述如下。服务器(Server)方首先用Socket()方法新建一个Socket连接,然后用Bind()方法使该连接同服务器地址绑定,Listen()方法使该连接处于监听状态,一旦监听到客户请求便调用Accept()方法处理连接请求并等待客户建立连接,连接建立成功后通过send()与recv()在该连接上交换数据,最后通过closesocket()方法关闭套接字。客户机(Client)方首先用Socket()方法新建一个Socket连接,然后通过Connect()方法连接到特定的服务器,并与该服务器建立连接,通过send()与recv()在该连接上交换数据,最后通过closesocket()方法关闭套接字。(1)面向连接的套接字的系统调用时序。(2)无连接协议的套接字调用时序。服务器端Socket()方法建立套接字Bind()方法绑定本机IPListen()监听客户端Accept()方法接受连接Accept()方法建立连接Recv()/Send()交换数据Closesocket()关闭该连接Closesocket()关闭服客户湍Closesocket()关闭该连接Recv()/Send()交换数据Connect()方法建立连接Socket()方法请求连接使用Delphi网络控件TClientSocket控件和TServerSocket控件TServerSocket和TClientSocket涵盖了基本的WinSocket编程,其中TServerSocket作为服务器方使用,TClientSocket作为客户端使用,这两个控件本身并不提供Socket连接,但是它们都有一个Socket属性,这个属性才提供了Socket连接。由于这两个控件在Delphi7中只以类的形式出现,所以在应用之前需要让用户自己创建该类的实例并初始化,方法如下。ClientSocket:TClientSocket;//声明客户端套接字控件ServerSocket:TServerSocket;//声明服务器端套接字控件ClientSocket:=TClientSocket.Create(Self);//创建客户端套接字控件实例//客户端套接字控件实例属性设置ClientSocket.Active:=False;ClientSocket.Address:='127.0.0.1';ClientSocket.ClientType:=ctNonBlocking;//非堵塞式工作方式ClientSocket.Port:=1024;…//客户端套接字控件实例指定事件ClientSocket.OnDisconnect:=ClientSocketDisconnect;ClientSocket.OnRead:=ClientSocketRead;ClientSocket.OnError:=ClientSocketError;…ServerSocket:=TServerSocket.Create(Self);//创建服务器端套接字控件实例//创建服务器端套接字控件实例属性设置ServerSocket.Active:=False;ServerSocket.Port:=1024;ServerSocket.ServerType:=stNonBlocking;//非堵塞式工作方式…//创建服务器端套接字控件实例指定事件处理服务器端Secket()方法建立套接字Bind()方法绑定本机IPRecv()/Send()交换数据Closesocket()关闭该连接客户端Socket()方法请求连接Bind()方法绑定服务端IPRecv()/Send()交换数据Closesocket()关闭该连接ServerSocket.OnClientConnect:=ServerSocketClientConnect;ServerSocket.OnClientDisconnect:=ServerSocketClientDisconnect;ServerSocket.OnClientRead:=ServerSocketClientRead;ServerSocket.OnClientError:=ServerSocketClientError;…下面就介绍一下这两个控件常用的方法、属性及其含义。1.TServerSocket和TClientSocket组件的常用方法与属性1)TServerSocket组件的常用属性及说明见表1。表1:名称