20155305乔磊2016-2017-2《Java程序设计》第十周学习总结
教材学习内容总结
Java的网络编程
网络编程
网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。
网络概述
- 1.计算机网络概述
(1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通过光纤、网线等连接将设备连接起来,从而形成了一张巨大的计算机网络。
(2)网络最主要的优势在于共享:共享设备和数据,现在共享设备最常见的是打印机。
(3)IP地址:为了能够方便的识别网络上的每个设备,网络中的每个设备的唯一的数字标识。现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34。IP地址可能是固定的,例如网络上各种各样的服务器;也可以是动态的,例如使用ADSL拨号上网的宽带用户。
(4)域名(Domain Name):例如sohu.com等。一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。
(5)DNS服务器:在网络中传输的数据,全部是以IP地址作为地址标识,所以在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析。
(6)端口(port):让一个计算机可以同时运行多个网络程序,在同一个计算机中每个程序对应唯一的端口。 在硬件上规定,端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口。 - 2.网络编程概述
(1)网络编程就是两个或多个程序之间的数据交换。
(2)“请求-响应”模型:通讯的一端发送数据,另外一端反馈数据,网络通讯都基于该模型。 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
(3)客户端/服务器结构:也叫做Client/Server结构,简称C/S结构。优势:客户端是专门开发的,根据需要实现各种效果;劣势:通用性差,几乎不能通用等,在实际维护时,也需要维护专门的客户端和服务器端,维护的压力比较大。
(4)览器/服务器结构:也叫做Browser/Server结构,简称为B/S结构。优势:开发的压力比较小,不需要维护客户端;劣势:浏览器的限制比较大,表现力不强,无法进行系统级操作等。B/S结构其实也就是一种特殊的C/S结构。
(5)P2P程序:是一种特殊的程序,既包含客户端程序,也包含服务器端程序。使用客户端程序部分连接其它的种子(服务器端),而使用服务器端向其它的BT客户端传输数据。
(6)协议(Protocol):在实际进行数据交换时数据的格式。因为各个网络程序之间协议格式的不同,导致了客户端程序都是专用的结构。 3.网络通讯方式
(1)现有的网络中,网络通讯的方式主要有两种:·TCP(传输控制协议)方式 ·UDP(用户数据报协议)方式
(2)TCP方式:使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。重要的数据一般使用TCP方式进行数据传输。由于TCP需要建立专用的虚拟连接以及确认传输是否正确,所以使用TCP方式的速度稍微慢一些,而且传输时产生的数据量要比UDP稍微大一些。
(3)UDP方式:使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。大量的非核心数据则都通过UDP方式进行传递。
网络编程技术
1.网络编程步骤
(1)客户端网络编程步骤1、建立网络连接:客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。 2、交换数据:连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。 3、关闭网络连接:在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。
(2)服务器端网络编程步骤
1、 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。 2、 获得连接:当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。 3、 交换数据:服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。 4、 关闭连接:当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。
(3)TCP方式是需要建立连接的,对于服务器端的压力比较大,而UDP是不需要建立连接的,对于服务器端的压力比较小。
2.Java网络编程技术
(1)和网络编程有关的基本API位于java.net包中,该包中包含了基本的网络编程实现,该包是网络编程的基础。该包中既包含基础的网络编程类,也包含封装后的专门处理WEB相关的处理类。
(2)InetAddress类:该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。
网络协议
1.网络协议是指对于网络中传输的数据格式的规定。网络协议的实质也是客户端程序和服务器端程序对于数据的一种约定,使用数字来代表内容,进行设计时一般遵循“简单、通用、容易解析”的原则进行。
2.在网络编程中,对于同一个网络程序来说,一般都会涉及到两个网络协议格式:客户端发送数据格式和服务器端反馈数据格式,在实际设计时,需要一一对应。
3.客户端程序和服务器端程序需要进行协议处理的代码分别如下。
客户端程序需要完成的处理为:1、 客户端发送协议格式的生成 2、 服务器端反馈数据格式的解析
服务器端程序需要完成的处理为:
1、 服务器端反馈协议格式的生成 2、 客户端发送协议格式的解析
4.对于一种网络程序来说,网络协议格式是该程序最核心的技术秘密。
网络编程示例
1.质数判别示例
(1)程序功能
客户端程序功能:a) 接收用户控制台输入 b) 判断输入内容是否合法 c) 按照协议格式生成发送数据 d) 发送数据 e) 接收服务器端反馈 f) 解析服务器端反馈信息,并输出
服务器端程序功能:
a) 接收客户端发送数据 b) 按照协议格式解析数据 c) 判断数字是否是质数 d) 根据判断结果,生成协议数据 e) 将数据反馈给客户端
(2)协议格式
客户端发送协议格式:将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。 客户端发送“quit”字符串代表结束连接。 服务器端发送协议格式:
2.猜数字小游戏
(1)程序功能
客户端程序功能列表:1、 接收用户控制台输入 2、 判断输入内容是否合法 3、 按照协议格式发送数据 4、 根据服务器端的反馈给出相应提示
服务器端程序功能列表:
1、 接收客户端发送数据
2、 按照协议格式解析数据
3、 判断发送过来的数字和随机数字的关系
4、 根据判断结果生产协议数据
5、 将生产的数据反馈给客户端
(2)协议格式
客户端程序协议格式如下:
1、 将用户输入的数字转换为字符串,然后转换为byte数组
2、 发送“quit”字符串代表退出
服务器端程序协议格式如下:
1、 反馈长度为1个字节,数字0代表相等(猜中),1代表大了,2代表小了,其它数字代表错误。 反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。
客户端代码:
import java.io.*;
import java.net.*;
/**
* 简单的Socket客户端
* 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈
*/
public class Client {
public static void main(String[] args) {
Socket socket = null;
InputStream is = null;
OutputStream os = null;
//服务器端IP地址
String serverIP = "172.20.10.3";
//服务器端端口号
int port = 9998;
//发送内容
String data = "Hello";
try {
//建立连接
socket = new Socket(serverIP,port);
//发送数据
os = socket.getOutputStream();
os.write(data.getBytes());
//接收数据
is = socket.getInputStream();
byte[] b = new byte[1024];
int n = is.read(b);
//输出反馈数据
System.out.println("服务器反馈:" + new String(b,0,n));
} catch (Exception e) {
e.printStackTrace(); //打印异常信息
}finally{
try {
//关闭流和连接
is.close();
os.close();
socket.close();
} catch (Exception e2) {}
}
}
}
教材学习中的问题和解决过程
教材学习有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,如果别人没有提出相同问题,可以编辑文档添加,然后把自己提出的问题复制到下面:
代码调试中的问题和解决过程
教材中代码调试有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,如果别人没有提出相同问题,可以编辑文档添加,然后把自己提出的问题复制到下面:
- 本周无明显代码问题。基本细节性问题已解决。
代码托管
上周考试错题总结
结对及互评
评分标准
- 正确使用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
点评过的同学博客和代码
- 本周结对学习情况
- 20155311
- 结对照片
- 结对学习内容
- 网络编程,TCP编程
上周博客互评情况(只要链接,具体点评放相应博客下)
- 学号20155222
- 学号20155239
- 学号20155335
- 学号20155322
其他(感悟、思考等,可选)
- 本周我们学习了Java学习笔记的最后三章,很惊讶自己能在短短九周的时间内学习完这本六百多页,十八章的教材,虽然学的马马虎虎并不能变成一个java大神,相信自己能在接下来的时间有效利用自己学习到的内容。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3000行 | 20篇 | 400小时 | |
第一周 | 200/200 | 1/1 | 18/18 | |
第二周 | 153/353 | 1/2 | 18/36 | |
第三周 | 356/709 | 1/3 | 24/60 | |
第四周 | 450/1259 | 1/4 | 28/85 | |
第五周 | 479/1738 | 1/5 | 30/115 | |
第六周 | 700/2438 | 1/6 | 30/145 | |
第七周 | 450/2888 | 2/8 | 31/176 | |
第八周 | 332/3220 | 1/9 | 32/208 | |
第九周 | 662/3882 | 2/11 | 38/246 | |
第十周 | 260/4142 | 1/12 | 24/270 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:30小时
实际学习时间:24小时
改进情况:教材内容学完,对自己有所松懈,外加即将的五一劳动节,学习时间下降不少
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)