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

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

教材学习内容总结

教材学习内容总结
Java的网络编程html

网络编程java

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

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

一、创建网络链接:客户端网络编程的第一步都是创建网络链接。在创建网络链接时须要指定链接到的服务器的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();

Java网络编程技术:

一个基础的网络类——InetAddress类。该类的功能是表明一个IP地址,而且将IP地址和域名相关的操做方法包含在该类的内部。
以下代码

import java.net.*;
public class InetAddressDemo {
    public static void main(String[] args) {
        try{
            //使用域名建立对象
            InetAddress inet1 = InetAddress.getByName("www.163.com");
            System.out.println(inet1);
            //使用IP建立对象
            InetAddress inet2 = InetAddress.getByName("127.0.0.1");
            System.out.println(inet2);
            //得到本机地址对象
            InetAddress inet3 = InetAddress.getLocalHost();
            System.out.println(inet3);
            //得到对象中存储的域名
            String host = inet3.getHostName();
            System.out.println("域名:" + host);
            //得到对象中存储的IP
            String ip = inet3.getHostAddress();
            System.out.println("IP:" + ip);
        }catch(Exception e){}
    }
}

运行结果如图:image
网络协议

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

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

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

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

一、 客户端发送协议格式的生成
二、 服务器端反馈数据格式的解析
服务器端程序须要完成的处理为:

一、 服务器端反馈协议格式的生成
二、 客户端发送协议格式的解析
4.对于一种网络程序来讲,网络协议格式是该程序最核心的技术秘密。
网络编程示例

1.质数判别示例

(1)程序功能

客户端程序功能:

a) 接收用户控制台输入

b) 判断输入内容是否合法

c) 按照协议格式生成发送数据

d) 发送数据

e) 接收服务器端反馈

f) 解析服务器端反馈信息,并输出
服务器端程序功能:

a) 接收客户端发送数据

b) 按照协议格式解析数据

c) 判断数字是不是质数

d) 根据判断结果,生成协议数据

e) 将数据反馈给客户端
(2)协议格式

客户端发送协议格式:

将用户输入的数字转换为字符串,再将字符串转换为byte数组便可。
客户端发送“quit”字符串表明结束链接。
服务器端发送协议格式:

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

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

  • 问题1:

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

  • xx1问题:以下代码:
import java.io.*;
import java.net.*;
public class SimpleSocketClient {
    public static void main(String[] args) {
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        //服务器端IP地址
        String serverIP = "127.0.0.1";
        //服务器端端口号
        int port = 10001;
        //发送内容
        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) {}
        }
    }
}

运行时出现以下错误:image

  • xx1解决方案:将
int port = 10001;

改成

int port = 10000;

运行结果正确

  • xx问题2:以下代码:
import java.io.*;
import java.net.*;
public class SimpleSocketClient {
    public static void main(String[] args) {
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
        //服务器端IP地址
        String serverIP = "127.0.0.1";
        //服务器端端口号
        int port = 10000;
        //发送内容
        String data = "Hello";
        try {
            //创建链接
            socket = new Socket(serverIP,port);
            //发送数据
            os = socket.getOutputStream();
            os.write(data.getBytes());
            //接收数据
            byte[] b = new byte[1024];
            is = socket.getInputStream();
            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) {}
        }
    }
}

运行出以下错误:image

  • xx2解决方案
  • ...

代码托管

  • 代码提交过程截图:
    • 运行 git log --pretty=format:"%h - %an, %cd : %s" 并截图
  • 代码量截图:
    • 运行 find src -name "*.java" | xargs cat | grep -v ^$ | wc -l 并截图image

上周考试错题总结

本周考试的内容是第二次实验和数据库创建,暂时没有答案,还要继续学习数据库的知识。

评分标准

  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

  • 参考示例

点评过的同窗博客和代码

  • 本周结对学习状况
    • 20155224
    • 结对照片image
    • 结对学习内容
      • 上周错题的理解与掌握。
      • 第十五章教材学习中遇到的问题进行讨论。
      • 第十五章代码调试中遇到的问题进行讨论。
  • 上周博客互评状况
代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 120/120 1/4 16/16 开始了JAVA学习的第一步!
第二周 346/466 1/5 23/36 了解并学习了Java基础语法
第三周 364/830 1/6 21/57 进一步了解java设计语句
第四周 570/1300 2/8 20/77 初步学习了继承与多态,接口与多态知识。
第五周 1056/2356 1/9 23/100 了解Java的异常处理,学习Collection和Map架构
第六周 960/3100 1/10 22/122 了解串流设计和线程
第七周 427/3527 2/12 20/144 了解Java中的时间,完成第二次实验
第八周 900/4400 1/13 20/164 初步了解了正则表达式
第九周 498/4950 2/15 20/184 初步学会使用MySQL
第十周 956/5000 1/16 20/204 初步学习了网络编程

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

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

参考资料

相关文章
相关标签/搜索