Socket编程与客户服务器应用开发_第1页
Socket编程与客户服务器应用开发_第2页
Socket编程与客户服务器应用开发_第3页
Socket编程与客户服务器应用开发_第4页
Socket编程与客户服务器应用开发_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Socket 编程编程 提提 纲纲 ? Socket概述与分类 ? 数据包Socket API与流式Socket API ? 客户-服务器范型概述 ? 客户-服务器应用开发方法及实例 ? 面向链接与无连接服务器程序开发 ? 迭代与并发服务器 ? 有状态与无状态服务器程序开发 Socket概述 ? Socket API Socket API最早作为最早作为Berkeley UnixBerkeley Unix操作系统的程序库,操作系统的程序库,出现于出现于2020世纪世纪8080年代早期,用于提供年代早期,用于提供IPCIPC功能。现在所有主功能。现在所有主流操作系统都支持流操作系统都支持Sock

2、et APISocket API。Socket APISocket API是实现进程间是实现进程间通信的第一种编程设施。通信的第一种编程设施。 ? Socket API Socket API已经成为已经成为IPCIPC编程事实上的标准,高层编程事实上的标准,高层IPCIPC设设施都是构建于施都是构建于Socket APISocket API之上的,即它们基于之上的,即它们基于Socket APISocket API实现的。实现的。 ?对于响应时间要求较高或在有限资源平台上运行的应用对于响应时间要求较高或在有限资源平台上运行的应用来说,用来说,用Socket APISocket API实现是最合

3、适的。实现是最合适的。 Socket概念模型 如图所示,如图所示,Socket APISocket API的设计者提供了一种称为的设计者提供了一种称为SocketSocket的编程类的编程类型。希望与另一进程通信的进程必须创建该类型的一个实例(实型。希望与另一进程通信的进程必须创建该类型的一个实例(实例化一个例化一个socketsocket对象),两个进程都可以使用对象),两个进程都可以使用Socket APISocket API提供的提供的操作发送和接受数据。操作发送和接受数据。 图3-1 Socket API 概念模型 Socket分类 Socket API 数据包Socket 流式Soc

4、ket ?使用使用UDP协协议传输的议传输的Socket ?使用使用TCP协协议传输的议传输的Socket 提提 纲纲 ? Socket概述与分类 ? 数据包Socket API与流式Socket API ? 客户-服务器范型概述 ? 客户-服务器应用开发方法及实例 ? 面向链接与无连接服务器程序开发 ? 迭代与并发服务器 ? 有状态与无状态服务器程序开发 数据包Socket 数据包数据包Socket 无连接无连接数据包数据包socket 面向连面向连接数据接数据包包socket 目标功能目标功能 无连接数据包无连接数据包socketsocket和面向链接数据包和面向链接数据包socketso

5、cket的比较的比较 无连接数据包 发送者 数据包Socket API 的JAVA实现 关键代码 实现步骤 1.1.创建一个代表数据包本身的对象。创建一个代表数据包本身的对象。该对象可通过实例化一个携带下列该对象可通过实例化一个携带下列信息的信息的DatagramPacketDatagramPacket 对象来创建:对象来创建: 一个包含有效数据的字节数组引用 目标地址,即接受者进程的socket所绑定的主机ID和端口号 02 02 2.2.调用调用DatagramSocketDatagramSocket 对象的对象的sendsend方法,将方法,将 DatagramPacketDatagra

6、mPacket 对象引用对象引用作为传递参数作为传递参数 DatagramSocket mySocket = new DatagramSocket(); byte buffer = message.getBytes( ); DatagramPacket datagram = new DatagramPacket(buffer, buffer.length, receiverHost, receiverPort); mySocket.send(datagram); 无连接数据包 接收者 1.1.实例化一个实例化一个DatagramPacketDatagramPacket 对象对象并将其绑定到一个

7、本地端口上,该并将其绑定到一个本地端口上,该端口必须与发送者数据包当中定义端口必须与发送者数据包当中定义的一致。的一致。 关键代码 DatagramSocket mySocket = new DatagramSocket(port); byte buffer = new byteMAX_LEN; DatagramPacket datagram = new DatagramPacket(buffer, MAX_LEN); mySocket.receive(datagram); 实现步骤 2.2.为接收发送给为接收发送给 SocketSocket的数据包,的数据包,接收者进程创建一个指向字节数组接

8、收者进程创建一个指向字节数组的的DatagramPacketDatagramPacket ,并调用,并调用DatagramSocketDatagramSocket 对象的对象的receivereceive方方法,将法,将DatagramPacketDatagramPacket 对象引用作对象引用作为传递参数。为传递参数。 02 02 无连接数据包 发送者和接收者程序中的数据结构发送者和接收者程序中的数据结构 无连接数据包 程序演示 ? 单工通信: Example1Sender.java, Example1Receiver.java ? 双工通信: MyDatagramSocket.java,

9、Example2SenderReceiver.java , Example2ReceiverSender.java 基于无连接数据包基于无连接数据包socketsocket的简单消息交换程序代码的简单消息交换程序代码 无连接数据包 无连接数据包无连接数据包socket socket 对于无连接Socket,发送者进程绑定到的Socket可用来向不同目的地发送报文。多个发送者进程也可以同时向绑定到某个接收进程的Socket发送数据包,此时将无法预测消息到达顺序,这一点与底层UDP协议相一致 ?代码里使用到的代码里使用到的DatagramPacketDatagramPacket和和Datagram

10、SocketDatagramSocket类的主要方法和构造函数有:类的主要方法和构造函数有: DatagramPacket(byte buf, int length)DatagramPacket(byte buf, int length); DatagramPacket(byte buf, int length, InetAddress address, int port) DatagramPacket(byte buf, int length, InetAddress address, int port) ;DatagramSocket( ) DatagramSocket( ) ; Data

11、gramSocket(int port)DatagramSocket(int port) ;void close( )void close( ) ; void receive(DatagramPacket p) void receive(DatagramPacket p) ;void send (DatagramPacket p)void send (DatagramPacket p) ; void setSoTimeout(int timeout) void setSoTimeout(int timeout) ?由于在无连接方式中,数据是通过一系列独立的报文发送的,因此无连接数据包由于在无连

12、接方式中,数据是通过一系列独立的报文发送的,因此无连接数据包socketsocket中存在一些异常情形:中存在一些异常情形: (1 1)如果数据包被发送给一个仍未被接收者创建的)如果数据包被发送给一个仍未被接收者创建的socketsocket,该数据包将可能被丢弃。在这种,该数据包将可能被丢弃。在这种情况下,数据将丢失,并且情况下,数据将丢失,并且 receivereceive操作可能会导致无限阻塞操作可能会导致无限阻塞 (2 2)如果接收者定义了一个大小为)如果接收者定义了一个大小为 n n的数据包缓存,那么大小超过的数据包缓存,那么大小超过 n n的接收消息将被截断的接收消息将被截断 面向

13、连接数据包 ?SocketSocket连接通过指定远程连接通过指定远程socketsocket地址建立。一旦连接建立后,地址建立。一旦连接建立后,socketsocket将只能用来与将只能用来与建立连接的远程建立连接的远程socket socket 交换数据报文交换数据报文 ?用于创建和终止连接的两个方法:用于创建和终止连接的两个方法: public void connect(InetAddress address,int port) public void connect(InetAddress address,int port) public void disconnect( ) publ

14、ic void disconnect( ) ?连接一旦与数据包连接一旦与数据包socketsocket绑定后,该绑定后,该socketsocket将不能与任何其他将不能与任何其他socketsocket通信,直到该通信,直到该连接终止。由于连接是单向的,也就是说限制了其中一方,另一方的连接终止。由于连接是单向的,也就是说限制了其中一方,另一方的socketsocket可以自可以自由地向其他由地向其他socketsocket发送或接受数据,除非有其他发送或接受数据,除非有其他socketsocket建立到它的连接。建立到它的连接。 ?面向连接数据包面向连接数据包Socket APISocket

15、API并不经常使用,因为该并不经常使用,因为该APIAPI提供的连接非常简单,通常提供的连接非常简单,通常不能满足面向连接的通信要求。而随后介绍的流式不能满足面向连接的通信要求。而随后介绍的流式SocketSocket是面向连接通信中更典型是面向连接通信中更典型和实用的方法。和实用的方法。 流式Socket API 基于流式基于流式socketsocket的数据传输的数据传输 ? 流式Socket API提供了基于Unix操作系统的流式IO的数据传输模式。根据定义,流式Socket API仅支持面向连接通信。 流式Socket API 图3-8 流式Socket API 流式流式Socket

16、API Socket API 模型模型 ?流式Socket API 模型:服务器进程建立一个连接 socket,随后侦听来自客户进程的连接请求。每次只接受一个连接请求。当连接被接受后,将为该连接创建一个数据 socket,然后服务器进程和客户进程则可通过数据socket从数据流读取数据或向其中写入数据。 流式Socket API 连接侦听者和连接请求者中的程序流连接侦听者和连接请求者中的程序流 ?在Java流式Socket API 中有两个主要类: ServerSocket 和Socket。类ServerSocket 用来侦听和建立连接,而类 Socket用于进行数据传输。下表列出了这两个类的

17、主要方法和构造函数。注意:其中accept方法是阻塞操作,如果没有正在等待的请求。服务器进程被挂起,直到连接请求到达。 流式Socket API 的JAVA实现 在在JavaJava流式流式Socket APISocket API 中有两个主要类:中有两个主要类: ServerSocketServerSocket 和和SocketSocket。类。类ServerSocketServerSocket 用来侦用来侦听和建立连接,而类听和建立连接,而类 SocketSocket用于进行数据传输用于进行数据传输 类类Socket的主要方法和构造函数的主要方法和构造函数 类类ServerSocket的主

18、要方法和构造函数的主要方法和构造函数 Method/constructor ServerSocket(int port) Socket accept() throws IOException Description Creates a server socket on a specified port. Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made. Closes this socket. Method/constru

19、ctor Description Creates a stream socket and Socket(InetAddress , connects it to the specified int port) port number at the specified IP address Closes this socket. void close() throws IOException Public void close() throws IOException void setSoTimeout(int timeout) Set a timeout period (in throws S

20、ocketException milliseconds) so that a call to accept( ) for this socket will block for only this amount of time. If the timeout expires, a java.io.InterruptedIOException is raised InputStream getInputStream( )throws IOException OutputStream getOutputStream( ) throws IOException void setSoTimeout(in

21、t timeout)throws SocketException Returns an input stream so that data may be read from this socket. Returns an output stream so that data may be written to this socket. Set a timeout period for blocking so that a read( ) call on the InputStream associated with this Socket will block for only this am

22、ount of time. If the timeout expires, a java.io.InterruptedIOException is raised 流式Socket 流式socket程序演示 ? 单工通信: Example4ConnectionAcceptor Example4ConnectionRequest ?Example4ConnectionAcceptor 通过在特定端口上建立 ServerSocket 对象来接受连接。Example4ConnectionRequestor 创建一个socket对象,其参数为Acceptor 中的主机名和端口号。一旦连接被 Accept

23、or接受,消息被 Acceptor 写入socket的数据流。在 Requestor 方,消息从数据流读出并显示。 提提 纲纲 ? Socket概述与分类 ? 数据包Socket API与流式Socket API ? 客户-服务器范型概述 ? 客户-服务器应用开发方法及实例 ? 面向链接与无连接服务器程序开发 ? 迭代与并发服务器 ? 有状态与无状态服务器程序开发 客户-服务器范型 服务器进程运行在网络中的服务器进程运行在网络中的服务器上,管理该主机提供服务器上,管理该主机提供的网络服务;用户利用相应的网络服务;用户利用相应的客户进程访问特定服务的客户进程访问特定服务 图3-11 客户-服务器

24、范型 客户客户- -服务器范型是面向服务的,即它的服务器范型是面向服务的,即它的设计目的是提供网络服务(网络服务是设计目的是提供网络服务(网络服务是指为网络用户提供资源共享的服务)。指为网络用户提供资源共享的服务)。客户客户- -服务器范型建立在消息传递范型之服务器范型建立在消息传递范型之上,是目前网络应用所使用的最流行的上,是目前网络应用所使用的最流行的分布式计算范型分布式计算范型 启动服务 服务器进程执行过程 接受客户会话请求 建立客户会话 客户客户-服务器范型的关键问题服务器范型的关键问题 服务器管理的服务被多个用户并发访问。每个客户在使用服务器提供的服务时,都单独与服务器建立一个会话。

25、在会话期间,客户与服务器进行对话,直到已获取了所需的服务为止 服务会话服务会话 为了实现服务,需要有一个协议来定义客户 -服务器在服务会话期间必须遵守的规则。这些规则涉及到的规范内容包括:服务定位的方法;进程间通信的顺序;进程间交换数据的表示及解释 服务协议服务协议 客户-服务器范型中,进程之间的交互遵循请求 -应答的模式。客户在发出每一个请求后都必须先等待服务器的应答,然后才能进一步继续处理。每个会话的对话都遵守该服务协议预先定义的交互模式 进程间通信进程间通信 数据表示数据表示 每个请求和应答选择使用哪一种数据表示,取决于协议的特性及其需要。使用文本模式表示是一种较为合理的选择,易于被他人

26、阅读。大部分的Internet协议都是基于客户 -服务器范型、请求 -应答和文本数据表示的。 提提 纲纲 ? Socket概述与分类 ? 数据包Socket API与流式Socket API ? 客户-服务器范型概述 ? 客户-服务器应用开发方法及实例 ? 面向链接与无连接服务器程序开发 ? 迭代与并发服务器 ? 有状态与无状态服务器程序开发 三层软件体系结构 表示层:在服务端,需要用户界面表示层:在服务端,需要用户界面UIUI来启动服务进程。一般情况下,在命令来启动服务进程。一般情况下,在命令行上执行一条命令即可。在客户端需要行上执行一条命令即可。在客户端需要客户进程提供用户界面,通过该界面

27、客客户进程提供用户界面,通过该界面客户主机上的用户可请求服务或接受服务户主机上的用户可请求服务或接受服务器响应。器响应。 应用逻辑层:在服务器端,需要从系应用逻辑层:在服务器端,需要从系统中获取时间并发送给客户主机。在客统中获取时间并发送给客户主机。在客户端,需要将用户请求转发给服务器,户端,需要将用户请求转发给服务器,并将服务器应答显示给用户。并将服务器应答显示给用户。 服务层:支持应用所需的服务,如服服务层:支持应用所需的服务,如服务器主机时钟的读出,双方的务器主机时钟的读出,双方的IPCIPC机制等。机制等。 客户端软件客户端软件 服务器端软件服务器端软件 表示逻辑 表示逻辑 应用逻辑

28、应用逻辑 应用逻辑 服务逻辑 客户客户- -服务器应用的软件体系结构服务器应用的软件体系结构 基于无连接socket的Daytime协议 clientm1serverm2sequence diagramdata representation: text (character strings)data format:m1; a null message - contents will be ignored.m2 : contains a timestamp, in a format such as Wed Jan 30 09:52:48 2002采用无连接数据包Socket的Daytime 客户

29、-服务器应用 客户端软件 DaytimeClient1 DaytimeClient1的的UMLUML类图(未显示所有属性)类图(未显示所有属性) ?表示逻辑:表示逻辑: DaytimeClient1.java DaytimeClient1.java类封装了客户端的表示逻辑。该类的代类封装了客户端的表示逻辑。该类的代码只关注从用户处获取输入(服务器地址)和向用户显示输出(时间戳)。码只关注从用户处获取输入(服务器地址)和向用户显示输出(时间戳)。 为获取时间戳,向为获取时间戳,向helperhelper类发起了一个方法调动。该方法隐藏了应用逻辑细类发起了一个方法调动。该方法隐藏了应用逻辑细节以及

30、底层服务逻辑。结果是,节以及底层服务逻辑。结果是,DaytimeClient1.javaDaytimeClient1.java的开发人员不必关注的开发人员不必关注IPCIPC中使用的中使用的socketsocket类型。类型。 ?应用逻辑:应用逻辑: DaytimeClientHelper1.java DaytimeClientHelper1.java类封装了客户端的应用逻辑。该类封装了客户端的应用逻辑。该模块使用了子类模块使用了子类DatagramSocketDatagramSocket,myClientDatagramSocketmyClientDatagramSocket,执行发送请求,

31、执行发送请求或接收应答的或接收应答的IPCIPC。注意数据包。注意数据包socketsocket的使用细节被该模块隐藏。该模块不必的使用细节被该模块隐藏。该模块不必处理携带有效载荷数据的字节数组。处理携带有效载荷数据的字节数组。 ?服务逻辑:服务逻辑: MyClientDatagramSocket.java MyClientDatagramSocket.java类提供了类提供了IPCIPC服务细节,该例服务细节,该例中使用了数据包中使用了数据包Socket APISocket API(抽象模型中的最底层)。(抽象模型中的最底层)。 服务器端软件 图3-15 DayTimeServer1 的UM

32、L类图(未显示所有属性) DayTimeServer1DayTimeServer1的的UMLUML类图(未显示所有属性)类图(未显示所有属性) ?表示层:通常,服务器端几乎没有表示逻辑。在本例中,用户仅需输入服表示层:通常,服务器端几乎没有表示逻辑。在本例中,用户仅需输入服务器端口,为简化起见,这里使用命令行参数处理端口输入。务器端口,为简化起见,这里使用命令行参数处理端口输入。 ?应用逻辑层:类应用逻辑层:类DaytimeServer1.javaDaytimeServer1.java封装了服务器端的应用逻辑。该模封装了服务器端的应用逻辑。该模块执行时不断循环,等待客户请求并为该客户建立服务会

33、话。该模块通过块执行时不断循环,等待客户请求并为该客户建立服务会话。该模块通过DatagramSocketDatagramSocket的子类的子类myServerDatagramSocketmyServerDatagramSocket执行接收请求和发送应答的执行接收请求和发送应答的IPCIPC。注意,该模块隐藏了使用数据包。注意,该模块隐藏了使用数据包socketsocket的细节。具体来说,该模块不需的细节。具体来说,该模块不需要处理携带有效载荷数据的字节数组。要处理携带有效载荷数据的字节数组。 ?服务逻辑:类服务逻辑:类MyServerDatagramSocketMyServerDatag

34、ramSocket提供提供IPCIPC服务细节,本例中使用数服务细节,本例中使用数据包据包Socket APISocket API。该类与类。该类与类MyClientDatagramClientMyClientDatagramClient相似,但不同的是,这相似,但不同的是,这里的里的receiveMessagereceiveMessage方法返回了一个方法返回了一个DatagramMessageDatagramMessage对象,其中不仅包含自对象,其中不仅包含自身消息,还包括发送者地址。服务器需要使用该地址向客户发送请求。这是身消息,还包括发送者地址。服务器需要使用该地址向客户发送请求。这

35、是无连接无连接socketsocket的一个特有性质。除此之外,服务器无法知道该向何处发送应的一个特有性质。除此之外,服务器无法知道该向何处发送应答消息。从接收数据报中获取发送者地址的方法是答消息。从接收数据报中获取发送者地址的方法是getAddressgetAddress和和getPortgetPort。 Daytime协议程序演示 ? 基于无连接socket的Daytime协议的实现: DaytimeClient1.java DaytimeClientHelper1.java MyClientDatagramSocket.java DaytimeServer1.java MyServerD

36、atagram.java ?采用无连接数据包 socket的daytime客户-服务器应用。 基于流式socket的Daytime协议 clientmserversequence diagramdata representation: text (character strings)data format:m : contains a timestamp, in a format such as Wed Jan 30 09:52:48 2002采用流式Socket的Daytime 客户-服务器应用 客户端软件 图3-16 DaytimeClient2 的UML类图(未显示所有属性) Dayti

37、meClient2 DaytimeClient2的的UMLUML类图(未显示所有属性)类图(未显示所有属性) ?表示逻辑:除了表示逻辑:除了helperhelper类名改成类名改成DaytimeHelper2DaytimeHelper2以外,其余都与以外,其余都与DaytimClient1DaytimClient1相同。相同。DaytimeClientHelper2DaytimeClientHelper2中的中的getTimeStampgetTimeStamp方法使方法使用了流式用了流式Socket APISocket API,但具体细节对,但具体细节对DaytimeClient2Daytim

38、eClient2来说是透明的。来说是透明的。 ?应用逻辑:类应用逻辑:类DaytimeClientHelper2DaytimeClientHelper2封装了客户端的应用逻辑,这封装了客户端的应用逻辑,这与与DaytimeClientHelper1DaytimeClientHelper1类似,但该类使用流式类似,但该类使用流式socketsocket取代了数据包取代了数据包socketsocket。此时客户不必通过发送一个空消息来发出请求,因为连接已经。此时客户不必通过发送一个空消息来发出请求,因为连接已经包含了返回地址。包含了返回地址。 ?服务逻辑:类服务逻辑:类MyStreamSocket

39、MyStreamSocket提供了提供了IPCIPC服务细节。本例中使用了流服务细节。本例中使用了流式式Socket APISocket API。类。类MyStreamSocketMyStreamSocket是一个包装类,其封装了类是一个包装类,其封装了类socketsocket,并提供向并提供向socketsocket发送和接收消息的方法。发送和接收消息的方法。 服务器端软件 图3-17 DaytimeServer2 的UML类图(未显示所有属性) DayTimeServer2DayTimeServer2的的UMLUML类图(未显示所有属性)类图(未显示所有属性) ?表示层:表示层:Dayt

40、imeServer2DaytimeServer2的代码与的代码与DaytimeServer1DaytimeServer1相同,仅有的用相同,仅有的用户输入是服务器端口号。为简单起见,使用命令行参数来处理输入。户输入是服务器端口号。为简单起见,使用命令行参数来处理输入。 ?应用逻辑层:应用逻辑层:DaytimeServer2DaytimeServer2的代码使用流式的代码使用流式 Socket APISocket API接受连接。接受连接。随后使用返回的随后使用返回的 socketsocket引用实例化一个引用实例化一个 MyStreamSocketMyStreamSocket对象,该对象对象,

41、该对象的的SendMessageSendMessage方法被用来向连接另一端的客户传送时间戳。方法被用来向连接另一端的客户传送时间戳。 ?服务逻辑:因为其中包含流式服务逻辑:因为其中包含流式IPCIPC所需的方法,故此处使用了与客户所需的方法,故此处使用了与客户端相同的包装类端相同的包装类 MySteeamSocketMySteeamSocket。如果服务器软件的开发独立于客户。如果服务器软件的开发独立于客户软件,则也可以使用其他不同类或者甚至是不同机制来提供服务逻辑。软件,则也可以使用其他不同类或者甚至是不同机制来提供服务逻辑。 Daytime协议程序演示 ? 基于流式socket的Dayt

42、ime协议的实现: DaytimeClient2.java DaytimeClientHelper2.java DaytimeServer2.java MyStreamSocket.java ?采用流式socket的daytime客户-服务器应用。 提提 纲纲 ? Socket概述与分类 ? 数据包Socket API与流式Socket API ? 客户-服务器范型概述 ? 客户-服务器应用开发方法及实例 ? 面向链接与无连接服务器程序开发 ? 迭代与并发服务器 ? 有状态与无状态服务器程序开发 面向连接与无连接服务器面向连接与无连接服务器 无连接服务器:无连接服务器:使用无连接的进程间通信使

43、用无连接的进程间通信APIAPI(如数据包(如数据包socket)socket);并发的多个会话可以交叉执行。;并发的多个会话可以交叉执行。 面向连接服务器:面向连接服务器:使用面向连接的进程间通信使用面向连接的进程间通信APIAPI(如流式(如流式socket)socket);并发的多个会话一般是被顺序执行的,除非服务;并发的多个会话一般是被顺序执行的,除非服务器是多线程的。器是多线程的。 什么是Echo协议? InternetInternet协议协议EchoEcho是一项著名是一项著名InternetInternet服务的基础。服务的基础。EchoEcho协议只允许客户每次协议只允许客户每

44、次向服务器发送一行文本,并接收服务器向服务器发送一行文本,并接收服务器的、关于每行文本的回显。在实际中许的、关于每行文本的回显。在实际中许多多InternetInternet主机都有一个默认主机都有一个默认EchoEcho服务服务器(运行于端口号器(运行于端口号7 7上),软件工程师上),软件工程师在开发其他协议的客户程序时,可把它在开发其他协议的客户程序时,可把它作为临时代理服务器使用。作为临时代理服务器使用。 无连接无连接Echo客户客户-服务器服务器 客户表示逻辑被封装在类客户表示逻辑被封装在类 EchoClient1EchoClient1中,该类提供中,该类提供了提示服务器信息的用户界

45、面,然后通过循环向了提示服务器信息的用户界面,然后通过循环向 EchoEcho服服务器发送文本行。务器发送文本行。 类类EchoClientHelper1EchoClientHelper1的的getEchogetEcho方法负责文本字符串方法负责文本字符串发送,以及回显消息接收的处理。发送,以及回显消息接收的处理。 类类EchoClientHelper1EchoClientHelper1提供客户应用逻辑。每个客户提供客户应用逻辑。每个客户进程都创建该类的一个实例,并拥有服务器主机地址及进程都创建该类的一个实例,并拥有服务器主机地址及客户端客户端IPCIPC使用的使用的socketsocket引

46、用。引用。 getEchogetEcho使用该使用该socketsocket向服务器发送和接收一行数据。向服务器发送和接收一行数据。 最后,用最后,用closeclose方法关闭方法关闭socketsocket。 o客Ech户 Echo 服务器 图3-18 EchoServer1 的两个交错会话的顺序状态图 Echo服务器的两个交错会话顺序状态图 EchoServer1.javaEchoServer1.java组合了服务器的表示逻辑和应用逻辑。组合了服务器的表示逻辑和应用逻辑。在每轮无限循环,服务器从在每轮无限循环,服务器从 socketsocket读取一行数据,随后读取一行数据,随后向向so

47、cketsocket回写一行数据,将该应答发送给发送者。由于回写一行数据,将该应答发送给发送者。由于没有使用连接,服务器在随后可能在连续的迭代中与不没有使用连接,服务器在随后可能在连续的迭代中与不同的客户交互,产生多个交错的并发服务会话。同的客户交互,产生多个交错的并发服务会话。 面向连接面向连接Echo客户客户-服务器服务器 在在EchoEcho客户端中与服务器的连接是在构造函数中建立的,而每轮消息客户端中与服务器的连接是在构造函数中建立的,而每轮消息交换都通过交换都通过getEchogetEcho方法提供。方法方法提供。方法donedone用于在关闭客户端用于在关闭客户端socketsoc

48、ket之前,之前,向服务器发送一条会话结束消息。向服务器发送一条会话结束消息。 在在EchoEcho服务器中,先创建一个连接服务器中,先创建一个连接socketsocket来接受连接。对每个已接受来接受连接。对每个已接受的连接,服务器通过与连接相连的数据的连接,服务器通过与连接相连的数据socketsocket,不断接收和回显消息,不断接收和回显消息,直到收到会话结束消息后为止。会话结束时,关闭当前客户的数据直到收到会话结束消息后为止。会话结束时,关闭当前客户的数据socketsocket,并终止连接。服务器随后等待接受下一个连接。,并终止连接。服务器随后等待接受下一个连接。 会话期间,服务器

49、维护客户连接,并通过该客户的专有数据会话期间,服务器维护客户连接,并通过该客户的专有数据socketsocket与与客户交换数据。如果另一客户在服务器参与会话过程中与服务器连接,客户交换数据。如果另一客户在服务器参与会话过程中与服务器连接,此时该客户将不能与服务器交换数据,直到服务器结束当前会话时为止。此时该客户将不能与服务器交换数据,直到服务器结束当前会话时为止。 上图表示客户上图表示客户1 1服务过程中客户服务过程中客户 2 2试图与服务器连接时,试图与服务器连接时,两会话的顺序状态图。这种情况下没有会话交错。两会话的顺序状态图。这种情况下没有会话交错。 图3-19 EchoServer2

50、 不允许交错的会话 EchoServer 1(connectionless) Excerpt public class EchoServer1 public static void main(String args) / instantiates a datagram socket for both sending / and receiving data MyServerDatagramSocket mySocket = new MyServerDatagramSocket(serverPort); while (true) / forever loop DatagramMessage re

51、quest = mySocket.receiveMessageAndSender(); String message = request.getMessage( ); mySocket.sendMessage(request.getAddress( ), request.getPort( ), message); /end while 45 Distributed Computing EchoServer2 (Connection-oriented) excerpt ServerSocket myConnectionSocket = new ServerSocket(serverPort);

52、while (true) / forever loop MyStreamSocket myDataSocket = new MyStreamSocket (myConnectionSocket.accept( ); boolean done = false; while (!done) message = myDataSocket.receiveMessage( ); if (message.trim().equals (endMessage) myDataSocket.close( ); done = true; /end if else myDataSocket.sendMessage(m

53、essage); /end else /end while !done /end while forever Two consecutive client sessions with echo server2 EchoServer2messageechomessageechomessageechomessageechomessageechoclient 1 client247 Distributed Computing 提提 纲纲 ? Socket概述与分类 ? 数据包Socket API与流式Socket API ? 客户-服务器范型概述 ? 客户-服务器应用开发方法及实例 ? 面向链接与无

54、连接服务器程序开发 ? 迭代与并发服务器 ? 有状态与无状态服务器程序开发 迭代与并发服务器程序的开发 迭迭代代服服务务器器 在面向连接服务器中不存在重叠的客户会话,在面向连接服务器中不存在重叠的客户会话,这是因为服务器在同一时刻,仅能与一位已经这是因为服务器在同一时刻,仅能与一位已经接受的客户连接交换数据,这种服务器被称为接受的客户连接交换数据,这种服务器被称为迭代服务器,迭代服务器,即非多线程的连接服务器即非多线程的连接服务器。 并发服务器即能够并行处理多个客户会话的连并发服务器即能够并行处理多个客户会话的连接服务器。接服务器。可以使用线程或异步可以使用线程或异步IPCIPC操作来提供操作

55、来提供并发服务器。常用技术是使用线程,它的优点并发服务器。常用技术是使用线程,它的优点是相对简单。但某些情况下,必须使用异步是相对简单。但某些情况下,必须使用异步IPCIPC。与迭代服务器类似,并发服务器使用单个连接与迭代服务器类似,并发服务器使用单个连接socketsocket侦听连接。但是,并发服务器通过创建侦听连接。但是,并发服务器通过创建一个新线程来接受每个连接,并与连接客户建一个新线程来接受每个连接,并与连接客户建立服务会话;线程在会话结束时终止。立服务会话;线程在会话结束时终止。 并并发发服服务务器器 A client process at the head of the conn

56、ection queueserver hostconcurrent server processthe server connection queueservicethe main thread accepts connectionsa child thread processesthe protocol for aclient processA client process whose connection has been acceptedA client process whose connection has been accepted面向连接的并发服务器响应多个并发用户请求的示意图面

57、向连接的并发服务器响应多个并发用户请求的示意图 Sequence diagram of EchoServer3, a concurrent server EchoServer3EchoServer3 thread 1EchoServer3 thread 2EchoClient 1EchoClient2acceptconnection51 Distributed Computing EchoServer3 (concurrent) excerpt ServerSocket myConnectionSocket = new ServerSocket(serverPort); while (true) / forever loop MyStreamSocket myDataSocket = new MyStreamSocket (myC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论