APP下载

基于UNIX平台下的Socket对话系统的设计

2012-11-06宋晓莉李宏

湖南工业职业技术学院学报 2012年1期
关键词:客户机服务器端IP地址

宋晓莉,李宏

(1.中南大学软件学院,湖南长沙410083;2.湖南工业职业技术学院,湖南长沙410208)

基于UNIX平台下的Socket对话系统的设计

宋晓莉1,2,李宏1

(1.中南大学软件学院,湖南长沙410083;2.湖南工业职业技术学院,湖南长沙410208)

Socket编程是用来解决网际间的进程能够进行相互通信的问题。而Socket接口为进程间的相互通信提供了一种新的方法,Socket接口不仅可以用在同一机器内部进程之间的相互通信,而且还能够实现网际之间的相互通信的功能。本文对相关理论进行了讨论与研究,并在此基础上设计出一个对话系统。

Socket接口;对话系统;TCP/IP

引言

socket通常也被称作为“套接字”[1],它的目的是用于描述IP地址和端口号,要想能够更好的设计出线程模型,必须清楚了解socket的内部环境和工作机理。Socket编程界面是基于4BSD UNIX下实现的,其目的就是用来解决网际间的进程能够进行相互通信的问题。而Socket接口为进程间的相互通信提供了一种新的方法,Socket接口不仅可以用在同一机器内部进程之间的相互通信,而且还能够实现网际之间的相互通信的功能。Socket的不同类型则实现了透明传输通信的功能。

1.Socket原理

1.1 Java与Internet

Java程序设计语言取得成功的领域之一就是应用于网络中[2]。TCP/IP(传输控制协议/网间协议)是internet的主要协议之一,TCP/IP协议定义了计算机和外设进行通信所使用的规则即语法、语意、定时。TCP/IP的模型即应用层,传输层,网络层,网络接口层。大多数运行在Internet上的应用程序通常是被看成是TCP/IP协议模型的上一层。 如:ftp、http、smtp、pop3、telnet等等。

IP地址:是为连接Internet的每一台计算机所分配的一个长达32bit地址,在Internet上每台主机有且仅有一个IP地址。

在Java语言中,InterAddress类的功能是用来存储主机在internet中IP地址的。

Java提供的网络功能,大致可以分为三大类:

1.1.1 URL

URL是这三大功能中最高级别的一类,通过URL Java程序则可以从网络上读入数据或者是直接将数据送到网路上。

1.1.2 Socket

Socket是internet网络中程序设计最为常用的一种方式。功能就是为两个不同的进程提供网络通信信道。

1.1.3 Datagram

是更为低级的网络传输方式,它的作用就是把数据的目的记录在数据包中,然后直接把数据包放在网络上进行传输。

1.2 关于TCP/IP协议

TCP/IP协议奠定了网络通信的基石,对此,Java程序设计语言专门提供了一个Socket的类库[3],将TCP协议通信的一些常用方法抽象出来。

在介绍TCP/IP协议通信的流程之前,先来对两个重要的概念进行声明。

(1)客户端:客户端就是指发送TCP请求的并且为客户提供本地服务的一些程序,客户端一般是服务(比如数据查询服务)的请求者。

(2)服务器:服务器是指一个专门管理资源并且为用户提供服务的一些程序或软件。当服务器接收到客户端的请求之后(确保同客户端的通信信道建立),服务器则会向客户端提供客户端所需的服务。服务器一般是提供服务并执行服务的的,并向客户端返回服务执行的结果。

为了实现客户端与服务器端的相互通信,客户端首先将一个“SYN”数据包发送到服务器端。如果服务器收到了一个标识是SYN标记,这时服务器端将一个“SYN+ACK”数据包发送到请求服务的客户端。客户端收到服务器的响应即SYN+ACK信息后则立即会向服务器发送一个最终确认消息息(ACK包)。至此客服端和服务器端建立起连接。这种通过SYN,SYN+ACK,ACK的一问一答的步骤就叫做TCP连接建立时的“三次握手”。这样客户端和服务器端就安全地建立起连接,这个连接将一直保持着活动状态,直到超时或者客户端或者是服务器端任何一方发出一个FIN(结束)信号。这种通信模式也叫客户端/服务器(C/S)模式。

图2.1三次握手

由此可见,客户端和服务器端通过“三次握手”,双方就建立起畅通的通信信道,在此信道上双方能够互相传输数据。

1.3 Socket连接

计算机网络是指将各个自治的计算机连接起来以资源共享为目的的计算机集合。计算机网络最基本的目的之一就是让不同的计算机连接到一起,并实现相互“交谈”或者“沟通”。一旦两台计算机都发现了对方,就可以展开不同计算机的相互通信。但它们通过什么样的方式才能“发现”对方呢?我们可以以一个游戏为例,与在游乐园里做游戏一样:一台计算机要停留在某一个特定的地方,一直侦听着其他计算机发出的信号,好像就是说:“嘿,你在哪里呢?”。那个这个时候停留的计算机则做出回应,我们把停留在某个特定的地方的计算机叫做服务器端。即Server;到处“找人”的计算机则称作是客户机端(Client)。客户机端和服务器端之间的区别就是只有在客户机试图同服务器连接的时候才会表现出来。一旦客户端和服务器端建立起连接,就变成了一种全双工的通信方式,谁来扮演服务器端或者客户机端就显得不那么重要了。

因此服务器的主要任务是一直侦听是否客户端的服务有连接请求并与实现与客户端建立连接,这个由我们创建的特定目的的服务器对象来决定的。而客户机端的任务就是需要服务器提供服务的时候,就发送服务请求给服务器,试着与能够提供服务的服务器通过“三次握手”来建立连接,这是由我们创建的特定客户机端的对象完成的。

一旦客户机端和服务器端的连接建立好后,那么无论是在服务器端还是客户机端,连接就只是变成了一个普通的IO数据流对象。从这时开始,我们可以象读写一个普通的文件那样对待客户机端和服务器端建立的连接。所以一旦客户机端和服务器端建好连接后,我们只需使用自己熟悉的IO命令进行操作即可。

图2.2服务器和客户端

2.Socket对话系统设计

上面已经讨论了Socket的原理[4,5],我们可以通过具体的案例,来了解Socket的工作方式。依据TCP/IP的协议,在C/S的架构下的通讯过程中,客户端和服务器端的Socket操作如下[6,7,8]:

2.1 客户端

(1)实例化Socket对象。基于服务器端的端口号和IP地址来实例化Socket对象。

(2)客户端连接服务器端。通过调用connect方法将客户端连接到服务器上。

(3)填充I/O对象。调用BufferedReader、PrintWriter等方法把发送到服务器的I/O流填充到I/O对象里。

(4)给服务器端发送数据。利用I/O流对象及其Socket所提供的getInputStream和getOutputStream方法,向服务器端发送客户端的数据流。

(5)断开客户端和服务器端的连接。服务请求完成之后,再关闭打开的I/O对象和Socket对象。

2.2 服务器

(1)实例化ServerSocket对象。在服务器端,首先使用一个端口来实例化一个ServerSocket对象。此时,服务器就可以通过这个端口时时刻刻监听从客户端发来的连接请求。

(2)监听客户端请求。建立连接,通过调用ServerSocket的accept方法监听来自客户端发送过来的连接请求。

(3)实现I/O操作。利用accept方法返回的客户端的Socket对象,进行读写I/O的操作。

(4)断开客户端和服务器端的连接。当通讯完成后,关闭打开的流和Socket对象。

图4.1 socket系统调用过程

上图显示了程序使用面向连接协议(tcp)时,进行的典型socket系统调用。服务器程序建立了一个socket,并调用bind函数将此socket和本地协议端口联系起来,然后用listen和accept函数将此socket参数置于被动的监听模式并接收到建立连接。

在一个对话系统中,server需要轮流查询与各client建立的socket,一旦可读就将该socket中的字符读出来并向所有其他client发送。并且,server还要随时查看是否有新的client试图建立连接,这样,如果server在任何一个地方阻塞了,其他client发送的内容就会受到影响,得不到服务器的及时响应。新client试图建立连接也会受到影响。所以我们在这里不能使用缺省的阻塞的文件工作方式,而需要将文件的工作方式变成非阻塞方式。在UNIX下,函数fcntl()可以用来改变文件I/O操作的工作方式,函数描述如下:

由于判断是否有新连接,是否可读都是非阻塞的,因此每次判断,不管有还是没有,都会马上返回.这样,任何一个client向server发送字符或者试图建立新连接,都不会对其他client的活动造成影响。

对client而言,建立连接之后,只需要处理两个文件描述符,一个是建立了连接的socket描述符,另一个是标准输入.和server一样,如果使用阻塞方式的话,很容易因为其中一个暂时没有输入而影响另外一个的读入,因此将它们都变成非阻塞的,然后client进行如下动作:

结语

通过以上Socket对话系统的设计,不管是 server还是client,它们都不停的轮流查询各个文件描述符,一旦可读就读入并进行处理。这样的程序,不停的在执行,只要有CPU资源,就不会放过。服务器端不停监听是否有客户端发来请求连接信息,一旦发现就通过“三次握手”来建立连接,最后通过相应的类提供的方法来实现相互通信。

[1]孙一林,彭波.Java网络编程实例[M].清华大学出版社,2003.

[2]李树青.Java通用范例开发金典 [M]. 电子工业出版社,2009

[3]王鹏.Java Swing图形界面开发与案例详解[M].清华大学出版社,2008

[4]庞永庆,翟鹏.Java完全自学宝典[M].清华大学出版社,2008

[5]刘永华,于春花.Java网络编程 [M]. 清华大学出版社,2008

[6]李扬,耿昌宇,张丽芬等.基于Socket通讯模式下的跨平台数据同步[J].北京理工大学学报,2002,22(1):81-84.

[7]朱斌.LinuxSocket编程及其在无线网关中的应用[J].微计算机信息,2007,23(3):70-71.

[8]谷岩.利用Java的Socket编程机制实现在线交谈[J].计算机工程与设计,2004,25(6):44-46.

Based on the UNIX Platforms Socket Dialogue System Design

SONGXiao-Li1,2,LI Hong1
(1.Cent ralSout h Uni versi t y,Changsha410083,H unan 2.H unan Indust ryPol yt echni c,Changsha410208,H unan)

Socketprogram m i ng i sused t o resol ve net work probl em ofi nt erprocesscom m uni cat i on.SocketInt erf ace provi desa new way t o com m unicat ewi t h each ot heri n t heprocess,SocketInt erf acenotonl ycan beused t ocom m uni cat ewi t h each ot heri n t hesam em achi ne,i nt ernalprocesses,butal sot o com m uni cat ewi t h each ot herbet ween t heInt ernetf unct i ons.Thi spaperdi scussand research on rel at ed t heori es,and on t hi sbasi st odesi gn adi al ogsyst em.

UNIX;SocketInt erf ace;Di al oguesyst em;TCP/IP

TP32

[文章编号]1671-5004(2012) 01-0020-03

2012-2-13

宋晓莉(1976-),女,湖南花垣人,湖南工业职业技术学院讲师,中南大学软件学院在读硕士研究生,研究方向:软件工程

猜你喜欢

客户机服务器端IP地址
Linux环境下基于Socket的数据传输软件设计
铁路远动系统几种组网方式IP地址的申请和设置
浅析异步通信层的架构在ASP.NET 程序中的应用
IP地址切换器(IPCFG)
基于SNMP的IP地址管理系统开发与应用
基于Qt的安全即时通讯软件服务器端设计
公安网络中IP地址智能管理的研究与思考
网页防篡改中分布式文件同步复制系统
瘦客户机:安全与便捷的选择
升腾瘦客户机借神码翱翔“云端”