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

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

教材学习内容总结

Java的网络编程

网络编程

网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。
网络概述html

1.计算机网络概述

(1)路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,经过光纤、网线等链接将设备链接起来,从而造成了一张巨大的计算机网络。java

(2)网络最主要的优点在于共享:共享设备和数据,如今共享设备最多见的是打印机。git

(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结构。优点:客户端是专门开发的,根据须要实现各类效果;劣势:通用性差,几乎不能通用等,在实际维护时,也须要维护专门的客户端和服务器端,维护的压力比较大。socket

(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)客户端网络编程步骤

一、创建网络链接:客户端网络编程的第一步都是创建网络链接。在创建网络链接时须要指定链接到的服务器的IP地址和端口号,创建完成之后,会造成一条虚拟的链接,后续的操做就能够经过该链接实现数据交换了。
二、交换数据:链接创建之后,就能够经过这个链接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,若是客户端不发送请求则服务器端就不响应。根据逻辑须要,能够屡次交换数据,可是仍是必须遵循请求响应模型。
三、关闭网络链接:在数据交换完成之后,关闭网络链接,释放程序占用的端口、内存等系统资源,结束网络编程。

(2)服务器端网络编程步骤

一、 监听端口:服务器端属于被动等待链接,因此服务器端启动之后,不须要发起链接,而只须要监听本地计算机的某个固定端口便可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。

二、 得到链接:当客户端链接到服务器端时,服务器端就能够得到一个链接,这个链接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也经过该链接进行数据交换。通常在服务器端编程中,当得到链接时,须要开启专门的线程处理该链接,每一个链接都由独立的线程实现。

三、 交换数据:服务器端经过得到的链接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,而后进行逻辑处理,再把处理之后的结果数据发送给客户端。简单来讲,就是先接收再发送,这个和客户端的数据交换数序不一样。其实,服务器端得到的链接和客户端链接是同样的,只是数据交换的步骤不一样。固然,服务器端的数据交换也是能够屡次进行的。在数据交换完成之后,关闭和客户端的链接。

四、 关闭链接:当服务器程序关闭时,须要关闭服务器端,经过关闭服务器端使得服务器监听的端口以及占用的内存能够释放出来,实现了链接的关闭。

(3)TCP方式是须要创建链接的,对于服务器端的压力比较大,而UDP是不须要创建链接的,对于服务器端的压力比较小。

2.Java网络编程技术

(1)和网络编程有关的基本API位于~java.net~包中,该包中包含了基本的网络编程实现,该包是网络编程的基础。该包中既包含基础的网络编程类,也包含封装后的专门处理WEB相关的处理类。

(2)InetAddress类:该类的功能是表明一个IP地址,而且将IP地址和域名相关的操做方法包含在该类的内部。

3.TCP编程

(1)TCP方式的网络通信是指在通信的过程当中保持链接,只须要创建一次网络链接,就能够屡次传输数据。

(2)以~java.net.Socket~类表明客户端链接,以~java.net.ServerSocket~类表明服务器端链接。程序员实际编程时,只须要指定IP地址和端口号码就能够创建链接了。

(3)客户端网络编程:首先须要创建链接,在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();

(4)简单的网络客户端程序示例:

若是须要在控制台下面编译和运行该代码,须要首先在控制台下切换到源代码所在的目录,而后依次输入编译和运行命令:

javac –d . SimpleSocketClient.java

 java tcp.SimpleSocketClient

(5)服务器端程序编程:因为服务器端实现的是被动等待链接,因此服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端链接到达。实现服务器端监听的代码为:

ServerSocket ss = new ServerSocket(10000);

服务器端编程的第二个步骤是得到链接。该步骤的做用是当有客户端链接到达时,创建一个和客户端链接对应的Socket连 接对象,从而释放客户端链接对于服务器端端口的占用。实现功能就像公司的前台同样,当一个客户到达公司时,会告诉前台我找某某某,而后前台就通知某某某, 而后就能够继续接待其它客户了。经过得到链接,使得客户端的链接在服务器端得到了保持,另外使得服务器端的端口释放出来,能够继续等待其它的客户端链接。 实现得到链接的代码是:

Socket socket = ss.accept();

最后,在服务器端通讯完成之后,关闭服务器端链接。实现的代码为:

ss.close();

(6)echo服务器端代码示例:

在控制台下面编译和运行该程序的命令和客户端部分的相似。

(7)复用Socket链接:创建链接之后,将数据交换的逻辑写到一个循环中就能够了。这样只要循环不结束则链接就不会被关闭。

创建一次链接,进行屡次数据交换示例(使用SimpleSocketServer服务器代码):

出现异常的缘由:服务器端是对话一次数据之后就关闭了链接,若是服务器端程序关闭了,客户端继续发送数据确定会出现异常。

复用服务器端的链接示例:

(8)使服务器端支持多个客户端同时工做:服务器端接收到一个链接时,启动一个专门的线程处理和该客户端的通信。改写的服务端示例程序将由两个部分组成,MulThreadSocketServer类实现服务器端控制,实现接收客户端链接,而后开启专门的逻辑线程处理该链接,LogicThread类实现对于一个客户端链接的逻辑处理,将处理的逻辑放置在该类的run方法中。

(9)线程池(Thread pool):就是在程序启动时首先把须要个数的线程对象建立好。能够提升程序的执行速度,优化程序对于内存的占用等。

4.UDP方式的编程

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

(2)DatagramPacket类:实现对于网络中传输的数据封装,也就是说,该类的对象表明网络中交换的数据。在UDP方式的网络编程中,不管是须要发送的数据仍是须要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。

(3)UDP客户端编程涉及的步骤也是4个部分:创建链接、发送数据、接收数据和关闭链接。

首先介绍UDP方式的网络编程中创建链接的实现。其中UDP方式的创建链接和TCP方式不一样,只须要创建一个链接对象便可,不须要指定服务器的IP和端口号码。实现的代码为:

DatagramSocket ds = new DatagramSocket();

固然,能够经过制定链接使用的端口号来建立客户端链接。

DatagramSocket ds = new DatagramSocket(5000);

接着,介绍一下UDP客户端编程中发送数据的实现。在UDP方式的网络编程中,IO技术不是必须的,在发送数据时,须要将须要发送的数据内容首先转换为byte数组,而后将数据内容、服务器IP和服务器端口号一块儿构形成一个DatagramPacket类型的对象,这样数据的准备就完成了,发送时调用网络链接对象中的send方法发送该对象便可。例如将字符串“Hello”发送到IP是127.0.0.1,端口号是10001的服务器,则实现发送数据的代码以下:

String s = “Hello”;
String host = “127.0.0.1”;
int port = 10001;
//将发送的内容转换为byte数组
byte[] b = s.getBytes();
//将服务器IP转换为InetAddress对象
InetAddress server = InetAddress.getByName(host);
//构造发送的数据包对象
DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port);
//发送数据
ds.send(sendDp);

下面介绍一下UDP客户端编程中接收数据的实现。当数据发送出去之后,就能够接收服务器端的反馈信息了。接收数据在Java语言中的实现是这样的:首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。而后以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用链接对象的receive方法接收数据便可。接收到的服务器端反馈数据存储在DatagramPacket类型的对象内部。实现接收数据以及显示服务器端反馈内容的示例代码以下:

//构造缓冲数组
byte[] data = new byte[1024];
//构造数据包对象
DatagramPacket received = new DatagramPacket(data,data.length);
//接收数据
ds.receive(receiveDp);
//输出数据内容
byte[] b = receiveDp.getData(); //得到缓冲数组
int len = receiveDp.getLength(); //得到有效数据长度
String s = new String(b,0,len);
System.out.println(s);

UDP方式客户端网络编程的最后一个步骤就是关闭链接。虽然UDP方式不创建专用的虚拟链接,可是链接对象仍是须要占用系统资源,因此在使用完成之后必须关闭链接。关闭链接使用链接对象中的close方法便可,实现的代码以下:

ds.close();

(4)UDP方式网络编程的服务器端实现和TCP方式的服务器端实现相似。

首先UDP方式服务器端网络编程须要创建一个链接,该链接监听某个端口,实现的代码为:

DatagramSocket ds = new DatagramSocket(10010);

接收到客户端发送过来的数据之后,服务器端对该数据进行逻辑处理,而后将处理之后的结果再发送给客户端,在这里发送时就比客户端要麻烦一些,由于服务器端须要得到客户端的IP和客户端使用的端口号,这个均可以从接收到的数据包中得到。示例代码以下:

//得到客户端的IP
InetAddress clientIP = receiveDp.getAddress();
//得到客户端的端口号
Int clientPort = receiveDp.getPort();

最后,当服务器端实现完成之后,关闭服务器端链接,实现的方式为调用链接对象的close方法,示例代码以下:

ds.close();

(5)UDP网络编程的基本使用。

网络协议

1.网络协议是指对于网络中传输的数据格式的规定。网络协议的实质也是客户端程序和服务器端程序对于数据的一种约定,使用数字来表明内容,进行设计时通常遵循“简单、通用、容易解析”的原则进行。

2.在网络编程中,对于同一个网络程序来讲,通常都会涉及到两个网络协议格式:客户端发送数据格式和服务器端反馈数据格式,在实际设计时,须要一一对应。

3.客户端程序和服务器端程序须要进行协议处理的代码分别以下。

客户端程序须要完成的处理为:

一、 客户端发送协议格式的生成
二、 服务器端反馈数据格式的解析

服务器端程序须要完成的处理为:

一、 服务器端反馈协议格式的生成
二、 客户端发送协议格式的解析

4.对于一种网络程序来讲,网络协议格式是该程序最核心的技术秘密。

网络编程示例

1.质数判别示例

(1)程序功能

客户端程序功能:

a)         接收用户控制台输入
b)         判断输入内容是否合法
c)         按照协议格式生成发送数据
d)         发送数据
e)         接收服务器端反馈
f)          解析服务器端反馈信息,并输出

服务器端程序功能:

a)         接收客户端发送数据
b)         按照协议格式解析数据
c)         判断数字是不是质数
d)         根据判断结果,生成协议数据
e)         将数据反馈给客户端

(2)协议格式

客户端发送协议格式:

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

客户端发送“quit”字符串表明结束链接。
服务器端发送协议格式:

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

(3)以TCP方式实现程序。

2.猜数字小游戏

(1)程序功能

客户端程序功能列表:

一、 接收用户控制台输入
二、 判断输入内容是否合法
三、 按照协议格式发送数据
四、 根据服务器端的反馈给出相应提示

服务器端程序功能列表:

一、 接收客户端发送数据
二、 按照协议格式解析数据
三、 判断发送过来的数字和随机数字的关系
四、 根据判断结果生产协议数据
五、 将生产的数据反馈给客户端

(2)协议格式

客户端程序协议格式以下:

一、 将用户输入的数字转换为字符串,而后转换为byte数组
二、 发送“quit”字符串表明退出

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

教材学习有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,若是别人没有提出相同问题,能够编辑文档添加,而后把本身提出的问题复制到下面:

  • 问题1:屡次数据交换后出现异常
  • 问题1解决方案:出现异常的缘由:服务器端是对话一次数据之后就关闭了链接,若是服务器端程序关闭了,客户端继续发送数据确定会出现异常。

代码托管

上周考试错题总结

  • 错题1 填空:教材第十章示例代码中(p 305 IO .java )类符合SOLID原则中的OCP和DIP原则。
  • 错题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小时
第一周 10/10 1/1 10/10
第二周 110/200 1/2 10/20
第三周 150/350 1/3 10/30
第四周 400/750 1/4 15/45
第五周 430/1200 1/5 20/65
第六周 700/2000 1/6 20/85
第七周 700/2700 3/9 30/115
第八周 300/3000 1/10 40/135
第九周 500/3500 2/12 65/200
第十周 500/4000 1/13 30/230

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

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

  • 计划学习时间:XX小时

  • 实际学习时间:XX小时

  • 改进状况:

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

参考资料

相关文章
相关标签/搜索