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

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

教材学习内容总结

网络编程

  • 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。
  • 狭义的网络编程范畴:程序员所作的事情,就是把数据发送到指定的位置,或者接收到指定的数据。

1 网络概述

1.1 计算机网络概述
  • 计算机网络:通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含的设备有:计算机、路由器、交换机等等。
  • IP地址:网络中的每个设备都会有一个唯一的数字标识,命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成
  • 域名:一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。
  • 域名解析:通过DNS服务器将域名转换为IP地址。
  • 端口(port):在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了,也就是一个计算机上可以并发运行多个网络程序,而不会在互相之间产生干扰。
  • 进行网络通讯交换时,就可以通过IP地址查找到该台计算机,然后通过端口标识这台计算机上的一个唯一的程序。
1.2 网络编程概述
  • 网络通讯基于“请求-响应”模型,通讯的一端发送数据,另外一端反馈数据。
  • C/S结构:客户端与服务器端:网络编程中的两种程序就分别是客户端和服务器端,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别,这种网络编程的结构被称作客户端/服务器结构,也叫做Client/Server结构,简称C/S结构。
  • B/S结构:没有必要使用专用的客户端,而需要使用通用的客户端,例如浏览器,使用浏览器作为客户端的结构被称作浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构。在开发时只需要开发服务器端即可,这种结构的优势在于开发的压力比较小,不需要维护客户端。这种结构也存在着很多不足,例如浏览器的限制比较大,表现力不强,无法进行系统级操作等。
  • B/S结构其实也就是一种特殊的C/S结构。
  • P2P(Point to Point)程序:一个P2P程序中既包含客户端程序,也包含服务器端程序
  • 协议(Protocol):规定该数据的格式,这个数据的格式就是协议
  • 协议的设计以及协议的生产和解析才是网络编程中最核心的内容
1.3 网络通讯方式
  • 现有的网络中,网络通讯的方式主要有两种:1、 TCP(传输控制协议)方式
    2、 UDP(用户数据报协议)方式
  • TCP方式需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据
  • UDP方式不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得

2 网络编程技术

2.1 网络编程步骤
2.1.1 客户端网络编程步骤
  • 客户端的编程主要由三个步骤实现:1、 建立网络连接:建立网络连接时需要指定连接到的服务器的IP地址和端口号 2、 交换数据 3、 关闭网络连接
2.1.2 服务器端网络编程步骤
  • 服务器端一般实现程序的核心逻辑以及数据存储等核心功能四个步骤:1、 监听端口 2、 获得连接 3、 交换数据 4、 关闭连接
2.1.3 小结
2.2 Java网络编程技术
  • 和网络编程有关的基本API位于java.net包中
  • InetAddress类:该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部
2.3 TCP编程
  • TCP方式的网络编程,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接,程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了

  • 建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:
    Socket socket1 = new Socket(“192.168.1.103”,10000);
    Socket socket2 = new Socket(“www.sohu.com”,80);

  • 连接一旦建立,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:
    OutputStream os = socket1.getOutputStream(); //获得输出流
    InputStream is = socket1.getInputStream(); //获得输入流

  • 数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:
    socket1.close();

  • TCP类型的服务器端的编写:1.服务器端编程的第一个步骤是监听端口,例ServerSocket ss = new ServerSocket(10000);2.服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用,实现获得连接的代码是:
    Socket socket = ss.accept();
    3.连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反4.在服务器端通信完成以后,关闭服务器端连接。实现的代码为:
    ss.close();

  • 线程池:是池技术的一种,就是在程序启动时首先把需要个数的线程对象创建好,然后当客户端连接到达时从池中取出一个已经创建完成的线程对象使用即可。当客户端连接关闭以后,将该线程对象重新放入到线程池中供其它的客户端重复使用,这样可以提高程序的执行速度,优化程序对于内存的占用等。

  • UDP方式的网络编程在Java语言中的实现:需要使用的类还是包含在java.net包中,在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现,分别是:DatagramSocket、DatagramPacket

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

  • DatagramPacket类实现对于网络中传输的数据封装,该类的对象代表网络中交换的数据,在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些

  • 1.建立连接:只需要建立一个连接对象即可,不需要指定服务器的IP和端口号码。实现的代码为:
    DatagramSocket ds = new DatagramSocket();
    可以通过制定连接使用的端口号来创建客户端连接(使用本地计算机的5000号端口)
    DatagramSocket ds = new DatagramSocket(5000);
    2.发送数据:需要将需要发送的数据内容首先转换为byte数组,然后将数据内容、服务器IP和服务器端口号一起构造成一个DatagramPacket类型的对象,发送时调用网络连接对象中的send方法发送该对象即可
    3.关闭连接:使用连接对象中的close方法即可

  • 不管发送的数据内容是什么,都需要转换为byte数组,将服务器端的IP地址构造成InetAddress类型的对象,将这些信息构造成一个DatagramPacket类型的对象,调用连接对象ds的send方法把DatagramPacket对象发送出去即可

  • UDP方式的同一个网络连接对象,可以发送到达不同服务器端IP或端口的数据包,这点是TCP方式无法做到的

  • 服务器端:1.建立连接:该连接监听某个端口,实现的代码为:
    DatagramSocket ds = new DatagramSocket(10010);
    2.接收客户端发送过来的数据:receive方法,阻塞方法
    3.服务器端需要获得客户端的IP和客户端使用的端口号,示例代码如下:
    //获得客户端的IP
    InetAddress clientIP = receiveDp.getAddress();
    //获得客户端的端口号
    Int clientPort = receiveDp.getPort();
    4.关闭服务器端连接ds.close();

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

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

本周没有问题

代码托管

find src -name "*.java" | xargs cat | grep -v ^$ | wc -l

上周考试错题总结

  • 错题1及原因,理解情况
  • 错题2及原因,理解情况
  • ...

结对及互评

评分标准

  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

  • 参考示例

点评过的同学博客和代码

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

本周学习了网络编程,感觉还是挺难的,毕竟之前从来没有接触过与网络进行联通的编程内容,但是也很有趣,感觉很有实际用处

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 2/2 20/20
第二周 186/186 2/4 18/38
第三周 689/875 3/7 22/60
第四周 242/1117 2/9 30/90
第五周 698/1815 2/9 30/120
第六周 1269/3084 2/9 30/120
第七周 342/3426 2/9 30/120
第八周 398/3824 2/9 30/120
第九周 1198/5012 2/9 30/120
第十周 202/5214 2/9 30/120

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

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

  • 计划学习时间:18小时

  • 实际学习时间:16小时

  • 改进情况:

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

参考资料

posted on 2017-04-25 14:09  方片8  阅读(172)  评论(2编辑  收藏  举报