《Java程序案例教程》课件第12章_第1页
《Java程序案例教程》课件第12章_第2页
《Java程序案例教程》课件第12章_第3页
《Java程序案例教程》课件第12章_第4页
《Java程序案例教程》课件第12章_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第12章Java网络程序设计12.1Socket介绍

12.2Socket程序

12.3DatagramSocket程序

12.1Socket介绍

Socket是指网络上运行的两个程序间双向通信的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便地对网络上数据的传递进行编程。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通信。本章介绍在Java中如何利用Socket进行网络编程。

在Java中Socket可以理解为客户端或者服务器端的一个特殊对象,这个对象有两个关键的方法:一个是getInputStream()方法,另一个是getOutputStream()方法。getInputStream()方法可以得到一个输入流,客户端的Socket对象上的getInputStream()方法得到的输入流其实就是从服务器端发回的数据流。getOutputStream()方法得到一个输出流,客户端Socket对象上的getOutputStream()方法返回的输出流就是将要发送到服务器端的数据流(其实是一个缓冲区,暂时存储将要发送过去的数据)。

Socket有两种主要的操作方式:面向连接的和无连接的。面向连接的Socket操作就像一部电话,必须建立一个连接和一人呼叫,所有的事情在到达时的顺序与它们出发时的顺序一样,无连接的Socket操作就像是一个邮件投递,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样。到底用哪种模式是由应用程序的需要决定的。如果可靠性更重要,则用面向连接的操作会好一些。比如,文件服务器需要数据的正确性和有序性,如果一些数据丢失,则系统的有效性将会失去。又如,一些服务器间歇性地发送一些数据块,如果数据丢失,服务器并不想要再重新发过一次,因为当数据到达时,它可能已经过时了。确保数据的有序性和正确性需要额外的内存消耗,额外的费用将会降低系统的回应速率。无连接的操作使用数据报协议。一个数据报是一个独立的单元,它包含了这次投递的所有信息。可以把它想象成一个信封,它有目的地址和要发送的内容。这个模式下的Socket不需要连接一个目的地的Socket,它只是简单地投出数据报。无连接的操作是快速的和高效的,但是数据安全性不佳。

面向连接的操作使用TCP协议。在该模式下,一个Socket必须在发送数据之前与目的地的Socket取得一个连接。一旦连接建立了,Socket就可以使用一个流接口进行打开、读、写、关闭操作。所有发送的信息都会在另一端以同样的顺序被接收。面向连接的操作比无连接的操作效率更低,但是数据的安全性更高。

12.2Socket程序

在Java中面向连接的类有两种形式:客户端和服务器端。下面讨论服务器端。

下面建立服务器端程序,此服务器端程序只用于向客户端输出“helloworld!”字符串。

【例12-1】

HelloServer.java。图12-1HelloServer运行结果程序说明:

(1)第7行声明了一个ServerSocket的对象。

(2)第8行声明了一个PrintWriter的对象,用于向客户端打印输出。

(3)第9行~第18行实例化ServerSocket对象,在9999端口进行监听。

(4)第19行声明了一个Socket对象clientsocket,此对象用于接收客户端的Socket连接。

(5)第20行~29行通过ServerSocket类中的accept()方法,接收客户端的Socket请求,此方法返回一个客户端的Socket请求。

(6)第30行通过客户端的Socket对象去实例化PrintWriter对象,此时out对象就具备了向客户端打印信息的能力。

(7)第31行调用println()方法,将信息打印至客户端。

(8)第32行关闭客户端Socket连接。

(9)第33行关闭服务器端Socket连接。

由运行结果可以发现,执行HelloServer.java之后,程序停在原处不动了,这就表示服务器在等待客户端的连接,下面为程序的客户端程序。

【例12-2】

HelloClient.java。图12-2HelloClient运行结果程序说明:

(1)第7行声明一个Socket的对象hellosocket。

(2)第8行声明一个BufferedReader的对象in,此对象用于读取服务器端发送过来的信息。

(3)第12行实例化hellosocket对象,此连接在本机的9999端口上监听。

(4)第13行通过hellosocket对象实例化BufferedReader对象。

(5)第25行等待服务器端发送过来的信息并打印。

(6)第26行关闭BufferedReader。

(7)第27行关闭Socket对象。下面再来看一个Socket的经典范例——Echo程序,读者可自行分析。

【例12-3】Echo服务器端程序EchoServer.java。

图12-3Echo程序运行结果运行上面的程序可以看出,无论客户端输入什么,服务器端都会对数据进行回应,输入“bye”之后程序会退出。但读者可能会发现,此程序只能允许一个客户端进行操作,即其他客户端程序无法再进行Socket连接,那么该如何去解决这个问题呢?只要在服务器端实现多线程,则服务器可以同时处理多个客户端请求,下面的代码是改进后的EchoServer程序。

【例12-5】EchoMultiServerThread.java。

12.3DatagramSocket程序

使用流套接字的每个连接均要花费一定的时间,要减少这种开销,网络API提供了第二种套接字—自寻址套接字(datagramsocket)。自寻址使用UDP发送寻址信息(从客户程序到服务程序或从服务程序到客户程序),不同的是可以通过自寻址套接字发送多IP信息包,自寻址信息包含在自寻址包中,此外自寻址包又包含在IP包内,这就将寻址信息长度限制在60000字节内。图12-4显示了位于IP包内的自寻址包的自寻址信息。图12-4IP包内的自寻址包的自寻址信息与TCP保证信息到达信息目的地的方式不同,UDP提供了另外一种方法,如果自寻址信息包没有到达目的地,那么UDP也不会请求发送者重新发送自寻址包,这是因为UDP在每一个自寻址包中包含了错误检测信息,在每个自寻址包到达目的地之后UDP只进行简单的错误检查,如果检测失败,UDP将抛弃这个自寻址包,也不会从发送者那里重新请求替代者。这与通过邮局发送信件相似,发信人在发信之前不需要与收信人建立连接,同样也不能保证信件能到达收信人那里。自寻址套接字工作常用的类包括下面两个:DatagramPacket和DatagramSocket。DatagramPacket对象描绘了自寻址包的地址信息,DatagramSocket表示客户程序和服务程序自寻址套接字。这两个类均位于包内。

1.DatagramPacket类

在使用自寻址包之前,需要首先熟悉DatagramPacket类,地址信息和自寻址包以字节数组的方式同时压缩入这个类创建的对象中。DatagramPacket有数个构造方法,尽管这些构造方法的形式不同,但通常情况下它们都有两个共同的参数:buffer和length。buffer参数包含了一个对保存自寻址数据包信息的字节数组的引用,length表示字节数组的长度。最简单的构造方法是DatagramPacket(byte[]buffer,intlength),这个构造方法确定了自寻址数据包数组和数组的长度,但没有任何自寻址数据包的地址和端口信息,这些信息可以通过调用方法setAddress(InetAddressaddr)和setPort(intport)添加。

2.DatagramSocket类

DatagramSocket类在客户端创建自寻址套接字与服务器端进行通信连接,并发送和接收自寻址套接字。虽然有多个构造方法可供选择,但创建客户端自寻址套接字最便利的选择是DatagramSocket()方法,而服务器端则是DatagramSocket(intport)方法。如果未能创建自寻址套接字或绑定自寻址套接字到本地端口,那么这两个方法都将抛出一个SocketException对象。一旦程序创建了DatagramSocket对象,那么程序分别调用send(DatagramPacketdgp)和receive(DatagramPacketdgp)来发送和接收自寻址数据包。

【例12-7】UdpReceive.java。运行结果如图12-5所示。图12-5UDP程序运行结果

UDP数据的发送类似于发送寻呼,发送者将数据发送出去就不管了,是不可靠的,有可能在发送的过程中发生

温馨提示

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

评论

0/150

提交评论