Socket在数字图书馆中的应用
2009-12-17刘钟涛申康
刘钟涛 申 康
关键词:Socket;数字图书馆;代理服务器
摘 要:数字图书馆的实现以网络编程为基础,Socket是TCP/IP协议的接口,服务器和客户端利用Socket建立了多个数据传输通道,提出了TCP/IP协议下Socket并发通信的过程和方法,从而实现数据的并发传输。中图分类号:G250.76文献标识码:A 文章编号:1003-1588(2009)04-0079-03
1 Socket的概念
TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。 TCP/IP是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族,TCP/IP为网络的应用服务互联和共享提供了有效的手段,Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。应用程序通常通过“套接字”向网络发出请求或者应答网络请求,Internet网络的编程必须使用Socket接口。是通信的基石,是支持TCP/IP网络通讯协议的基本操作单元,所谓Socket通常也称作“套接字”,可以将套接字看作不同主机间进程进行双向通信的端点,它构成了整个网络的编程界面(如图1)。
从用户的角度来看套接字是通信端点的抽象概念,它为用户提供了发送和接受数据的机制,Socket用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。其中应用程序告诉Socket执行什么任务,Socket将这些命令翻译成TCP/IP协议的通信语言,再通过和TCP/IP进行交流,最后由TCP/IP协议将其传送到网络进行网络通信。
2 数字图书馆通信原理
作为网络上公认的通信标准,TCP/IP协议成为网络编程实现网络通信的重要组成部分。首先在服务器与客户端之间定义TCP通信协议,并创建Socket套接字,利用该套接字建议一套可靠的、基于面向连接的通信接口,客户端和服务器在该连接上传输数据,客户端发送请求,服务器监听来自客户的请求,并作出响应服务。
Socket接口是TCP/IP网络的API,Socket接口定义了许多的函数和例程。目前,网络上绝大多数的通信采用的都是服务器/客户端(Server/Client)机制,一般情况下,在服务器端,当有一个客户端连接请求到来时,服务器与客户端建立连接,然后服务器端一个进程专门处理与客户端的通信,子进程为客户提供服务,主进程继续监听其他的客户进程。服务器掌握每个客户的Socket,并能够分辨来自不同客户机的数据,它根据Socket分别对不同的客户机做出不同的响应。从而对多个客户端并发进行通信。服务器/客户端利用Socket数据传输流程(如图2)。
3 数字图书馆通信原理
3.1 数字图书馆实现函数
3.1.1 Socket()函数
Int socket(int domain, int type, int protocol)。Socket()用来建立一个Socket数据结构分配存储空间,通知系统建立一通信端口。参数domain指定使用何种的地址类型,目前仅支持PF_INET(TCP/IP协议族)格式。
3.1.2 Bind()函数
Int bind(int sockfd, struct sockaddr my_addr, int addrlen)。Bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向包含有本机IP地址和端口号等信息的指针,当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数将Socket与本机IP地址和一个特定端口相关联,随后可以在该端口监听服务请求。
3.1.3 Listen()函数
Int listen(int s, int backlog)。Listen()用来等待参数s的socket连线。参数backlog指定服务器端同时能处理的最大客户端连接要求,如果连接数目达此上限则,client端将收到ECONNREFUSED的错误。Listen()并未开始接收连线,只是设置socket为listen模式,真正接收客户端连线的是accept()。
3.1.4 Recv()/ Send()函数
Int recv( SOCKET s,char FAR buf,int len,int flags)。Int send( SOCKET s,const char FAR buf,int len,int flags )。不论是客户还是服务器应用程序,都用recv/Send函数从TCP连接的另一端接收/发送数据。第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放Recv/Send函数接收/发送到的数据;第三个参数指明buf缓冲区的长度。
3.1.5 Connect()函数
Int connect(int sockfd, struct sockaddr serv_addr,int addrlen)。Sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;Connect函数启动和远程主机的直接连接,Socket执行体选择一个未被占用的端口,并通知你的程序数据什么时候到达打断口。
3.1.6 Closesocket()函数
Closesocket(SOCKET sockid)。在完成数据传输任务后,需要调用Closesocket()来关闭连接和释放Socket结束本次通话。
3.2 SOCKET实现数字图书馆服务器端通信步骤
(1)声明一个套接字类型的变量,需要在该变量定义中服务器IP地址和通信端口并指明协议类型。
(2)服务器端通过端口监听进入等待客户端连接的状态。
(3)如果收到连接,则从对方连接请求中获取对方的IP地址和通信端口,并向对方发送连接成功的应答信号,服务完成后,终止该进程与客户的通信链路。
(4)端口继续监听服务请求,等待另一用户。
3.3 在客户端利用基于TCP/IP和SOCKET通信步骤
(1)声明一个套接字类型的变量,需要在该变量定义中提供客户端IP地址和通信端口并指明协议类型。
(2)向远程服务器发出连接请求,SOCKET数据结构提供了一个网络连接的五中信息,分别是通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。
(3)如果连接成功,会收到对方的应答信号,以后的通信就可以通过通信通道进行请求,结束后关闭通道并终止连接。
参考文献:
[1] 顾韵华,周淑琴等.DELPHI实用教程[M].北京:电子工业出版社,2003.
[2] Andrew S.Tanenbaum,熊桂喜译.计算机网络[M].北京:清华大学出版社,1998.
[3] 周天明,汪文勇.TCP/IP网络原理与技术[M].北京:清华大学出版社,1998.
[4] 何进.基于Socket的TCP/IP网络通讯模式研究[J].计算机应用研究,2001,(8).
[5] 雷斌、杨建华.Visual C++6.0网络编程技术[M].北京:人民邮电出版社,2000.
[6] 谢希仁.计算机网络[M].北京:清华大学出版社,1999.
[7] 黄超.Windows网络编程[M].北京:人民邮电出版社,2003.
[8] 黄建华等.Delphi程序设计[M].北京:清华大学出版社,2002.