20155233 2016-2017-2 《Java程序设计》第10周学习总结

时间:2023-03-08 22:37:00

20155233 2016-2017-2 《Java程序设计》第10周学习总结

学习目标

  • 了解计算机网络基础
  • 掌握Java Socket编程
  • 理解混合密码系统
  • 掌握Java 密码技术相关API的使用

教材学习内容总结

网络概述

  • 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。

  • 网络中的每个设备都会有一个唯一的数字标识,这个就是IP地址。在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34

  • 为了方便记忆,有创造了另外一个概念——域名(Domain Name),例如sohu.com等。一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。

  • 端口(port):在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了,就是一个计算机上可以并发运行多个网络程序(在硬件上规定,端口的号码必须位于0-65535之间)

  • 网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。

  • DNS服务器是在实际传输数据以前将域名转换为IP地址的服务器,当用户在浏览器输入域名时,浏览器首先请求DNS服务器,将域名转换为IP地址,然后将转换后的IP地址反馈给浏览器,然后再进行实际的数据传输。

  • 端口是为了让一个计算机可以同时运行多个网络程序,在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了,换句话说,也就是一个计算机上可以并发运行多个网络程序,而不会在互相之间产生干扰。

服务器端网络编程步骤

  • 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。

  • 获得连接:当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。

  • 交换数据:服务器端通过获得的连接进行数据交换。接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。在数据交换完成以后,关闭和客户端的连接。

  • 关闭连接:当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。

  • 网络编程中常见的两种结构:C/S结构和B/S结构。C/S结构即客户端/服务器结构,在开发时需要分别开发客户端和服务器端,这种结构的优势在于由于客户端是专门开发的,可以根据需要实现各种效果,它的缺点在于通用性查,维护压力大。B/S结构即浏览器/服务器结构,在开发时只需要开发服务器端即可,这种结构的优势在于开发的压力比较小,不需要维护客户端,但是览器的限制比较大,表现力不强。

  • P2P程序是一种特殊的程序,应该一个P2P程序中既包含客户端程序,也包含服务器端程序,例如BT,使用客户端程序部分连接其它的种子(服务器端),而使用服务器端向其它的BT客户端传输数据。

  • 实现服务器端监听的代码为:
    ServerSocket ss = new ServerSocket(10000);

UDP编程

  • 实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:
    DatagramSocket:实现“网络连接”,包括客户端网络连接和服务器端网络连接。DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。
    DatagramPacket:实现对于网络中传输的数据封装,该类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。
    InetAddress类:该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。

  • 使用UDP方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对于服务器的压力要比TCP小很多,但是使用该种方式最大的不足是传输不可靠,所以在网络编程中,必须要求可靠传输的信息一般使用TCP方式实现,一般的数据才使用UDP方式实现。

  • UDP方式的网络编程也在Java语言中获得了良好的支持,由于其在传输数据的过程中不需要建立专用的连接等特点,所以在Java API中设计的实现结构和TCP方式不太一样。当然,需要使用的类还是包含在java.net包中。

  • 在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现:

  • DatagramSocket:DatagramSocket实现的是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。

  • DatagramPacket:类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。

UDP客户端编程:

  • UDP方式的建立连接和TCP方式不同,只需要建立一个连接对象即可,不需要指定服务器的IP和端口号码,示例如下:

  • 网络协议是指对于网络中传输的数据格式的规定。网络协议的实质是客户端程序和服务器端程序对于数据的一种约定.在进行设计时一般遵循“简单、通用、容易解析”的原则进行。一般都会涉及到两个网络协议格式:客户端发送数据格式和服务器端反馈数据格式。客户端程序需要完成的处理为:

(1) 客户端发送协议格式的生成

(2) 服务器端反馈数据格式的解析

(3) 服务器端程序需要完成的处理
(4) 服务器端反馈协议格式的生成
(5) 客户端发送协议格式的解析

  • 由于各种网络程序使用不同的协议格式,所以不同网络程序的客户端之间无法通用。

客户端发送协议格式:

  • 将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。

  • 例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。

  • 客户端发送“quit”字符串代表结束连接

服务器端发送协议格式:

  • 反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。

  • 例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。

教材学习中的问题和解决过程

<1> 网络程序的两种主要结构是什么?

  • C/S结构;
  • B/S结构;

<2> 可以使用什么技术实现服务器端支持多个客户端同时工作?

  • 多线程;

<3> 在网络编程中,对于同一个网络程序来说,一般都会涉及到两个网络协议格式:客户端发送数据格式和(服务器端反馈数据格式)。

代码调试中的问题和解决过程

本周代码调试未出现任何问题。

代码托管

(statistics.sh脚本的运行结果截图)
20155233 2016-2017-2 《Java程序设计》第10周学习总结

上周考试错题总结

上周主要考察实验二内容,对实验二的UML关系图还是不能很好的理解,以及在本周的学习中加深了理解。

结对及互评

评分标准

  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

  • 参考示例

点评过的同学博客和代码

  • 本周结对学习情况
  • 上周博客互评情况

20155338常胜杰
20145226夏艺华
20155233刘高乐
20155320罗佳琪
20155235王玥
20155316黄月

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

本周学习了解计算机网络基础,掌握Java Socket编程,理解混合密码系统,掌握Java 密码技术相关API的使用

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 20篇 200小时
第一周 8/10 1/4 8/10 编写第一个Java程序HelloWorld
第二周 79/89 1/5 11/21 学习Java基础语法
第三周 249/338 1/6 16/37 学习Java关于对象的重要知识
第四周 331/669 1/7 17/54 学习Java关于继承、接口与多态的重要知识
第五周 507/1176 1/8 18/72 学习Java的异常处理、Collection与Map
第六周 1321/2497 1/9 16/88 学习Java的输入、输出与线性、并行API
第七周 678/3175 2/11 18/106 学习Java的Lambda、时间与日期
第八周 358/3533 1/12 18/124 学习Java的NIO与NIO2、通用API
第九周 686/4219 2/14 21/145 学习Java的整合数据库、反射与类加载器和自定义泛型、枚举与注释
第十周 478/4697 1/15 16/161 学习计算机网络知识,以及网络编程,数据库调用

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:20小时

  • 实际学习时间:16小时

  • 改进情况:学习时间比上周多,主要花费时间去使用,复习知识。

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料