




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章 Java 中的网络编程 本章导读 n1. URL类 n2. 读取URL中的资源 n3. 显示URL资源中的HTML文件 n4. 处理超链接 n5. InetAddress类 n6. 套接字Socket n7. 使用多线程处理套接字连接 n8. UDP数据报 n9. 广播数据包 11.1 URL类 包中的 URL类是对统一资源定位符(Uniform Resource Locator)的抽象,使用URL创建对象的应用 程序称作客户端程序,一个URL对象存放着一个具体 的资源的引用,表明客户要访问这个URL中的资源, 利用URL对象可以获取URL中的资源。一个URL对象通 常包含最基本的三部分信息:协议、地址、资源。协 议必须是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”协议,即用户按着这种 协议和指定的服务器通信,该URL对象包含的地址是 “”,所包含的资源是默认的资源(主页 )。 public URL(String protocol, String host,String file) throws MalformedURLException 该构造方法构造的URL对象的协议、地址和资源分别由 参数protocol、host和file指定 返回 11.2 读取URL中的资源 URL对象调用 InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包 含的资源。通过该输入流可以将服务器上的资源信息 读入到客户端。 下面的例子1在一个文本框中输入网址,然后点击确定 按钮读取服务器上的资源,由于网络速度或其它的因 素,URL资源的读取可能会引起堵塞,因此,程序需 在一个线程中读取URL资源,以免堵塞主线程。 返回 11.3 显示URL资源中的html文件 在上面的例子1中,我们可以将的 主页的内容显示在文本区中,但是,有时候我们想看 到网页的运行效果。Javax.swing包中的JEditorPane类 可以解释执行html文件,也就是说,如果你把html文 件读入到JEditorPane,该html文件就会被解释执行, 显示在JEditorPane中,这样程序就看到了网页的运行 效果。 可以使用JEditorPane类的构造方法: public 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 处理超链接 当JEditorPane对象调用setEditable方法将编辑属性设 为false时,不仅可以显示网页的运行效果,而且用户 如果单击网页中超链接还可以使得JEditorPane对象触 发HyperlinkEvent事件。程序可以通过处理 HyperlinkEvent事件,来显示新的URL资源。 JEditorPane对象调用 addHyperlinkListener(HyperlinkListener listener) 获得监视器。监视器需实现HyperlinkListener接口, 该接口中的方法是:void hyperlinkUpdate(HyperlinkEvent e) 在下面的例子中,当单击超链接时,JEditorPane对象 将显示超链接所链接的网页。 返回 11.5 InetAdress类 我们已经知道Internet上的主机有两种方式表示地址: (1)域名 例如, (2)IP 地址 例如,10 包中的InetAddress类对象含有一个Internet主 机地址的域名和IP地址: /10。 域名容易记忆,当你在连接网络时输入一个主机的域 名后,域名服务器(DNS)负责将域名转化成IP地址 ,这样我们才能和主机建立连接。 1获取Internet上主机的地址 我们可以使用InetAddress类的静态方法: getByName(String s); 将一个域名或IP地址传递给该方法的参数s,获得一个 InetAddress对象,该对象含有主机地址的域名和IP地 址,该对象用如下格式表示它包含的信息: /0 下面的例子4分别获取域名是的主机 域名及IP地址,同时获取了IP地址是的 主机域名及IP地址。 当你运行上述程序时应保证你已经连接到Internet(通 过拨号或局域网连接到Internet上)。上述程序的 运 行结果: /0 / 另外,InetAddress类中含有两个实例方法: public String getHostName() 取InetAddress对象所 含的域名。 public String getHostAddress() 获取InetAddress对象 所含的IP地址。 2获取本地机的地址 我们可以使用InetAddress类的静态方法: getLocalHost(); 获得一个InetAddress对象,该对象含有本地机的域名 和IP地址。 返回 11.6 套接字Socket IP地址标识Internet上的计算机,端口号标识正在计算 机上运行的进程(程序)。端口号与IP地址的组合得 出一个网络套接字。端口号被规定为一个16位的整数 065535。其中,01023被预先定义的服务通信占用 (如telnet占用端口23,http占用端口80等)。除非我 们需要访问这些特定服务,否则,就应该使用 102465535这些端口中的某一个进行通信,以免发生 端口冲突。 1套接字连接 所谓套接字连接就是客户端的套接字对象和服务器端 的套接字对象通过输入、输出流连接在一起,现在我 们分三个步骤来说明套接字连接的基本模式。 (1)服务器建立ServerSocket对象 ServerSocket对象负责等待客户端请求建立套接字连 接,类似邮局某个窗口中的业务员。也就是说,服务 器必须事先建立一个等待客户请求建立套接字连接的 ServerSocket对象。ServerSocket的构造方法是: ServerSocket(int port) 当建立服务器套接字时可能发生IOException异常,因 此要象下面那样建立接收客户的服务器套接字。 try ServerSocket waitSocketConnection=new ServerSocket(1880); catch(IOException e) 当服务器的ServerSocket对象waitSocketConnection建 立后,就可以使用方法accept()接受客户的套接字连接 请求,代码如下所示: waitSocketConnection.accept(); 接收客户的套接字也可能发生IOException异常,因此 要象下面那样建立接受客户的套接字。 try Socket socketAtServer= waitSocketConnection.accept(); catch(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是一个端口号。 也可以使用Socket类不带参数的构造方法 public Socket() 创建一个套接字对象,该对象不请求任何连接。该对 象再调用 public void connect(SocketAddress endpoint) throws IOException 请求和参数SocketAddress指定地址的套接字建立连接 。为了使用connect方法,可以使用SocketAddress的 子类:InetSocketAddress创建一个对象, InetSocketAddress的构造方法是: public InetSocketAddress(InetAddress addr, int port) 创建Socket对象可能发生IOException异常,因此要象 下面那样建立到服务器的套接字连接 try Socket socketAtClient=new Socket(“8”,1880); catch(IOException e) 客户端建立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表的顺序值: 1127;服务器接受这些数据,并将顺序值对应的字 符返回给客户。你首先将例子5中服务器端的 Server.java编译通过,并运行起来,等待客户请求连 接。然后运行客户端程序。 返回 11.7 使用多线程处理套接字连接 套接字连接中涉及到输入流和输出流操作,客户或服 务器读取数据可能会引起堵塞,我们应把读取数据放 在一个单独的线程中去进行。另外,服务器端收到一 个客户的套接字后,就应该启动一个专门为该客户服 务的线程。 我们用学过的组件,设计一个略微复杂的套接字连接 。 在下面的例子6中,客户输入一个一元二次方程的系数 并发送给服务器,服务器把计算出的方程的实根返回 给客户。因此你可以将计算量大的工作放在服务器端 ,客户负责计算量小的工作,实现客户-服务器交互计 算,来完成某项任务。 返回 11.8 UDP数据报 基于UDP通信的基本模式是 (1)将数据打包,称为数据包(好比将信件装入信封一 样),然后将数据包发往目的地。 (2)接受别人发来的数据包(好比接收信封一样),然 后查看数据包中的内容。 1发送数据 (1)创建DatagramPacket对象 首先用DatagramPacket类将数据打包,即用 DatagramPacket类创建一个对象,称为数据包。 返回 用DatagramPacket的以下两个构造方法创建待发送的 数据包: DatagramPacket(byte data ,int length,InetAddtress address,int port) DatagramPack(byte data ,int offset,int length,InetAddtress address,int port) 使用构造方法创建的数据包对象具有下列两个性质: 含有data数组指定的数据。 该数据包将发送到地址是address、端口号是port的主机 上。 我们称address是它的目标地址、port是这个数据包的 目标端口号。其中,第2个构造方法创建的数据包对象 含有数组data从offset开始指定长度的数据。 例如: byte data =“近来好吗“.getByte(); InetAddtress address=InetAddtress.getName(““); DatagramPacket data_pack=new DatagramPacket(data,data.length, address,980); (2)发送数据 然后用 DatagramSocket类的不带参数的构造 方法:DatagramSocket()创建一个对象,该对 象负责发送数据包。例如, DatagramSocket mail_out=new DatagramSocket(); mail_out.send(data_pack); 2接收数据 DatagramSocket类另一个构造方法: DatagramSocket(int port) 创建一个对象,其 中的参数必须和待接收的数据包的端口号相同 。例如,如果发送方发送的数据包的端口号是 5666: 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=new DatagramPacket(data,length); mail_in.receive(pack); 该数据包pack将接收长度是length的数据放入 data。 在下面的例子7中两个主机(可用本地机模拟)互相发 送和接收数据包。 返回 11.9 广播数据包 广播数据包类似于电台广播,进行广播的电台需在指 定的波段和频率上广播信息,接收者只有将收音机调 到指定的波段、频率上才能收听到广播的内容。 广播数据包涉及到地址和端口。我们知道,Internet的 地址是a.b.c.d的形式。该地址的一部分代表用户自己 主机,而另一部分代表用户所在的网络。当a小于128 ,那么b.c.d就用来表示主机,这类地址称做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(““);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆转让与车辆检测报告及维修保养服务合同
- 采棉机作业与棉花种植项目投资合同
- 电梯低频噪音维修方案
- 泡水漏水考试题及答案
- 车位产权明确买卖及车位租赁及维修合同
- 兽医门诊面试题及答案
- 冷库搬运服务外包方案
- 2026版《全品高考》选考复习方案生物0419 课时作业(十八) 减数分裂与有丝分裂的比较 含答案
- 胸膜肿瘤CT表现与鉴别诊断
- 舞室运营方案模板
- DLT 5434-2021 电力建设工程监理规范表格
- YYT 0657-2017 医用离心机行业标准
- 浙江省绍兴市2024年高一下学期期末调测英语试题含解析
- ISO45001体系内部审核检查表
- 投标资格承诺声明函(完整版)
- SYT 6968-2021 油气输送管道工程水平定向钻穿越设计规范-PDF解密
- (正式版)QBT 5998-2024 宠物尿垫(裤)
- 《技术交底》课件
- 12、口腔科诊疗指南及技术操作规范
- 骨科专业手外科临床技术操作规范2023版
- 顶管专项施工方案审查意见
评论
0/150
提交评论