20175314 《Java程序设计》第十一周学习总结
教材学习内容总结
URL类
- URL类是
java.net
包中的一个类,用URL创建的对象可以获取URL中的资,其包括三部分信息:协议、地址和资源。注意,协议必须被Java虚拟机所支持,地址必须是能链接的IP地址或域名 - URL类有两个构造方法来创建URL对象:①
public URL [链接名] throws MalformedURLException
②public URL([协议],[地址],[资源]) throws Exception
- URL对象调用
InputStream()
方法返回一个指向对象包含的资源的输入流,可以用来读取信息
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地址- 套接字: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)
来获得。套接字通信的两个基本原则:
①服务器要启动一个专门的线程与客户的套接字建立连接
②套接字的输入流在读取信息时可能发生阻塞,所以客户端与服务器端都需要在一个单独的线程中读取信息
UDP数据报
比较UDP协议与TCP协议:UDP速度较快,但无法保证能否送到目的地且无法保证送达时的顺序
数据包的发送与接收:使用DatagramPacked类的构造方法DatagramPacket([字节数组],[长度],[地址],[端口])
创建数据包对象,使用DatagramSocket
类创建的对象调用send([数据包])
方法来发送数据包。要接收数据包之前,首先要用使用DatagramSocket
类创建的对象,调用构造方法DatagramSocket(端口号)
与被发送的数据包创建连接,然后这个创建的对象调用receive([数据包])
方法来接收数据包,其中数据包对象可以用DatagramSocket
类得到构造方法DatagramPacket([字节数组],[长度])
来创建数据包对象
广播数据报
- 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类地址并不代表某个特定主机的位置
Java远程调用
- 远程调用的基本步骤是:客户程序请求远程对象调用方法,然后远程对象调用方法并返回必要的结果
- 代理与存根:RMI会生成一个存根(Stub)(使用rmic命令来产生。),并让存根产生的对象作为远程对象的代理(存根的命名为
[字节码文件_Stub].java
)。代理与远程对象实现了相同的接口。客户端平时是跟代理打交道 - RMI为标志远程对象,实现了
java.rmi
包中的Remote
接口,注意必须扩展这个接口,同时远程对象的类必须要实现Remote接口 - 远程对象创建之前,RMI要求远程服务器必须先启动注册
rmiregistry
。然后远程服务器使用java.rmi
包中的Naming
类调用类方法rebind(String name.Remote obj)
绑定一个远程对象到rmiregistry
所管理的注册表中
教材学习中的问题和解决过程
- 一个URL对象通常包含最基本的三部分信息:协议、地址、资源
- URL对象调用
InputStream openStream()
方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端 - 客户端的套接字和服务器端的套接字通过输入、输出流互相连接后进行通信
- 使用方法
accept()
,accept()
会返回一个和客户端Socket
对象相连接的Socket
对象。accept
方法会堵塞线程的继续执行,直到接收到客户的呼叫 - 套接字的意义:
1、源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务
2、套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程 - 课本关于URL的构造方法部分,地址为什么写对了也可能发生异常?
- 通过查询资料:由于网络不通,地址不合理,格式不正确等多种原因可导致发生异常
代码调试中的问题和解决过程
- 一开始使用老师在蓝墨云发布的压缩包,解压一直发生错误,后来使用官网版本按照操作顺序,
- 但是在执行gmssl命令行工具检查是否成功时遇到问题
- 安装gcc后成功完成任务
代码托管
本周考试错题
- 下列说法正确的是
A . Java语言的一大特性就是内置对多线程的支持。
B . main方法返回时,JVM就会结束Java应用程序。
C . Java应用程序中第一个线程结束后,JVM结束Java应用程序。
D . Java语言使用Thread类及其子类对象来表示线程。
正确答案: A B D
解析:课本P360-361
心得体会
本周是最后一次学习总结,说起来漫长但是也短暂的Java学习即将在最后的两次实验结束后落下帷幕,但是编程的学习永远不会结束,只有终身学习,紧跟时代大趋势,才能够实现我们想要的结果,同时我希望未来的学习能够更能够应用于实际生活使用当中
学习进度条
代码行数 | 博客量 | 学习时间 | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 16篇 | 320小时 | |
第一周 | 51/100 | 1/1 | 12/20 | 基本掌握了Linux的简单指令 |
第二周 | 173/200 | 1/1 | 18/20 | 学习了Java重要基本语法 |
第三周 | 672/800 | 1/1 | 18/20 | 学习了包含多个类的Java程序及类的包机制 |
第四周 | 436/600 | 1/1 | 12/20 | 学习程序父类和子类的继承规则 |
第五周 | 573/600 | 1/1 | 10/20 | 学习通过类来实现接口和接口回调 |
第六周 | 1182/1200 | 1/1 | 20/20 | 学习内部类、匿名类、异常类和File类 |
第七周 | 491/600 | 1/1 | 14/20 | 学习了Java的常用实用类 |
第八周 | 1302/1500 | 4/4 | 22/25 | 学习了Java的泛型类和单元测试的方法 |
第九周 | 624/800 | 3/3 | 18/20 | 学习使用MySQL数据库服务器 |
第十周 | 799/800 | 5/5 | 20/20 | 学习应用Java多线程机制 |
第十一周 | 856/1000 | 3/3 | 18/20 | 学习服务器与客户端重要类 |