20155318 2016-2017-2 《Java程序设计》第十周学习总结
教材学习内容总结
学习目标
- 了解计算机网络基础
- 掌握Java Socket编程
- 理解混合密码系统
- 掌握Java 密码技术相关API的使用
计算机网络
- 在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34。每个计算机在联网以后都拥有一个唯一的合法IP地址。
- 一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。
网络编程
- 概念:两个或多个程序之间的数据交换,在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
- C/S结构和B/S结构是现在网络编程中常见的两种结构,B/S结构其实也就是一种特殊的C/S结构。
- P2P程序是一种特殊的程序,应该一个P2P程序中既包含客户端程序,也包含服务器端程序,例如BT,使用客户端程序部分连接其它的种子(服务器端),而使用服务器端向其它的BT客户端传输数据。
客户端网络编程步骤
- 建立网络连接:在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
- 交换数据:交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
- 关闭网络连接:在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。
服务器端网络编程步骤
- 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
- 获得连接:般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。
- 交换数据:先接收再发送,当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。
- 关闭连接:当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。
网络通讯
在现有的网络中,网络通讯的方式主要有两种:
- TCP(传输控制协议)方式
- UDP(用户数据报协议)方式
- 重要的数据一般使用TCP方式进行数据传输,而大量的非核心数据则都通过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。
Java网络编程技术
InetAddress
类:代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部
TCP编程
- 创建Socket类型的对象,该对象代表网络连接。
Socket socket1 = new Socket(“192.168.1.103”,10000);
- 将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据
OutputStream os = socket1.getOutputStream(); //获得输出流
InputStream is = socket1.getInputStream(); //获得输入流
- 关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作。
socket1.close();
UDP方式的网络编程
- 建立连接。其中UDP方式的建立连接和TCP方式不同,只需要建立一个连接对象即可,不需要指定服务器的IP和端口号码。
- 发送数据,先转换为byte数组,然后将数据内容、服务器IP和服务器端口号一起构造成一个
DatagramPacket
类型的对象。 - 接收数据,首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。然后以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象的receive方法接收数据。接收到的服务器端反馈数据存储在DatagramPacket类型的对象内部。
- 关闭连接。UDP方式不建立专用的虚拟连接,但是连接对象还是需要占用系统资源,所以在使用完成以后必须关闭连接。关闭连接使用连接对象中的close方法
教材学习中的问题和解决过程
- 问题1: TCP协议和UDP协议的区别?
- 解决方案:这个问题不涉及Java的知识,是纯粹的计算机网络的问题。TCP协议是传输控制协议,UDP协议是用户数据报协议,两者都是传输层的协议,主要区别在于前者是可靠的,面向连接的协议,后者是不可靠的,无连接的协议。其它的区别还有,TCP协议传输速度慢,UDP常用于一次性传输比较少量数据的网络应用。
- 问题2:Java Socket运行常出现异常
- 解决方案:上网查询后,参考了Java Socket常见异常处理和 网络编程需要注意的问题这篇博客中提到的问题,总结如下:
java.net.BindException:Address already in use: JVM_Bind
需要找一个没有被占用的端口java.net.ConnectException: Connection refused: connect
具有ip地址的机器不能找到java.net.SocketException: Socket is closed
异常的原因是本端主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。java.net.SocketException: (Connection reset
或者Connect reset by peer:Socket write error)
由连接断开后的读和写操作引起的java.net.SocketException: Broken pipe
解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接
- 这些异常我还不能全部处理,但博客中的总结非常好
代码调试中的问题和解决过程
本周代码暂未遇到什么问题~
代码托管
代码行数统计
上周考试错题总结
上周测试了实验方面的内容,还不知道错题是哪些……提醒我今后必须更加注意实验方面的内容。
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
结对照片
结对学习内容
- 学习partner的代码并作出点评
- 学习partner的博客和自己的博客做对比,找出不足
- 上周博客互评情况
其他(感悟、思考等,可选)
Java学习接近尾声,这周又换了一个新的教材,开始为Java的Android平台学习做准备,这和自己的大创项目有非常大的关系,自己也会更用心去了解这方面的知识。
学习进度条
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 50/100 | 1/1 | 24/24 | 安装学习Java的一系列软件 |
第二周 | 250/300 | 1/2 | 30/54 | 了解Java的基本语法 |
第三周 | 552/852 | 1/3 | 16/60 | 了解Java是面向对象的语言 |
第四周 | 717/1569 | 1/4 | 10/70 | 了解Java继承与接口 |
第五周 | 495/2064 | 1/5 | 6/76 | 了解异常处理,学会使用Collection收集对象 |
第六周 | 754/2818 | 1/6 | 6/82 | 了解串流和线程 |
第七周 | 679/3493 | 2/8 | 5/87 | 了解时间与日期,掌握Date和Calendar的一些用法 |
第八周 | 352/3845 | 1/9 | 8/95 | 了解并会使用通用API |
第九周 | 1203/5048 | 2/11 | 5/100 | 了解通用JDBC等相关知识,完成第二次实验 |
第十周 | 1204/6252 | 1/12 | 5/105 | 了解网络编程等相关知识 |
计划学习时间:6小时
实际学习时间:5小时