20165214 第九周学习任务

学号 2017-2018-2 《Java程序设计》第九周学习总结教材学习内容总结
  • 13.2 InetAddress类
    • Internet上的主机有两种方式来表示地址:①地址(如www.******.com)②IP地址(如202.***)。InetAdress类对象含有一个Internet主机地址的域名和IP地址。域名服务器(DNS)负责将域名转化为IP地址,然后与主机建立连接。
    • InetAdress类的两个静态方法:①getByName(String s),其中s是域名或者IP地址,调用此方法可以获得InetAdress对象,含有主机地址的域名与IP地址,表示信息的格式为[域名]/[IP地址];②getLocalHost()获得一个InetAdress对象,该对象还有本地机器的域名和IP地址。同时,IntAdress类中还有两个实例方法:①public String getHostName()获取对象所含的域名;②public String getHostAdress()获取对象所含的IP地址。
  • 13.3 套接字:IP地址表示计算机,端口号表示进程(线程),Socket类创建套接字对象并连接在一起(端口号与IP地址组合)。
    • 客户端程序用Socket类创建负责连接到服务器的套接字对象,其构造方法为Socket([IP地址],[端口号])(可能抛出IOException异常)。对套接字对象建立后,可以使用①getInputStream()获得一个输入流来读取服务器写入到输出流中的数据;②getOutputStream()获得一个输出流,服务器可以用输入流来读取客户写入到输出流中的数据。
    • 客户负责建立连接到服务器的套接字对象。服务器需要创建一个ServerSocket对象来将客户端的套接字对象与服务器的套接字对象连接起来。ServerSocket的构造方法是ServerSocket([端口号])(当端口已被占用会抛出IOException异常)。接着,ServerSocket对象调用accept()方法再次返回一个与客户端对象相连接的新的Socket对象。同样的,它也具有上述的两个方法。
    • 从套接字连接中读取数据,可能在另一端数据发送之前就已经开始读取了,而且会阻塞本线程,直到成功读取到信息。同时,accept方法也会阻塞线程的执行,直到收到客户的呼叫。为了解决“收不到呼叫而导致程序无法继续运行”的情况,ServerSocket对象在调用accept方法之前可以先调用setTimeout(s)方法来使得在调用accept方法时如果超过s毫秒没有收到呼叫,就抛出SocketTimeoutException异常。
    • 双方通信完毕,套接字要使用close()方法关闭套接字连接。
    • 使用多线程技术:由于使用套接字连接中读取数据时,可能会阻塞本线程直到成功读取到信息。为了避免这种情况,需要启动一个专门为该客户服务的线程。Socket的构造方法Socket()可以创建一个套接字对象,该对象调用public void connect(SocketAddress endpoint) throws IOException来与指定的套接字创建连接。这里的参数可以使用InetSocketAddress的构造方法public InetSocketAdress(InetAdress addr,int port)来获得。套接字通信的两个基本原则:
      • ①服务器要启动一个专门的线程与客户的套接字建立连接;
      • ②套接字的输入流在读取信息时可能发生阻塞,所以客户端与服务器端都需要在一个单独的线程中读取信息。
  • 13.4 UDP数据报
    • 比较UDP协议与TCP协议:UDP速度较快,但无法保证能否送到目的地且无法保证送达时的顺序。
    • 数据包的发送与接收:使用DatagramPacked类的构造方法DatagramPacket([字节数组],[长度],[地址],[端口])创建数据包对象,使用DatagramSocket类创建的对象调用send([数据包])方法来发送数据包。要接收数据包之前,首先要用使用DatagramSocket类创建的对象,调用构造方法DatagramSocket(端口号)与被发送的数据包创建连接,然后这个创建的对象调用receive([数据包])方法来接收数据包,其中数据包对象可以用DatagramSocket类得到构造方法DatagramPacket([字节数组],[长度])来创建数据包对象。
    • 注意事项:receive方法可能引起阻塞,直到收到数据包,且数据包的长度不能超过8192KB
  • 13.5 广播数据报
    • Internet的地址是a.b.c.d的形式,计算机地址分为四大类:
      • ②A类:a<128,则a表示网络地址,b,c,d表示主机地址;
      • ②B类:128<=a<192,则a,b表示网络地址,c,d表示主机地址;
      • ②B类:192<=a则a,b,c表示网络地址,d表示主机地址;
      • ②B类:224.0.0.0~224.255.255.255是保留地址,称为D类地址。
    • 要广播或者接收广播的主机都必须加入到同一个D类地址,注意D类地址并不代表某个特定主机的位置。
  • 13.6 Java远程调用
    • 远程调用的基本步骤是:客户程序请求远程对象调用方法,然后远程对象调用方法并返回必要的结果。
    • 代理与存根:RMI会生成一个存根(Stub)(使用rmic命令来产生。),并让存根产生的对象作为远程对象的代理(存根的命名为[字节码文件_Stub].java)。代理与远程对象实现了相同的接口。客户端平时是跟代理打交道。
    • RMI为标志远程对象,实现了java.rmi包中的Remote接口,注意必须扩展这个接口,同时远程对象的类必须要实现Remote接口。
    • 远程对象创建之前,RMI要求远程服务器必须先启动注册rmiregistry。然后远程服务器使用java.rmi包中的Naming类调用类方法rebind(String name.Remote obj)绑定一个远程对象到rmiregistry所管理的注册表中。
  • 教材学习中的问题和解决过程在本章的学习中,由于跟着教材走,遇到不懂的内容也及时往回翻书看懂,所以基本上没有什么大问题。
  • 问题1:在学到Java远程调用的时候,我在想:我们平时生活中的一些通信也是通过这样来实现的吗?用的也是Java语言吗?虽然了解了这些内容的原理,但是还是想知道,究竟是如何把这些东西实现到实处的?
  • 代码调试中的问题和解决过程
  • 问题1:在例子4中,当输入N时就不再进行面积计算,是因为调用了readDouble(),读取到了不符合Double格式的信息吗?还是只是能够独特地识别“N”字符?

  • 问题1解决方案:我在输入时改成了其他字符,也是退出了程序,不再进行面积计算。由此可知道,是当读取到了不符合格式时,抛出异常。

  • 代码托管上周考试错题总结
  • 错题1

  • 错题1解决:守护线程的一个特性是,当程序中的所有非守护线程都已结束运行时,即使守护线程的run方法中还有需要执行的语句,守护线程立刻运行。因此,守护线程不知道在什么时候就会中断操作,因此不能访问一些特定的资源。

  • 错题2

  • 错题2解决:
    本题中,由于创建的线程thread只是创建了,但是没有调用start()方法来启动线程,所以它不算一个线程。因此整个程序中只有一个主线程。

  • 结对及互评其他这周的学习任务感觉比较抽象一些,不过我觉得本周学的内容应该是和我们的生活比较接近了,我了解了像“聊天室”,“广播台”这种平时常见的东西的原理,收获还是很大的~
    不过感觉有点遗憾的是四则运算的完善还没有弄好。。发觉自己这几天有点偷懒了。应该及时调整一下状态。学习进度条 代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 目标 5000行 30篇 400小时 第一周 36/36 1/1 8/8 第二周 432/468 2/3 15/23 第三周 964/1432 1/4 16/39 第四周 725/2157 1/5 14/53 第五周 1428/3585 3/8 18/71 第六周 1323/4908 1/9 17/88 第七周 960/5868 3/12 22/110 第八周 993/6861 2/14 23/133 第九周 2073/8934 2/16 20/153
  • 计划学习时间:18小时

  • 实际学习时间:20小时

  • 相关内容推荐