您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 电子教案--第11章
第11章Java中的网络编程本章导读1.URL类2.读取URL中的资源3.显示URL资源中的HTML文件4.处理超链接5.InetAddress类6.套接字Socket7.使用多线程处理套接字连接8.UDP数据报9.广播数据包11.1URL类java.net包中的URL类是对统一资源定位符(UniformResourceLocator)的抽象,使用URL创建对象的应用程序称作客户端程序,一个URL对象存放着一个具体的资源的引用,表明客户要访问这个URL中的资源,利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息:协议、地址、资源。协议必须是URL对象所在的Java虚拟机支持的协议,许多协议并不为我们所常用,而常用的Http、Ftp、file协议都是虚拟机支持的协议;地址必须是能连接的有效IP地址或域名;资源可以是主机上的任何一个文件。1.URL的构造方法publicURL(Stringspec)throwsMalformedURLException该构造方法使用字符串初始化一个URL对象,例如try{url=newURL();}catch(MalformedURLExceptione){System.out.println(BadURL:+url);}该URL对象使用的协议是“Http”协议,即用户按着这种协议和指定的服务器通信,该URL对象包含的地址是“yahoo.com.cn”,所包含的资源是默认的资源(主页)。publicURL(Stringprotocol,Stringhost,Stringfile)throwsMalformedURLException该构造方法构造的URL对象的协议、地址和资源分别由参数protocol、host和file指定返回11.2读取URL中的资源URL对象调用InputStreamopenStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。下面的例子1在一个文本框中输入网址,然后点击确定按钮读取服务器上的资源,由于网络速度或其它的因素,URL资源的读取可能会引起堵塞,因此,程序需在一个线程中读取URL资源,以免堵塞主线程。返回11.3显示URL资源中的html文件在上面的例子1中,我们可以将的主页的内容显示在文本区中,但是,有时候我们想看到网页的运行效果。Javax.swing包中的JEditorPane类可以解释执行html文件,也就是说,如果你把html文件读入到JEditorPane,该html文件就会被解释执行,显示在JEditorPane中,这样程序就看到了网页的运行效果。可以使用JEditorPane类的构造方法:publicJEditorPane()publicJEditorPane(URLinitialPage)throwsIOExceptionpublicJEditorPane(Stringurl)throwsIOException构造JEditorPane对象,后两个构造方法使用参数initialPage或url指定该对象最初显示的URL中的资源。JEditorPane对象调用publicvoidsetPage(URLpage)throwsIOException法可以显示新的URL中的资源。在下面的例子2中,我们用JEditorPane对象显示网页。返回11.4处理超链接当JEditorPane对象调用setEditable方法将编辑属性设为false时,不仅可以显示网页的运行效果,而且用户如果单击网页中超链接还可以使得JEditorPane对象触发HyperlinkEvent事件。程序可以通过处理HyperlinkEvent事件,来显示新的URL资源。JEditorPane对象调用addHyperlinkListener(HyperlinkListenerlistener)获得监视器。监视器需实现HyperlinkListener接口,该接口中的方法是:voidhyperlinkUpdate(HyperlinkEvente)在下面的例子中,当单击超链接时,JEditorPane对象将显示超链接所链接的网页。返回11.5InetAdress类我们已经知道Internet上的主机有两种方式表示地址:(1)域名例如,(2)IP地址例如,202.108.35.210java.net包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址:。域名容易记忆,当你在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样我们才能和主机建立连接。1.获取Internet上主机的地址我们可以使用InetAddress类的静态方法:getByName(Strings);将一个域名或IP地址传递给该方法的参数s,获得一个InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示它包含的信息:下面的例子4分别获取域名是地址,同时获取了IP地址是166.111.222.3的主机域名及IP地址。当你运行上述程序时应保证你已经连接到Internet(通过拨号或局域网连接到Internet上)。上述程序的运行结果:另外,InetAddress类中含有两个实例方法:publicStringgetHostName()取InetAddress对象所含的域名。publicStringgetHostAddress()获取InetAddress对象所含的IP地址。2.获取本地机的地址我们可以使用InetAddress类的静态方法:getLocalHost();获得一个InetAddress对象,该对象含有本地机的域名和IP地址。返回11.6套接字SocketIP地址标识Internet上的计算机,端口号标识正在计算机上运行的进程(程序)。端口号与IP地址的组合得出一个网络套接字。端口号被规定为一个16位的整数0~65535。其中,0~1023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。除非我们需要访问这些特定服务,否则,就应该使用1024~65535这些端口中的某一个进行通信,以免发生端口冲突。1.套接字连接所谓套接字连接就是客户端的套接字对象和服务器端的套接字对象通过输入、输出流连接在一起,现在我们分三个步骤来说明套接字连接的基本模式。(1)服务器建立ServerSocket对象ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象。ServerSocket的构造方法是:ServerSocket(intport)当建立服务器套接字时可能发生IOException异常,因此要象下面那样建立接收客户的服务器套接字。try{ServerSocketwaitSocketConnection=newServerSocket(1880);}catch(IOExceptione){}当服务器的ServerSocket对象waitSocketConnection建立后,就可以使用方法accept()接受客户的套接字连接请求,代码如下所示:waitSocketConnection.accept();接收客户的套接字也可能发生IOException异常,因此要象下面那样建立接受客户的套接字。try{SocketsocketAtServer=waitSocketConnection.accept();}catch(IOExceptione){}所谓“接收”客户的套接字请求,就是accept()方法会返回一个Socket对象:socketAtServer,称作服务器端的套接字对象。SocketsocketAtServer=waitSocketConnection.accept();System.out.println(“ok”)}catch(IOExceptione){}(2)客户端创建Socke对象。客户端程序可以使用Socket类创建对象,Socket的构方法是:Socket(Stringhost,intport)参数host是服务器的IP地址,port是一个端口号。也可以使用Socket类不带参数的构造方法publicSocket()创建一个套接字对象,该对象不请求任何连接。该对象再调用publicvoidconnect(SocketAddressendpoint)throwsIOException请求和参数SocketAddress指定地址的套接字建立连接。为了使用connect方法,可以使用SocketAddress的子类:InetSocketAddress创建一个对象,InetSocketAddress的构造方法是:publicInetSocketAddress(InetAddressaddr,intport)创建Socket对象可能发生IOException异常,因此要象下面那样建立到服务器的套接字连接try{SocketsocketAtClient=newSocket(“”,1880);}catch(IOExceptione){}客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求,如果服务器端相应的端口上有ServerSocket对象正在使用accept方法等待客户,那么双方的套接字对象socketAtClient和socketAtServer就都诞生了。(3)流连接客户端和服务器端的套接字对象诞生以后,还必须进行输入、输出流的连接。服务器端的这个Socket对象socketAtServer使用方法getOutputStream()获得的输出流将指向客户端Socket对象socketAtClient使用方法getInputStream()获得的那个输入流;同样,服务器端的这个Socket对象ocketAtServer使用方法getInputStream()获得的输入流将指向客户端Socket对象socketAtClient使用方法getOutputStream()获得的那个输出流。因此,当服务器向这个输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。图11.3套接字连接示意图客户端Socket输入流输出流服务器端Socket输出流输入流连接连接连接建立后,服务器端的套接字对象调用getInetAddress()方法可以获取一个InetAddess对象,该对象含有客户端的IP地址和域名,同样,客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddess对象,该对象含有服务器端的IP地址和域名。套接字调用close()可以关闭双方的套接字连接,只要一方关闭连接,就会导致对方发生IOException异常。下面我们通过一个简单的例子说明上面讲的概念。在例子5中,客户端向服务器发出ASCII表的顺序值:1~127;服务器接受这些数据,并将顺序值对应的字符返回给客户。你首先将例子5中服务器端的Server.java编译通过,并运行起来,等待客户请求连接。然后运行客户端程序。返回11.7使用多线程处理套接字连接套接字连接中涉及到输入流和输出流操作,客户或服务器读取数据可能会引起堵塞,我们应把读取数据放在一个单独的线程中去进行。另外,服务器端收到一个客
本文标题:电子教案--第11章
链接地址:https://www.777doc.com/doc-2253571 .html