20155306 2016-2017-2 《Java程序设计》第十周学习总结
20155306 2016-2017-2 《Java程序设计》第十周学习总结
教材学习内容总结
Java和Android开发学习(网络)
网络概览
- 计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中第四层完成数据传送服务,上面三层面向用户。
超文本传输协议(HTTP)
- 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
- HTTP请求包含三个部分:方法、请求头、请求实体。
java.net.URL
类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
简单的可以把URL理解为包含:协议、主机名、端口、路径、查询字符串和参数等对象。每一段可以独立设置。
java.net.URLConnection
URLConnection类是一个抽象,是实现应用程序和URL之间通信连接的所有类的超类,该类的实例可以用来读写URL所指的资源。在创建了URL对象之后,可以使用该URL对象的openConnection方法来创建URLConnection对象,之后就可以使用下面的方法完成各种各样的操作。
-
public URL getURL()
得到URLConnection对象的URL域。 -
public int getContentLength()
得到content-type头域的值。 -
public String getContentEncoding()
得到content-encoding头域的值。 -
public long getDate()
得到date头域的值。 -
public long getLastModified()
得到last-modified头域的值。 -
public String getHeaderField(String name)
得到指定头域的名称。 -
public Object getContent() throws IOException
得到URL连接的内容。该方法会先调用getContentType方法得到对象的内容类型,再做相应的处理。 -
public InputStream getInputStream() throws IOException 得到URLConnection的输入流。
-
public OutputStream getOutputStream()throws IOException
得到URLConnection的输出流。
java.net.Socket
这个类实现了客户端sockets(也成套接字)。一个套接字就是两个机器通讯的端点。
套接字的实际工作是由SocketImpl类的实例执行的。一个应用程序通过改变创建套接字实现的套接字工厂可以配置自身来创建适应于本地防火墙的套接字。
- public SocketAddress getRemoteSocketAddress()
返回一个该套接字连接到的终端的地址,未连接则返回null。 - public SocketChannel getChannel()
返回和这个套接字关联的唯一SocketChannel对象。 - public InputStream getInputStream() throws IOException
为这个套接字返回一个输入流。
关闭这个返回的输入流将关闭与之关联的套接字。 -
public OutputStream getOutPutStream() throws IOException 为这个套接字返回一个输出流。 关闭这个返回的输出流将关闭与之关联的套接字。
java.net.ServerSocket
若想要实现一个服务器应用程序,需要一种不同的方法,服务器需随时待命,为了让应用程序做到这一点,需要使用java.net.ServerSocket类,是服务器套接字的一个实现。
Java 密码学算法
密码学基础
- 安全的三个属性(CIA金三角):
机密性(Confidentiality)
完整性(Integrity)
可用性(Availability) - 密码学: 主要是研究保密通信和信息保密的学科, 包括信息保密传输和信息加密存储等。密码学包含密码编码学( Cryptography) 和密码分析学(Cryptanalyst) 两个分支。
Java与密码学
- 柯克霍夫原则( Kerckhoff's rinciple) : 系统的安全性取决于密钥, 对密钥保密, 对算法公开。 或将其改为“ 敌人了解系统” , 这样的说法称为香农箴言。 柯克霍夫原则是现代密码学设计的基本原则。
- Java安全体系结构总共分为4个部分:
JCA
JCE
JSSE
JAAS
Java对称加密-DES算法
- Java中创建对称密钥的步骤:
(1) 获取密钥生成器
KeyGenerator kg=KeyGenerator.getInstance("DESede");
(2) 初始化密钥生成器
kg.init(168);
(3) 生成密钥
SecretKey k=kg.generateKey( );
(4) 通过对象序列化方式将密钥保存在文件中
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
以上密钥是通过对象序列化方式保存在文件中,在文件中保存的是对象,还可以用另一种方式保存在文件中,即以字节保存在文件中。
- 使用对称密钥进行加密编程思路:
(1) 从文件中获取密钥
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
(2) 创建密码器(Cipher对象)
Cipher cp=Cipher.getInstance("DESede");
(3) 初始化密码器
cp.init(Cipher.ENCRYPT_MODE, k);
(4) 获取等待加密的明文
String s="Hello World!";
byte ptext[]=s.getBytes("UTF8");
(5) 执行加密
byte ctext[]=cp.doFinal(ptext);
(6) 处理加密结果
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext)
以下图片为DES算法运行结果图:
Java非对称加密-RSA算法
Java的KeyPairGenerator类提供了一些方法来创建密钥对以便用于非对称加密,密钥对创建好后封装在KeyPair类型的对象中,在KeyPair类中提供了获取公钥和私钥的方法。以加密为例,具体步骤如下:
(1) 创建密钥对生成器
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
(2) 初始化密钥生成器
kpg.initialize(1024);
(3) 生成密钥对
KeyPair kp=kpg.genKeyPair( );
(4) 获取公钥和私钥
PublicKey pbkey=kp.getPublic( );
PrivateKey prkey=kp.getPrivate( );
以下图片为RSA算法进行加密解密结果图:
使用密钥协定创建共享密钥
- 非对称加密解决了密钥分发的难题,但其计算量比对称密钥大,因此一般并不使用非对称加密加密大量数据。常见的做法是:主要数据通过对称密钥加密,而使用非对称加密来分发对称密钥,这样就将两者的优势结合了起来。
- 创建DH公钥和私钥
DH算法是建立在DH公钥和私钥的基础上的, A需要和B共享密钥时,A和B各自生成DH公钥和私钥,公钥对外公布而私钥各自秘密保存。本实例将介绍Java中如何创建并部署DH公钥和私钥
创建共享密钥
DH算法中,A可以用自己的密钥和B的公钥按照一定方法生成一个密钥,B也可以用自己的密钥和A的公钥按照一定方法生成一个密钥,由于一些数学规律,这两个密钥完全相同。这样,A和B间就有了一个共同的密钥可以用于各种加密。
教材学习中的问题和解决过程
暂无
代码调试中的问题和解决过程
-
问题1:在编译代码时,出现错误:编码GBK的不可映射字符
-
问题1解决方案:由于JDK是国际版的,我们在用javac.exe编译时,编译程序首先会获得我们操作系统默认采用的编码格式。当我们不加设置就编译时,相当于使用了参数:javac -encoding gbk *.java,当然就会出现不兼容的情况。应该使用-encoding参数指明编码方式:javac -encoding UTF-8 *.java , 这下没警告了
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
-
博客中值得学习的或问题:
- xxx
- xxx
- ...
-
代码中值得学习的或问题:
- xxx
- xxx
- ...
-
基于评分标准,我给本博客打分:XX分。得分情况如下:xxx
点评过的同学博客和代码
- 本周结对学习情况
- 20155339
- 结对照片
- 结对学习内容
-一起探讨了Java与密码学算法的相关内容
- 上周博客互评情况
其他(感悟、思考等,可选)
感受到学科与学科之间息息相关,学习Java的同时复习了密码学的相关内容。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 20/20 | 1/2 | 15/15 | 完成JDK、IDEA下载,并且可以简单操作 |
第二周 | 150/170 | 1/2 | 18/33 | 开始可以撰写简单的代码,了解了一些常用的语法 |
第三周 | 327/677 | 1/2 | 26/59 | 更深入认识类与对象,以及对象的封装,时间紧,任务重,需敲大量代码来熟练 |
第四周 | 1353/1830 | 1/2 | 25/84 | 通过学习继承和多态,感觉自己掌握了很多java的语法,代码量越来越重要 |
第五周 | 577/2407 | 1/2 | 24/112 | 本周学习了异常处理和Collection与Map,感觉自己对代码的学习越来越深入了,但是独立敲代码的能力还不好,感觉自己需要微改一波学习代码的方法了。 |
第六周 | 674/3081 | 1/2 | 27/139 | 主要学习了输入输出流和线程,学的越来越多,感觉以前的知识不牢固,现在有点吃力 |
第七周 | 291/3372 | 1/2 | 16/155 | 学习了时间与日期 |
第八周 | 344 /3816 | 1/2 | 18/173 | 学习了通用API,复习了继承的内容 |
第九周 | 1118 /4296 | 1/2 | 22/200 | 学习了最后三章内容,重点学习了整合数据库 |
第十周 | 371/4706 | 1/2 | 18/218 | 深入学习了用Java实现密码学算法,以及计算机网络 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:20小时
-
实际学习时间:18小时
-
改进情况:对之前不扎实的知识进行巩固
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)