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脚本的运行结果截图)

上周考试错题总结

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

其他(感悟、思考等,可选)

感受到学科与学科之间息息相关,学习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就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

参考资料

20155306 2016-2017-2 《Java程序设计》第十周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第十周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 异常: 多线程: 2.书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...

  2. Java程序设计第十周学习总结

    Java课程知识梳理: 流的区分; 字符流与字节流的区别: 字节流是直接操作文件本身的,如果没有关闭字节流操作,文件会依然输出内容 而字符流在程序运行之后会发现文件没有任何的内容,这是因为字符流操作的 ...

  3. 20155306 2016-2017-2 《Java程序设计》第九周学习总结

    20155306 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 16.1 JDBC入门 Java语言访问数据库的一种规范,是一套API ...

  4. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  5. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  6. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  7. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  8. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

  9. 学号 20175212 《Java程序设计》第九周学习总结

    学号 20175212 <Java程序设计>第九周学习总结 教材学习内容总结 一.MySQL数据库管理系统 1.在官网上下载并安装MySQL 2.在IDEA中输入测试代码Connectio ...

  10. 20172325 2018-2019-2 《Java程序设计》第九周学习总结

    20172325 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 图的定义 图是由顶点集(VertexSet)和边集(EdgeSet)组成,针对图G,顶点集和 ...

随机推荐

  1. ZT 设计模式六大原则(2):里氏替换原则

    设计模式六大原则(2):里氏替换原则 分类: 设计模式 2012-02-22 08:46 23330人阅读 评论(41) 收藏 举报 设计模式class扩展string编程2010 肯定有不少人跟我刚 ...

  2. 使用 ruamel.yaml 读写 yaml 文档

    官网链接: https://pypi.org/project/ruamel.yaml/ 1. 安装ruamel.yaml pip install ruamel.yaml 2. 准备yaml文件: Ch ...

  3. Java日期格式化参数对照表

    Symbol Meaning Presentation Example G era designator Text AD y year Number 2009 M month in year Text ...

  4. codeforces 414D Mashmokh and Water Tanks

    codeforces 414D Mashmokh and Water Tanks 题意 题解 \(a_i\):第 \(i\) 层的结点个数. \(b_i\):第 \(i\) 层初始有水的结点个数. 如 ...

  5. 移动App中常见的Web漏洞

    智能手机的存在让网民的生活从PC端开始往移动端转向,现在网民的日常生活需求基本上一部手机就能解决.外卖,办公,社交,银行转账等等都能通过移动端App实现.那么随之也带来了很多信息安全问题,大量的用户信 ...

  6. 前端构建之--gulp

    gulp相关插件: 1.del / gulp-clean 删除文件,用于清空文件 2.browser-sync 用于自动刷新浏览器 3.gulp-htmlmin 用于压缩html 4.gulp-cle ...

  7. css属性之flex属性

    flex属性 规定了弹性元素如何伸长或缩短以适应flex容器中的可用空间.是一个简写属性,可以同时设置flex-grow, flex-shrink, flex-basis三个子属性. /* Basic ...

  8. JavaScript浏览器检测之navigator 对象

    一.使用客户端检测的原因 由于每个浏览器都具有自己独到的扩展,所以在开发阶段来判断浏览器是一个非常重要的步骤. 虽然浏览器开发商在公共接口方面投入了很多精力,努力的去支持最常用的公共功能: 但在现实中 ...

  9. Unicode字符集和UTF-8, UTF-16, UTF-32编码

    ASCII 在过去的计算中,ASCII码被用来表示字符.英语只有26个字母和其他一些特殊字符和符号. 下表提供了ASCII字符及其相应的十进制和十六进制值. 可以从上面的表中推断,在十进制数系统中,A ...

  10. SpringBoot实战(二)之计划任务

    计划任务这个对于Java开发者们,应该不陌生了,非常常用又非常常见.比如jdk自带的Timer 实现例子如下: class MyTask extends TimerTask{ @Override pu ...