面向对象的程序设计-Java第三版第15章课件

PPT
  • 阅读 49 次
  • 下载 0 次
  • 页数 71 页
  • 大小 1.088 MB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
面向对象的程序设计-Java第三版第15章课件
可在后台配置第一页与第二页中间广告代码
面向对象的程序设计-Java第三版第15章课件
可在后台配置第二页与第三页中间广告代码
面向对象的程序设计-Java第三版第15章课件
可在后台配置第三页与第四页中间广告代码
面向对象的程序设计-Java第三版第15章课件
面向对象的程序设计-Java第三版第15章课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 71
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】面向对象的程序设计-Java第三版第15章课件.ppt,共(71)页,1.088 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44868.html

以下为本文档部分文字说明:

第15章网络编程第15章网络编程15.1URL通信15.2Socket通信15.3UDP通信第15章网络编程15.1URL通信URL(UniformResourceLocator,统一资源定位器)表示Internet/Intranet上的资源位置。

这些资源可以是一个文件、一个目录或一个对象。当我们使用浏览器浏览网络上的资源时,首先需要键入URL地址,才可以访问相应的主页。例如:http://www.xahu.edu.cn:80/index.htmlhttp://www.hotmail.com/index.htmlfile:///c:/ABC

/xx.java每个完整的URL由四部分组成,这四部分的划分及其含义如表15.1中所示。第15章网络编程表15.1URL地址的组成示例含义http传输协议www.xahu.edu.cn主机名或主机地址80通信端口号

index.html文件名称第15章网络编程一般的通信协议都已经规定好了开始联络时的通信端口,例如,HTTP协议的缺省端口号是80,FTP协议的缺省端口号是21等。URL使用协议的缺省端口号时,可以不写出缺省端口号。所以,一般的URL地址只包含传输协议、

主机名和文件名就足够了。网络通信中,我们常常会碰到地址(Address)和端口(Port)的问题。两个程序之间只有在地址和端口方面都达成一致时,才能建立连接。这与我们寄信要有地址、打电话要有电话号码一样。两个远方程序建立连接时,首先

需要知道对方的地址或主机名,其次是端口号。地址主要用来区分计算机第15章网络编程网络中的各个计算机,而端口的定义可以理解为扩展的号码,具备一个地址的计算机可以通过不同的端口来与其他计算机进行通信。在TCP协议中,端口

被规定为一个在0~65535之间的16位的整数。其中,0~1023被预先定义的服务通信占用(如FTP协议的端口号是21,HTTP协议的端口号为80等)。除非我们需要访问这些特定服务,否则就应该使用1024~655

35这些端口中的某一个来进行通信,以免发生端口的冲突。第15章网络编程15.1.1URL类要使用URL进行网络编程,就必须创建URL对象。创建URL对象要使用java.net软件包中提供的java.net.URL类的构造方法。1.创建URL对象URL类提供的

用于创建URL对象的构造方法有4个:(1)URL(Stringspec)方法。根据String表示形式创建URL对象。例如:URLfile=newURL("http://www.xahu.edu.cn/index.

html");这种以完整的URL创建的URL对象称为绝对URL,该对象包含了访问该URL所需要的全部信息。第15章网络编程(2)URL(Stringprotocol,Stringhost,Stringfile)方法。根据指定的protocol、host

、port号和file创建URL对象。其中的protocol为协议名,host为主机名,file为文件名,端口号使用缺省值。例如:"http","www.xahu.edu.cn","index.html"(3)URL(Stringp

rotocol,Stringhost,Stringport,Stringfile)方法。这个构造方法与构造方法(2)相比,增加了1个指定端口号的参数。第15章网络编程(4)URL(URLcontext,Stringspec)方

法。通过在指定的上下文中用指定的处理程序对给定的spec进行解析来创建URL。例如:URLbase=newURL("file:///c:/ABC/xx.java");URLgk=newURL(base

,"gg.txt");中的URL对象gk是相对URL对象。javac在使用对象gk时会从对象base中查出文件gg.txt所在的位置:本地主机是c:/ABC/。对象gk指明的资源也就是file:///c:/ABC/gg.txt。如果在程序中不访问xx.java,那么在创建base的构造方

法中则略去xx.java。创建gg的方法不变,gg指明的资源仍不变。第15章网络编程2.URL类的常用成员方法创建URL对象后,可以使用java.net.URL类的成员方法对创建的对象进行处理。java.net.URL的常用成员方法如表15.2所示。第15章网络编程表15.2URL类的常用成员方

法成员方法说明intgetPort()获取URL的端口号StringgetProtocol()获取URL的协议名StringgetHost()获取URL的主机名StringgetFile()获取URL的文件名booleanequa

ls(Objectobj)与指定的URL对象obj进行比较stringtoString()将此URL对象转换成字符串形式第15章网络编程15.1.2利用URL类访问网上资源示例程序【示例程序C15_1.java】获取某个URL地址的协议名、

主机名、端口号和文件名。packagech15;importjava.net.MalformedURLException;importjava.net.URL;publicclassC15_1{publicstaticvoidmain(Stringargs[])第15章

网络编程{URLMyURL=null;try{MyURL=newURL("http://netbeans.org/kb/docs/java/quickstart.html");}catch(MalformedUR

LExceptione){System.out.println("MalformedURLException:"+e);}System.out.println("URLString:"+MyURL.toString());

//获取URL对象转换成字符串System.out.println("Protocol:"+MyURL.getProtocol());//获取协议名第15章网络编程System.out.println(“Host:”+MyURL.getHost())

;//获取主机名System.out.println(“Port:”+MyURL.getPort());//获取端口号System.out.println(“File:”+MyURL.getFile(

));//获取文件名}}该程序的运行结果如图15.1右下窗口所示。第15章网络编程图15.1程序C15_1的运行结果第15章网络编程【示例程序C15_2.java】使用URL类的openStream()成员方法获取URL指定的网上信息。pac

kagech15;importjava.io.*;importjava.net.MalformedURLException;importjava.net.URL;publicclassC15_2{publicstaticvoidmain(String[

]args){StringStr;InputStreamst1;第15章网络编程//Stringur="http://netbeans.org/kb/docs/java/quickstart.html";//获取远程网上的信息Stringur="file:///E:/Java/ch15/src/

ch15/C15_1.java";//获取本地网上的信息try{URLMyURL=newURL(ur);st1=MyURL.openStream();InputStreamReaderins=newInputStreamReader(s

t1);BufferedReaderin=newBufferedReader(ins);while((Str=in.readLine())!=null)//从URL处获取信息并显示{System.out.println(Str);}}第15章网络编程ca

tch(MalformedURLExceptione)//创建URL对象可能产生的异常{System.out.println("Can'tgetURL:");}catch(IOExceptione){System.out.printl

n("ErrorinI/O:"+e.getMessage());}}}由于URL的openStream()成员方法返回的是InputStream类的对象,因此只能通过read()方法逐个字节地去读URL地址处的资源信息。这里利用BufferedReader对原始信息流进行了包装和处理,以提高I/O

效率。运行的结果是显示出C15_1.java程序的内容。第15章网络编程15.1.3使用URLConnection类访问网上资源上面介绍的方法只能读取远程计算机节点的信息,如果希望在读取远程计算机节点的信息时还可向它写入信息,则需要使用java.net软件包中的另一个类URL

Connection。1.创建URLConnection类的对象要创建URLConnection对象必须先创建一个URL对象,然后调用该对象的openConnection()方法就可以返回一个对应其URL地址的URLConnection对象。例如:URLMyU

RL=newURL("http://www.xahu.edu.cn/index.html");URLConnectioncon=MyURL.openConnection();第15章网络编程2.建立输入/输出数据流读取或写入远程计算机节点的信息时,要建立输

入或输出数据流。我们可以利用URLConnection类的成员方法getInputStream()和getOutputStream()来获取输入和输出数据流。例如,下面的两行语句用于建立输入数据流:InputStreamReaderins=newInputStr

eamReader(con.getInputStream());BufferedReaderin=newBufferedReader(ins);下面的语句行用于建立输出数据流:PrintStreamout=newPrintStream(con.ge

tOutputStream());第15章网络编程3.读取远程计算机节点的信息或向其写入信息要读取远程计算机节点的信息,可调用in.readLine()方法;向远程计算机节点写入信息时,可调用out.println(参数)方

法。URLConnection类是一个抽象类,它是代表程序与URL对象之间建立通信连接的所有类的超类,此类的一个实例可以用来读/写URL对象所代表的资源。出于安全性的考虑,Java程序只能对特定的URL进行写操作,这种URL就是服务器上的CGI(CommonGatewayInterface,公

共网关接口)程序。CGI是客户端浏览器与服务器进行通信的接口。下面通过一个例子来说明URLConnection类是如何使用的。第15章网络编程【示例程序C15_3.java】使用URLConnection类从远程主机获取信息。packagech15;importjava.io.*;impo

rtjava.net.*;classC15_3{publicstaticvoidmain(String[]args){try{Stringur=“http://www.chd.edu.cn”;//获取远程网上的信息//Stringur="file:///E:/Java/ch

15/src/ch15/C15_1.java";//获取本地网上的信息第15章网络编程URLMyURL=newURL(ur);Stringstr;URLConnectioncon=MyURL.openCon

nection();InputStreamReaderins=newInputStreamReader(con.getInputStream());BufferedReaderin=newBufferedReader(ins);while((str=in.read

Line())!=null){System.out.println(str);}in.close();}catch(MalformedURLExceptionmfURLe){System.out.println("MalformedURLExcep

tion:"+mfURLe);}第15章网络编程catch(IOExceptionioe){System.out.println(“IOException:”+ioe);}}}该程序的运行结果如图15.2所示。第15章网络编程图15.2程序C15_3的运行

结果第15章网络编程15.2Socket通信Socket套接字是应用于网络通信中的重要机制。Socket最初是加利福尼亚大学Berkeley分校为UNIX操作系统开发的网络通信接口。随着UNIX操作系统的

广泛使用,套接字成为当前最流行的网络通信应用程序接口之一。Java语言中采用的Socket通信是一种流式套接字通信,它采用TCP协议,通过提供面向连接的服务,实现客户/服务器之间双向、可靠的通信。java.net包中的Socket类与ServerSocket类为流式套接字通信方式提供了充分的支持

。第15章网络编程15.2.1Socket的概念及通信机制1.Socket的概念Socket称为“套接字”,也有人称为“插座”。在两台计算机上运行的两个程序之间有一个双向通信的链接点,而这个双向链路的每一端就称为一个Socket。第15章网络编程建立连接的两个程序分别称为

客户端(Client)和服务器端(Server)。客户端程序申请连接,而服务器端程序监听所有的端口,判断是否有客户程序的服务请求。当客户程序请求和某个端口连接时,服务器程序就将“套接字”连接到该端口上,此时,服务器与客户程序就建立了一个专用的虚拟连接。客户程序可以向套接字写入请求,服务器程

序处理请求并把处理结果通过套接字送回。通信结束时,再将所建的虚拟连接拆除。一个客户程序只能连接服务器的一个端口,而一个服务器可以有若干个端口,不同的端口使用不同的端口号,并提供不同的服务。第15章网络编程2.Socket通信机制利用Socket进行网络通信分为三个步骤:(1

)建立Socket连接。在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接通道。(2)数据通信。利用虚拟连接通道传送数据信息进行通信。(3)关闭。通信结束时将所建的虚拟连接拆除。利用java.net包中提供的Socket类

和ServerSocket类及其方法,可完成上述操作。Socket通信机制如图15.3所示。第15章网络编程图15.3Socket通信机制第15章网络编程从图15.3中可以看到,服务器端的程序首先选择一个端口(port)注册,然后调用accept()方

法对此端口进行监听,等待其他程序的连接申请。如果客户端的程序申请和此端口连接,那么服务器端就利用accept()方法来取得这个连接的Socket。客户端的程序建立Socket时必须指定服务器的地址(host)和通信的端口号(port#),这个端口号必须与

服务器端监听的端口号保持一致。第15章网络编程15.2.2Socket类与ServerSocket类java.net中提供了两个类,即ServerSocket类和Socket类,它们分别用于服务器端和客户端的Socket通信,进行网络通信的方法也都封装在这两个类中。1.Se

rverSocket对象与Socket对象的构造方法Java在软件包java.net中提供了ServerSocket类和Socket类对应的双向链接的服务器端和客户端,包含的主要构造方法如表15.3所示。第15章网络编程表15.3ServerSocket类与

Socket类的构造方法构造方法功能ServerSocket(intport)在指定的端口创建一个服务器Socket对象ServerSocket(intport,intbacklog)利用指定的backlog创建服务器套接字并将其绑定到指定的本地端

口号Socket(InetAddressaddress,intport)创建一个流套接字并将其连接到指定IP地址的指定端口号Socket(Stringhost,intport)创建一个流套接字并将其连接到指定主机上的指定端口号第15章网络编程2.异常处

理在建立Socket对象的同时要进行异常处理,以便程序出错时能够及时做出响应。(1)服务器端:在建立ServerSocket类的对象和取得Socket类的对象时都要进行异常处理,例如下面语句中的try-catch语句。ServerSock

etserver;Socketsocket;try{server=newServerSocket(3561);}catch(Exceptione){System.out.println(“Erroroccurred:”+e);}try{socket=server.accept();}catch(E

xceptione){System.out.println("Erroroccurred:"+e);}第15章网络编程(2)客户端:在建立Socket类的对象时要进行异常处理,例如下面的try-catch语句。Socketsocket;try{socket=newSocket(

“ServerName”,3561);}catch(Exceptione){System.out.println("Erroroccurred:"+e);}第15章网络编程3.获取输入/输出流建立Socket连接

后,就可以利用Socket类的两个方法getInputStream()和getOutputStream()分别获得向Socket类的对象读/写数据的输入/输出流。此时同样要进行异常处理,因此,通常将读/写数据的输入/输出流语句写在try-catch块中。例如:try{I

nputStreamins=socket.getInputStream();OutputStreamouts=socket.getOutputStream();}catch(Exceptione){System.out.println(“Erroroccurred:”+e);}第15章网络编

程4.读/写数据流获取Socket类的对象的输入/输出流后,为了便于进行读/写,需要在这两个流对象的基础上建立易于操作的数据流对象,如InputStreamReader类、OutputStreamReader类或Prin

tStream类的对象。建立数据流的对象可采用如下语句:InputStreamReaderin=newInputStreamReader(ins);BufferedReaderinn=newBufferedReader(in);OutputStreamReaderout=newIn

putStreamReader(outs);PrintStreamout=newPrintStream(outs);第15章网络编程要读入一个字符串并将其长度写入输出流中,可以使用如下语句:Stringstr=inn.readLine();Out.println(str.len

gth());5.断开连接无论是编写服务器程序还是客户端程序,通信结束时,必须断开连接并释放所占用的资源。Java提供了close()方法来断开连接。(1)关闭Socket对象:socket.close()

。(2)关闭ServerSocket对象:server.close()。第15章网络编程15.2.3流式Socket通信的示例程序综合前面介绍的内容,这里给出几个示例程序作为总结。【示例程序C15_4.java】利用Inet

Address类的对象来获取计算机主机信息。packagech15;importjava.net.InetAddress;importjava.net.UnknownHostException;publicclassC15_4{publicstaticvoidm

ain(Stringargs[])第15章网络编程{try{if(args.length==1){//调用InetAddress类的静态方法,利用主机名创建对象InetAddressipa=InetAddress.getByName(args[0]);System.out.pri

ntln("Hostname:"+ipa.getHostName());//获取主机名System.out.println("HostIPAddress:"+ipa.toString());//获取IP地址Syst

em.out.println("LocalHost:"+InetAddress.getLocalHost());}elseSystem.out.println("输入一个主机名");}第15章网络编程catch(Unkn

ownHostExceptione)//创建InetAddress对象可能发生的异常{System.out.println(e.toString());}}//endofmain()}运行时先在“ch15项目

属性”对话框的“主类”后的文本框中输入“ch15.C15_4”,在“参数”后的文本框中输入“localhost”。然后,选择菜单栏中的“运行”→“设置主项目”→“ch15”,再单击菜单栏中的“运行”→“清理并生成主项目”。最后,单击菜单栏中的“运行”→“运行

主项目”。程序运行后就会输出如下的运行结果:第15章网络编程Hostname:localhostHostIPAddress:localhost/127.0.0.1LocalHost:EKKIVWZMWR79BJH/192.168.1.100下面的示

例程序C15_5.java和C15_6.java是一个完整的实现Socket通信的Java程序,分别为服务器端程序和客户端程序。在这个Socket通信程序中,服务器等待与客户端连接。当连接建立后,客户端向服务器端发送一条信息,服务器端收到后再向客户端发送一条信息。若客户

端发送end结束消息传递,服务器端同意,则客户端拆除与服务器端的连接。第15章网络编程【示例程序C15_5.java】Socket通信的服务器端程序。packagech15;//Socke服务器端程序importjav

a.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassC15_5{publicstaticfinalintport=8000;publicstaticvoidmain(S

tringargs[])第15章网络编程{Stringstr;try{//在端口port注册服务ServerSocketserver=newServerSocket(port);//创建当前线程的监听对象System.out.println("Started:"+server);Soc

ketsocket=server.accept();//负责C/S通信的Socket对象System.out.println("Socket:"+socket);//获得对应Socket的输入/输出流InputStreamfIn=socket.getInputStream

();OutputStreamfOut=socket.getOutputStream();//建立数据流第15章网络编程InputStreamReaderisr=newInputStreamReader(fIn);BufferedReaderin=ne

wBufferedReader(isr);PrintStreamout=newPrintStream(fOut);InputStreamReaderuserisr=newInputStreamReader(Sy

stem.in);BufferedReaderuserin=newBufferedReader(userisr);while(true){System.out.println("等待客户端的消息…");str=in.readLine();//

读客户端传送的字符串System.out.println("客户端:"+str);//显示字符串if(str.equals("end"))break;//如果是end,则退出System.out.pr

int("给客户端发送:");第15章网络编程str=userin.readLine();out.println(str);//向客户端发送消息if(str.equals("end"))break;}//whilesocket.close();server.cl

ose();}//trycatch(Exceptione){System.out.println("异常:"+e);}}}第15章网络编程【示例程序C15_6.java】Socket通信的客户端程序。packagech15;//Socket客户端程序

importjava.io.*;importjava.net.InetAddress;importjava.net.Socket;publicclassC15_6{publicstaticvoidmain(String[]a

rgs){Stringstr;第15章网络编程try{InetAddressaddr=InetAddress.getByName("127.0.0.1");//InetAddressaddr=InetAddress.getByName("19

8.198.1.68");Socketsocket=newSocket(addr,8000);System.out.println("Socket:"+socket);//获得对应socket的输入/输

出流InputStreamfIn=socket.getInputStream();OutputStreamfOut=socket.getOutputStream();//建立数据流InputStreamReaderisr=newInputStreamR

eader(fIn);BufferedReaderin=newBufferedReader(isr);PrintStreamout=newPrintStream(fOut);InputStreamReaderuserisr=newInputStreamReader(Sys

tem.in);第15章网络编程BufferedReaderuserin=newBufferedReader(userisr);while(true){System.out.print("发送字符串:");str=userin.readLine();//读取用户输入

的字符串out.println(str);//将字符串传给服务器端if(str.equals("end"))break;//如果是end,就退出System.out.println("等待服务器端消息…");str=in.readLine();//获取服务器发送的字符串System.

out.println("服务器端字符:"+str);if(str.equals("end"))break;}第15章网络编程socket.close();//关闭连接}catch(Exceptione){System.out.println(“异常:”+e);}}}服务器端程序

的运行情况如图15.4所示,客户端程序的运行情况如图15.5所示。第15章网络编程图15.4服务器端程序输出窗口(ch15(run))第15章网络编程图15.5客户端程序输出窗口(ch15(#2))第15

章网络编程程序运行时,首先运行服务器程序C15_5.java,然后运行客户端程序C15_6.java建立两端的连接。输出窗口有两个,如图15.4和图15.5所示。先在客户端输出窗口给服务器发送信息,例如“Howdoyoudo!”,

单击服务器窗口,当看到服务器收到信息并输出后,再给客户端发信息,例如“Find,thanks.”,客户端收到信息并输出后,再给服务器发送信息,直到客户端给服务器发“end”则结束通信。第15章网络编程1

5.2.4URL通信与Socket通信的区别URL通信与Socket通信都是面向连接的通信,它们的区别在于:Socket通信方式为主动等待客户端的服务请求方式,而URL通信方式为被动等待客户端的服务请求方式。利用Socket进行通信时,在服务器端运行

了一个Socket通信程序,不停地监听客户端的连接请求,当接到客户端请求后,马上建立连接并进行通信。利用URL进行通信时,在服务器端常驻有一个CGI程序,但它一直处于睡眠状态,只有当客户端的连接请求到达时它才被唤醒,然后建立连接并进行通信。第15章网络编程在Socket通信方式中,服务器端的

程序可以打开多个线程与多个客户端进行通信,并且还可以通过服务器使各个客户端之间进行通信,这种方式适合于一些较复杂的通信。而在URL通信方式中,服务器端的程序只能与一个客户进行通信,这种方式比较适合于B/S通信模式。第15章网络编程15.3UDP通信URL和Socket通信是一种面向连接的流式套接字

通信,采用的协议是TCP协议。在面向连接的通信中,通信的双方需要首先建立连接再进行通信,这需要占用资源与时间。但是在建立连接之后,双方就可以准确、同步、可靠地进行通信了。流式套接字通信在建立连接之后,可以通过流来进行大量的数据交换。TCP通信被广泛应用在文件传输、远程连接等需要可靠传输数据

的领域。第15章网络编程UDP通信是一种无连接的数据报通信,采用的协议是数据报通信协议UDP(UserDatagramProtocol)。按照这个协议,两个程序进行通信时不用建立连接;数据以独立的包为单位

发送,包的容量不能太大;每个数据报需要有完整的收/发地址,可以随时进行收/发数据报,但不保证传送顺序和内容准确;数据报可能会被丢失、延误等。因此,UDP通信是不可靠的通信。由于UDP通信速度较快,因此常常被应用在某些要求实时交互,准确性要求不高,但传输速度要求

较高的场合。java.net软件包中的类DatagramSocket和类DatagramPacket为实现UDP通信提供了支持。第15章网络编程15.3.1UDP通信机制利用UDP通信时,服务器端和客户端的通信过程如图15.6所示。服务器端的程序有一个线程不停地

监听客户端发来的数据报,等待客户的请求。服务器只有通过客户发来的数据报中的信息才能得到客户端的地址及端口。第15章网络编程图15.6UDP通信机制第15章网络编程15.3.2DatagramSocket类DatagramSocket

类用于收/发数据报。其构造方法如下:(1)DatagramSocket()方法。(2)DatagramSocket(intport)方法。(3)DatagramSocket(intport,InetAddressiaddr)方法。其中,第一个构造方法将Socket连

接到本机的任何一个可用的端口上;第二个将Socket连接到本机的port端口上;第三个则将Socket连接到指定地址的port端口上。这里需要注意两点:一是规定端口时不要发生冲突;二是在调用构造方法时要进行异常处理。第15章网络编程receive()和send()是Datag

ramSocket类中用来实现数据报传送和接收的两个重要成员方法,其格式如下:(1)voidreceive(DatagramPacketpacket)方法。(2)voidsend(DatagramPack

etpacket)方法。receive()方法将使程序中的线程一直处于阻塞状态,直到从当前Socket中接收到信息后,将收到的信息存储在receive()方法的参数packet的对象中。由于数据报是不可靠的通信,因此receive()方法不一定能读

到数据。为防止线程死掉,应该设置超时参数(timeout)。send()方法将DatagramPacket类的packet的对象中包含的数据报文发送到所指定的IP地址主机的指定端口。第15章网络编程15.3.3DatagramPacket类DatagramPacket类用来实现数据报通信,它的

常用的两个构造方法,分别对应发送数据报和接收数据报:(1)DatagramPacket(bytesBuf[],intsLength,InetAddressiaddr,intiport)方法。这个构造方法用来创建发送数据报

对象。其中,sBuf代表发送数据报的字节数组;sLength代表发送数据报的长度;iaddr代表发送数据报的目的地址,即接收者的IP地址;iport代表发送数据报的端口号。(2)DatagramPacket(byterBuf[],intrLength)方法。这个构造方法用来创建接收数据报对象

。其中,rBuf代表接收数据报的字节数组;rLength代表接收数据报的长度,即读取的字节数。第15章网络编程15.3.4UDP通信示例程序下面通过建立一个简单的UDP服务器端和一个客户端的程序例子,

讲述UDP的工作方式。在这个例子中,服务器端的程序只是不停地监听本机端口,一旦收到客户端发来的数据报,就回应一个简单的信息通知客户已经收到了数据报。客户端的程序向服务器发送一个包含一个字符串的数据报,同时告知服务器自己的地址及端口,以便服务器做出回应。第

15章网络编程【示例程序C15_7.java】UDP通信的服务器端程序。packagech15;//UDP服务器端程序importjava.net.DatagramPacket;importjava.net.DatagramSock

et;importjava.net.InetAddress;classUDPServerThreadextendsThread{//启动服务器线程的主程序privateDatagramPacketpacket;privateDatagramSocketsocket;s

taticfinalintsport=1777;UDPServerThread()第15章网络编程{try{//将Socket连接到本机的一个可用端口上socket=newDatagramSocket(sport);System.out.printl

n("Listeningonport:"+socket.getLocalPort());}catch(Exceptione){System.out.println("Error:"+e);}}publicvoidrun(){//线程的主要操作if(soc

ket==null)return;while(true){try{InetAddressaddress;intcport;byte[]buf1=newbyte[1000],buf2=newbyte[10

00];第15章网络编程Strings="Yourpacketisreceived";packet=newDatagramPacket(buf1,buf1.length);//生成一个接收数据报socket.receive(packet);//接收数据报Stri

ngs1=newString(packet.getData());System.out.println("Receivedfromclient:"+s1);//打印数据报的内容address=packet.getAddress()

;cport=packet.getPort();//获得数据报的源地址与端口buf2=s.getBytes();packet=newDatagramPacket(buf2,buf2.length,address,cport);//生成发送的数据报第15章网络编程socket.s

end(packet);//发送数据报给客户}catch(Exceptione){System.out.println("Error:"+e);}}}protectedvoidfinalize(){if(socket!=null){socket.close();//关闭SocketSyste

m.out.println("SocketClosed.");}}}第15章网络编程publicclassC15_7{publicstaticvoidmain(String[]args){UDPServerThreadserver=newUDPSer

verThread();server.start();}}第15章网络编程【示例程序C15_8.java】UDP通信的客户端程序。packagech15;//UDP客户端程序importjava.net.Datagr

amPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;classC15_8{publicstaticvoidmain(String[]args){DatagramSocketsocket;//用于发送/接收UD

PDatagramPacketpacket;//用于保存UDP的内容InetAddressaddress;intport;第15章网络编程byte[]buf1=newbyte[1000],buf2=newbyte[1000];Strings="Hello,serv

er!",s2;if(args.length<3){System.out.println("输入本地端口号,服务器名,服务器端口号");System.exit(0);}try{socket=newDatagramSocket(Integer.parseInt

(args[0]));address=InetAddress.getByName(args[1]);port=Integer.parseInt(args[2]);buf1=s.getBytes();packet=newDatag

ramPacket(buf1,buf1.length,address,port);第15章网络编程socket.send(packet);//向服务器发送packetpacket=newDatagramPacket(buf2,buf2.length);//生成接收的

packetsocket.receive(packet);//接收服务器传来的packets2=newString(packet.getData());System.out.println("Receivedfromserver:"+s2);//打印pack

et内容socket.close();//关闭Socket}catch(Exceptione){System.out.println("Error:"+e);}}}第15章网络编程运行时先在“ch15项目属性”对

话框的“主类”后的文本框中输入ch15.C15_8,在“参数”后的文本框中输入“2777”“127.0.0.1”“1777”。然后选择菜单栏中的“运行”→“设置主项目”→“ch15”,再单击菜单栏中的“运行”→“清理并生成主项目”,最

后单击菜单栏中的“运行”→“运行主项目”。服务器端输出窗口的结果如下:Listeningonport:1777Receivedfromclient:Hello,server!客户端输出窗口的结果如下:Receivedfromserver:Yourpacket

isreceived

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?