20155308 2016-2017-2 《Java程序设计》第10周学习总结
20155308 2016-2017-2 《Java程序设计》第10周学习总结
教材学习内容总结
网络概述
- 计算机网络:通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含的设备有:计算机、路由器、交换机等等。
- IP地址:网络中的每个设备都会有一个唯一的数字标识,命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成。
- 域名:一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。
- 域名解析:通过DNS服务器将域名转换为IP地址。
- 端口(port):在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了,也就是一个计算机上可以并发运行多个网络程序,而不会在互相之间产生干扰。
网络编程概述
-
网络通讯的方式
- TCP(传输控制协议)方式
- UDP(用户数据报协议)方式
这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。
-
网络编程技术
-
客户端的编程主要由三个步骤实现:
- 建立网络连接:建立网络连接时需要指定连接到的服务器的IP地址和端口号
- 交换数据
- 关闭网络连接
-
服务器端网络编程步骤
服务器端一般实现程序的核心逻辑以及数据存储等核心功能四个步骤:
- 监听端口
- 获得连接
- 交换数据
- 关闭连接
- Java网络编程技术:
- 一个基础的网络类——InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。
- InetAddressDemo.java代码运行示例如下
TCP编程
- 网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,如果发送的一方发送的数据接收方觉得有问题,则网络底层会自动要求发送方重发,直到接收方收到为止。
- TCP客户端编程:
- 在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:
Socket socket = new Socket(“192.168.1.103”,10000);
- 连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可:
OutputStream os = socket1.getOutputStream(); //获得输出流
InputStream is = socket1.getInputStream(); //获得输入流
- 最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作:
socket.close();
SimpleSocketClient.java
SimpleSocketClient.java代码运行示例如下:
- TCP服务器编程
- 在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达:
ServerSocket ss = new ServerSocket(10000);
- 然后是获得连接,当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用:
Socket socket = ss.accept();
- 连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反。
- 最后,在服务器端通信完成以后,关闭服务器端连接:
ss.close();
代码运行示例如下:
复用连接客户端:
- 建立连接以后,将数据交换的逻辑写到一个循环中,这样只要循环不结束则连接就不会被关闭,可以用这样的方式来实现建立一次连接,进行多次数据交换。
MulSocketClient.java代码运行示例如下:
复用连接服务器:
- 按照客户端实现的逻辑,也可以复用服务器端的连接,实现的原理也是将服务器端的数据交换逻辑写在循环中。
MulSocketServer.java代码运行示例如下:
多客户端的服务器:
- 一个服务器端一般都需要同时为多个客户端提供通讯,当服务器端接收到一个连接时,启动一个专门的线程处理和该客户端的通讯,这样就可以支持多个客户端。
- MulThreadSocketServer类实现服务器端控制,实现接收客户端连接,然后开启专门的逻辑线程处理该连接,LogicThread类实现对于一个客户端连接的逻辑处理,将处理的逻辑放置在该类的run方法中。
UDP编程
UDP客户端编程:
- 建立连接
- 发送数据
- 接收数据
- 关闭连接。
SimpleUDPClient.java代码运行示例如下:
UDP服务器编程:
- 基本上也与TCP服务器编程类似,不过使用的对象不同。
SimpleUDPServer.java代码运行示例如下:
这个代码我的运行有问题,还未解决!
网络协议
- 网络协议的实质也是客户端程序和服务器端程序对于数据的一种约定,只是由于以计算机为基础,所以更多的是使用数字来代表内容,这样就显得比较抽象一些。
- 客户端程序需要完成的处理为:
- 客户端发送协议格式的生成
- 服务器端反馈数据格式的解析
- 服务器端程序需要完成的处理为:
- 服务器端反馈协议格式的生成
- 客户端发送协议格式的解析
质数判别示例
- 客户端程序功能:
- 接收用户控制台输入
- 判断输入内容是否合法
- 按照协议格式生成发送数据
- 发送数据
- 接收服务器端反馈
- 解析服务器端反馈信息,并输出
代码运行示例如下:
- 服务器端程序功能:
- 接收客户端发送数据
- 按照协议格式解析数据
- 判断数字是否是质数
- 根据判断结果,生成协议数据
- 将数据反馈给客户端
代码运行示例如下:
猜数字小游戏
- 客户端程序功能列表:
- 接收用户控制台输入
- 判断输入内容是否合法
- 按照协议格式发送数据
- 根据服务器端的反馈给出相应提示
- 服务器端程序功能列表:
- 接收客户端发送数据
- 按照协议格式解析数据
- 判断发送过来的数字和随机数字的关系
- 根据判断结果生产协议数据
- 将生产的数据反馈给客户端
代码调试中的问题
-
问题1:为什么会出现这种情况
-
问题1解决:我认为是运行过慢的结果,因为在多次尝试后一段时间就会出现结果,但是并不确定
-
问题2:为什么会出现这种情况
-
问题2解决:我看到学长的博客中写到了这个问题,是因为端口号被占用了,改了一个端口号就好了。
代码托管
上周考试错题总结
- 错题1:在下面,你将看到一堆杂乱的类与接口,这是取自一个动作冒险游戏。你将看到代表游戏角色的类,以及武器行为的类。每个角色一次只能使用一个武器,但是可以在游戏的过程中换武器。你的工作是要弄清楚这一切. . .
a) 把下面散乱的类画成一个UML类图, 找出一个抽象类、一个接口、以及四个具体类,画出类之间的关系:继承,实现接口 - 理解情况:King,Queen继承Character抽象类, AxeBehavior、BowAndArrayBehavior实现WeaponBehavior接口,Character依赖WeaponBehavior。这个问题的错误体现了我对接口和继承方面知识的不了解,并没有很好地熟练地掌握这方面的知识,自己在今后的学习中应该多加注意!
结对及互评
点评过的同学博客和代码
- 本周结对学习情况:学习新的知识,感觉结果还可以
- 20155316
- 结对学习内容:学习新的知识
- 上周博客互评情况
- 20155311
- 20155333
- 20155227
- 20155213
- 20155228
其他(感悟、思考等,可选)
- 本周的学习是进行网络编程,学习网络编程,感觉还是挺难的,毕竟之前从来没有接触过与网络有关的编程内容,其实当自己真正接触到的时候才会发现并没有想象中的那么难理解,很有趣。通过新的知识的学习,使我感觉更加了解了网络知识。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第十周 | 872/4475 | 1/13 | 30/231 | |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。 耗时估计的公式 :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。 参考:软件工程软件的估计为什么这么难,软件工程 估计方法 |
- 计划学习时间:30小时
- 实际学习时间:30小时
- 改进情况:有所改进 (有空多看看现代软件工程 课件 软件工程师能力自我评价表)