电子教案--第11章.ppt_第1页
电子教案--第11章.ppt_第2页
电子教案--第11章.ppt_第3页
电子教案--第11章.ppt_第4页
电子教案--第11章.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、第11章 Java 中的网络编程,本章导读 1. URL类 2. 读取URL中的资源 3. 显示URL资源中的HTML文件 4. 处理超链接 5. InetAddress类 6. 套接字Socket 7. 使用多线程处理套接字连接 8. UDP数据报 9. 广播数据包,11.1 URL类,包中的 URL类是对统一资源定位符(Uniform Resource Locator)的抽象,使用URL创建对象的应用程序称作客户端程序,一个URL对象存放着一个具体的资源的引用,表明客户要访问这个URL中的资源,利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息:协议、地址、资源

2、。协议必须是URL对象所在的Java虚拟机支持的协议,许多协议并不为我们所常用,而常用的Http、Ftp、file协议都是虚拟机支持的协议;地址必须是能连接的有效IP地址或域名;资源可以是主机上的任何一个文件。,1URL的构造方法 public URL(String spec) throws MalformedURLException 该构造方法使用字符串初始化一个URL对象,例如 try url=new URL(); catch(MalformedURLException e) System.out.println (Bad URL:+url); ,该URL对象使用的协议是“Http”协议,

3、即用户按着这种协议和指定的服务器通信,该URL对象包含的地址是“”,所包含的资源是默认的资源(主页)。 public URL(String protocol, String host,String file) throws MalformedURLException 该构造方法构造的URL对象的协议、地址和资源分别由参数protocol、host和file指定,返回,11.2 读取URL中的资源,URL对象调用 InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。 下面的例子1在一个文本

4、框中输入网址,然后点击确定按钮读取服务器上的资源,由于网络速度或其它的因素,URL资源的读取可能会引起堵塞,因此,程序需在一个线程中读取URL资源,以免堵塞主线程。,返回,11.3 显示URL资源中的html文件,在上面的例子1中,我们可以将的主页的内容显示在文本区中,但是,有时候我们想看到网页的运行效果。Javax.swing包中的JEditorPane类可以解释执行html文件,也就是说,如果你把html文件读入到JEditorPane,该html文件就会被解释执行,显示在JEditorPane中,这样程序就看到了网页的运行效果。,可以使用JEditorPane类的构造方法: public

5、 JEditorPane() public JEditorPane(URL initialPage) throws IOException public JEditorPane(String url) throws IOException 构造JEditorPane对象,后两个构造方法使用参数initialPage或url指定该对象最初显示的URL中的资源。JEditorPane对象调用 public void setPage(URL page) throws IOException 法可以显示新的URL中的资源。 在下面的例子2中,我们用JEditorPane对象显示网页。,返回,11.4

6、处理超链接,当JEditorPane对象调用setEditable方法将编辑属性设为false时,不仅可以显示网页的运行效果,而且用户如果单击网页中超链接还可以使得JEditorPane对象触发HyperlinkEvent事件。程序可以通过处理HyperlinkEvent事件,来显示新的URL资源。JEditorPane对象调用 addHyperlinkListener(HyperlinkListener listener) 获得监视器。监视器需实现HyperlinkListener接口, 该接口中的方法是:void hyperlinkUpdate(HyperlinkEvent e) 在下面的

7、例子中,当单击超链接时,JEditorPane对象 将显示超链接所链接的网页。,返回,11.5 InetAdress类,我们已经知道Internet上的主机有两种方式表示地址: (1)域名 例如, (2)IP 地址 例如,10 包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址: 域名容易记忆,当你在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样我们才能和主机建立连接。,1获取Internet上主机的地址 我们可以使用InetAddress类的静态方法: getByName(String s); 将一个

8、域名或IP地址传递给该方法的参数s,获得一个 InetAddress对象,该对象含有主机地址的域名和IP地 址,该对象用如下格式表示它包含的信息: 下面的例子4分别获取域名是的主机域名及IP地址,同时获取了IP地址是的主机域名及IP地址。,当你运行上述程序时应保证你已经连接到Internet(通过拨号或局域网连接到Internet上)。上述程序的 运行结果: 另外,InetAddress类中含有两个实例方法: public String getHostName() 取InetAddress对象所 含的域名。 public String getHostAddress()

9、 获取InetAddress对象所含的IP地址。,2获取本地机的地址 我们可以使用InetAddress类的静态方法: getLocalHost(); 获得一个InetAddress对象,该对象含有本地机的域名和IP地址。,返回,11.6 套接字Socket,IP地址标识Internet上的计算机,端口号标识正在计算机上运行的进程(程序)。端口号与IP地址的组合得出一个网络套接字。端口号被规定为一个16位的整数065535。其中,01023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用102465535这些端口中的

10、某一个进行通信,以免发生端口冲突。,1套接字连接 所谓套接字连接就是客户端的套接字对象和服务器端的套接字对象通过输入、输出流连接在一起,现在我们分三个步骤来说明套接字连接的基本模式。 (1)服务器建立ServerSocket对象 ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象。ServerSocket的构造方法是: ServerSocket(int port),当建立服务器套接字时可能发生IOException异常,因此要象下面那样建立接收客户的服务器套接字。 t

11、ry ServerSocket waitSocketConnection=new ServerSocket(1880); catch(IOException e) 当服务器的ServerSocket对象waitSocketConnection建立后,就可以使用方法accept()接受客户的套接字连接请求,代码如下所示: waitSocketConnection.accept();,接收客户的套接字也可能发生IOException异常,因此要象下面那样建立接受客户的套接字。 try Socket socketAtServer= waitSocketConnection.accept(); cat

12、ch(IOException e) 所谓“接收”客户的套接字请求,就是accept()方法会返回一个Socket对象:socketAtServer,称作服务器端的套接字对象。,Socket socketAtServer = waitSocketConnection.accept(); System.out.println(“ok”) catch(IOException e) (2)客户端创建Socke对象。 客户端程序可以使用Socket类创建对象,Socket的构 方法是: Socket(String host,int port) 参数host是服务器的IP地址,port是一个端口号。,也可

13、以使用Socket类不带参数的构造方法 public Socket() 创建一个套接字对象,该对象不请求任何连接。该对象再调用 public void connect(SocketAddress endpoint) throws IOException 请求和参数SocketAddress指定地址的套接字建立连接。为了使用connect方法,可以使用SocketAddress的子类:InetSocketAddress创建一个对象,InetSocketAddress的构造方法是: public InetSocketAddress(InetAddress addr, int port),创建Soc

14、ket对象可能发生IOException异常,因此要象 下面那样建立到服务器的套接字连接 try Socket socketAtClient=new Socket(“8”,1880); catch(IOException e) 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求,如果服务器端相应的端口上有ServerSocket对象正在使用accept方法等待客户,那么双方的套接字对象socketAtClient和socketAtServer就都诞生了。,(3)流连接 客户端和服务器端的套接字对象诞生以后,还必须进 行输入、输出流的

15、连接。 服务器端的这个Socket对象socketAtServer使用方法 getOutputStream() 获得的输出流将指向客户端Socket对象socketAtClient 使用方法 getInputStream() 获得的那个输入流;同样,服务器端的这个Socket对象ocketAtServer使用方法,getInputStream() 获得的输入流将指向客户端Socket对象socketAtClient使用方法 getOutputStream() 获得的那个输出流。因此,当服务器向这个输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。,连接建立后,服务器端的套接字对象调用

16、getInetAddress()方法可以获取一个InetAddess对象,该对象含有客户端的IP地址和域名,同样,客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddess对象,该对象含有服务器端的IP地址和域名。 套接字调用 close()可以关闭双方的套接字连接,只要一方关闭连接,就会导致对方发生IOException异常。 下面我们通过一个简单的例子说明上面讲的概念。,在例子5中,客户端向服务器发出ASCII表的顺序值:1127;服务器接受这些数据,并将顺序值对应的字符返回给客户。你首先将例子5中服务器端的Server.java编译通过,并运行起来,等待客

17、户请求连接。然后运行客户端程序。,返回,11.7 使用多线程处理套接字连接,套接字连接中涉及到输入流和输出流操作,客户或服务器读取数据可能会引起堵塞,我们应把读取数据放在一个单独的线程中去进行。另外,服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程。 我们用学过的组件,设计一个略微复杂的套接字连接。 在下面的例子6中,客户输入一个一元二次方程的系数并发送给服务器,服务器把计算出的方程的实根返回 给客户。因此你可以将计算量大的工作放在服务器端,客户负责计算量小的工作,实现客户-服务器交互计算,来完成某项任务。,返回,11.8 UDP数据报,基于UDP通信的基本模式是 (1)将

18、数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。 (2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。 1发送数据 (1)创建DatagramPacket对象 首先用DatagramPacket类将数据打包,即用DatagramPacket类创建一个对象,称为数据包。,返回,用DatagramPacket的以下两个构造方法创建待发送的数据包: DatagramPacket(byte data ,int length,InetAddtress address,int port) DatagramPack(byte data ,int offset,in

19、t length,InetAddtress address,int port) 使用构造方法创建的数据包对象具有下列两个性质: 含有data数组指定的数据。 该数据包将发送到地址是address、端口号是port的主机上。,我们称address是它的目标地址、port是这个数据包的目标端口号。其中,第2个构造方法创建的数据包对象含有数组data从offset开始指定长度的数据。 例如: byte data =近来好吗.getByte(); InetAddtress address=InetAddtress.getName(); DatagramPacket data_pack=new Data

20、gramPacket(data,data.length, address,980);,(2)发送数据 然后用 DatagramSocket类的不带参数的构造方法:DatagramSocket()创建一个对象,该对象负责发送数据包。例如, DatagramSocket mail_out=new DatagramSocket(); mail_out.send(data_pack);,2接收数据 DatagramSocket类另一个构造方法: DatagramSocket(int port) 创建一个对象,其中的参数必须和待接收的数据包的端口号相同。例如,如果发送方发送的数据包的端口号是5666:

21、DatagramSocket mail_in=new DatagramSocket(5666);,该对象mail_in使用方法 receive(DatagramPacket pack 接受数据包。该方法有一个数据包参数pack,方法receive把收到的数据包传递给该参数。因此我们必须预备一个数据包以便收取数据包。这时需使用 DatagramPack类的另外一个构造方法:DatagramPack(byte data ,int length)创建一个数据包,用于接收数据包,例如: byte data=new byte100;int length=90; DatagramPacket pack=n

22、ew,DatagramPacket(data,length); mail_in.receive(pack); 该数据包pack将接收长度是length的数据放入data。 在下面的例子7中两个主机(可用本地机模拟)互相发送和接收数据包。,返回,11.9 广播数据包,广播数据包类似于电台广播,进行广播的电台需在指定的波段和频率上广播信息,接收者只有将收音机调到指定的波段、频率上才能收听到广播的内容。 广播数据包涉及到地址和端口。我们知道,Internet的地址是a.b.c.d的形式。该地址的一部分代表用户自己主机,而另一部分代表用户所在的网络。当a小于128,那么b.c.d就用来表示主机,这类地

23、址称做A类地址。如果a大于等于128并且小于192,则a.b表示网络地址,而c.d表示主机地址,这类地址称做B类地址。如果a大于等于192,则网络地址是a.b.c,d表示主机地址,这类地址称做C类地址。,与55之间的地址称做D类地址,D类地址并不代表某个特定主机的位置,一个具有A、B或C类地址的主机要广播数据或接收广播,都必须加入到同一个D类地址。一个D类地址也称做一个组播地址,加入到同一个组播地址的主机可以在某个端口上广播信息,也可以在某个端口号上接收信息。 准备广播或接收的主机需经过下列步骤: 11.设置组播地址 使用InetAddress类创建组播组地址,例如: InetAddress group=InetAddress.getByName();,2创建多点广播套接字 使用MulticastSocket类创建一个多点广播套

温馨提示

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

评论

0/150

提交评论