20165207 第九周学习总结
Posted ltl0501
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20165207 第九周学习总结相关的知识,希望对你有一定的参考价值。
20165207 第九周学习总结
教材内容与问题解决
- 创建URL对象的常用构造方法有两种,第一种给URL()传入的参数是一个字符串,比如:"http://www.google.com" 使用这种方法,url对象的协议http,地址www.google.com是在字符串中给出的,url对象的资源是默认的主页资源。另一种方法可以指定url对象的资源,参数列表为三个字符串String protocol给出协议、String host给出地址、String file给出资源。两种方法都可能会抛出MalformedURLException异常,应放在try catch语句中创建URL对象。
读取URL的资源可以调用openStream方法返回一个输入流对象的引用,再对输入流对象进行操作就可以对URL的资源进行输出。需要注意的是URL资源的读取可能会发生阻塞,所以应当在一个线程中读取URL资源。
InetAddress类可以获取Internet主机的地址以及本地主机的地址。InetAddress对象调用类方法getByname时,给字符串类型的参数传入域名或者IP地址,就可以获得一个InetAddress对象,这个对象既含有相应的域名也含有相应的IP地址。调用实例方法getHostName返回一个字符串,含有对象的域名。调用实例方法getHostAddress将返回一个字符串,含有的是对象的IP地址。另外静态方法getLocalHost被调用时会返回一个InetAddress对象,这个对象含有本机的域名以及IP地址。
- 当两个程序需要交互信息时,可以使用套接字对象将两个程序连接在一起。网络套接字由IP地址与端口号组成,IP地址指明了服务器,端口号指明了这个占用此端口的程序。
- 使用构造方法Socket(String host,int port)为新建的套接字对象指定IP地址以及端口号来创建套接字对象时,程序可能抛出IOException异常,应当在try catch语句中进行。
- 要在服务器端获得与客户端相匹配的服务器端套接字,服务器首先需要用与客户端创建套接字时一致的端口号port建立SeverSocket对象,再由此SeverSocket对象调用accept方法返回一个和客户端Socket对象相连接的Socket对象。需要注意的是创建SeverSocket对象以及调用accept方法这两个过程都有可能抛出IOException异常,应放到try catch中。
在SeverSocket调用accept方法时,如果没有接收到客户端的呼叫,accept方法会一直阻塞,该语句后面的方法得不到执行。可以使用setSoTimeOut设置超时值,在超时之后通过抛出异常停止accept方法的阻塞。
- 使用套接字连接进行数据的读取与直接从文件读取有很大不同,在读取过程发生阻塞时本线程后续的操作便无法得以实行。服务器端每收到一个客户端套接字就应专门启动一个为该客户服务的线程。
另外,除了要求服务器端创建一个专门的线程来与客户端建立连接,在客户端和服务器端读取信息时也应当在一个单独的线程中。
- 教材408页从上到下第三个阴影区域,是一个说明如何用刚才的构造方法把“生日快乐”打包为数据包的例子。第二行末尾使用的方法getaName之前没有讲过,之前教的一直是getByName传入域名,来返回一个InetAddress对象既含有域名也含有IP地址。经查找API,未发现InetAddress有getName这个方法。
所以,应该还是getByName。 - 接收发送过来的数据包需要用数据包来接收,不过用于接收的数据包创建时用的是另一个构造方法DatagramPack(byte data[],int length)和创建发送的数据包的方法是重写的关系。用于接收的数据包自然是没有目的地址和目的端口的。
- IP地址共分为4类,分类的依据是IP地址的a.b.c.d形式中a的数值,来界定四个数值中哪几个是网络地址哪几个是主机地址。其中,a<128时,a后面的b.c.d就代表主机地址,这种情况称为A类地址。128<=a<192的情况下,为B类地址,a.b表示网络,c.d表示主机。a>=192时,为C类地址,这种情况下,a.b.c表示网络,d表示主机。另外224.0.0.0~255.255.255.255是保留地址,也被称为D类地址。广播者的主机和接收广播的主机需加入到同一个D类地址中才能够进行广播或者接收广播,并且需保证广播的主机具有有效的IP地址。
在412到414页的程序中,我理解了在保证是D类地址的条件下,程序具有多点广播套接字即MulticastSocket型的套接字就能够进行广播的发送和接收,但是究竟是进行发送还是接收要看MulticastSocket套接字调用的是send还是receive方法,以及配合发送或者接收的数据包。
- 在JAVA远程调用的情况下,用户虽然实际上在和远程对象的代理发出请求,但请求本身不需要因为是代理而做出改变,就像和远程代理请求一样。而且远程对象的代理也就是RMI帮助生成的存根需要被下载到客户端并且驻留在客户端。
- 远程代理需要实现java.rmi包中的Remote接口,实现这个接口是RMI辨别远程对象的根据。此接口中没有方法,实现时首先需扩展接口再让创建远程对象的类扩展子接口,扩展出的方法是RMI识别的客户可以进行远程调用的方法。
在IDEA的命令行中执行生成存根的命令会出错,具体内容包括找不到类以及包结构不符,尝试多次总是会有一种错误
遂放弃,新建了另外的项目,专门用来远程调用。但是,不知道是网络还是什么愿因,注册那一步中注册了一个小时都没有成,但后来还是出来了和教材一样的结果
代码托管
项目链接
脚本截图
上周错题
- 第7题:该程序中有两个线程除了创建的线程还不能忽视主线程。
- 第11题:我个人认为此题并不严谨,第360页说的是如果main方法中没有创建其他线程main方法返回,JVM就会结束。而且下面也明确地说了如果创建了其他线程JVM不会在main返回时就结束而会一直等到所有的线程都结束。然而此题的B选项并没有明确main中有没有创建其他新的线程。这也是当时我没有选B选项的原因。
- 第20题:程序应当只有一个main线程因为启动创建的线程时代码中没有用start而是用的run,所以main中新建的线程没有启动,整个程序只是看起来有两个,其实只有一个。
以上是关于20165207 第九周学习总结的主要内容,如果未能解决你的问题,请参考以下文章