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

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

教材学习内容总结

网络编程
•网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所做的事情就是把数据发送到指定的位置,或者接收到指定的数据。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只须要调用便可。html

网络概述

•1.1计算机网络概述:

照计算机网络的定义,经过必定的物理设备将处于不一样位置的计算机链接起来组成的网络,这个网络中包含的设备有:计算机、路由器、交换机等等。java

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

为了可以方便的识别网络上的每一个设备,网络中的每一个设备都会有一个惟一的数字标识,这个就是IP地址。编程

一个IP地址能够对应多个域名,一个域名只能对应一个IP地址。数组

注意: 在硬件上规定,端口的号码必须位于0-65535之间,每一个端口惟一的对应一个网络程序,一个网络程序可使用多个端口。浏览器

•1.2网络编程概述:

网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不一样就是须要交换数据的程序运行在不一样的计算机上,这样就形成了数据交换的复杂。服务器

“请求-响应”模型:也就是通信的一端发送数据,另一端反馈数据,网络通信都基于该模型。网络

客户端/服务器结构:也叫作Client/Server结构,简称C/S结构。一旦通信创建,则客户端和服务器端彻底同样,没有本质的区别。这种结构的优点表现力丰富,而服务器端也须要专门进行开发。可是这种结构也存在着不少不足,例如通用性差,实际维护时,也须要维护专门的客户端和服务器端,维护的压力比较大。socket

浏览器/服务器结构:也叫作Browser/Server结构,简称为B/S结构。 使用B/S结构的程序,在开发时只须要开发服务器端便可,这种结构的优点在于开发的压力比较小,不须要维护客户端。tcp

P2P(Point to Point)程序:是一种特殊的程序,应该一个P2P程序中既包含客户端程序,也包含服务器端程序。

协议(Protocol):网络中传输的数据格式在网络编程中就被称做协议。

•1.3网络通信方式:

一、TCP(传输控制协议)方式 :TCP方式就相似于拨打电话,使用该种方式进行网络通信时,须要创建专门的虚拟链接,而后进行可靠的数据传输,若是数据发送失败,则客户端会自动重发该数据。

二、 UDP(用户数据报协议)方式:而UDP方式就相似于发送短信,使用这种方式进行网络通信时,不须要创建专门的虚拟链接,传输也不是很可靠,若是发送失败则客户端没法得到。

小结:重要的数据通常使用TCP方式进行数据传输,而大量的非核心数据则都经过UDP方式进行传递,在一些程序中甚至结合使用这两种方式进行数据的传递。因为TCP须要创建专用的虚拟链接以及确认传输是否正确,因此使用TCP方式的速度稍微慢一些,并且传输时产生的数据量要比UDP稍微大一些。

网络编程技术

•2.1网络编程步骤

这里的步骤实现和语言无关,也就是说,这个步骤适用于各类语言实现。

•2.1.1客户端网络编程步骤:

•创建网络链接:客户端网络编程的第一步都是创建网络链接。在创建网络链接时须要指定链接到的服务器的IP地址和端口号,创建完成之后,会造成一条虚拟的链接,后续的操做就能够经过该链接实现数据交换了。

•交换数据:链接创建之后,就能够经过这个链接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,若是客户端不发送请求则服务器端就不响应。根据逻辑须要,能够屡次交换数据,可是仍是必须遵循请求响应模型。

•关闭网络链接:在数据交换完成之后,关闭网络链接,释放程序占用的端口、内存等系统资源,结束网络编程。

•2.1.2服务器端网络编程步骤:

•监听端口:服务器端属于被动等待链接,因此服务器端启动之后,不须要发起链接,而只须要监听本地计算机的某个固定端口便可。

•得到链接:当客户端链接到服务器端时,服务器端就能够得到一个链接,这个链接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也经过该链接进行数据交换。

•交换数据:当客户端链接到服务器端时,服务器端就能够得到一个链接,这个链接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也经过该链接进行数据交换。

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

•Java网络编程技术

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

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

•TCP编程

若是发送的一方发送的数据接收方以为有问题,则网络底层会自动要求发送方重发,直到接收方收到为止。

在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类表明客户端链接,以java.net.ServerSocket类表明服务器端链接。

•UDP编程

UDP(User Datagram Protocol),中文意思是用户数据报协议,方式相似于发短信息,是一种物美价廉的通信方式,使用该种方式无需创建专用的虚拟链接。

网络编程中也是这样,必需要求可靠传输的信息通常使用TCP方式实现,通常的数据才使用UDP方式实现。

在Java API中设计的实现结构和TCP方式不太同样。固然,须要使用的类仍是包含在java.net包中。

在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现:

一、DatagramSocket类实现“网络链接”,包括客户端网络链接和服务器端网络链接。

二、DatagramPacket类实现对于网络中传输的数据封装,也就是说,该类的对象表明网络中交换的数据。在UDP方式的网络编程中,不管是须要发送的数据仍是须要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。

网络协议

网络协议是指对于网络中传输的数据格式的规定。网络协议的实质也是客户端程序和服务器端程序对于数据的一种约定,只是因为以计算机为基础,因此更多的是使用数字来表明内容,这样就显得比较抽象一些。

网络协议就是一种格式上的约定,能够根据逻辑的须要约定出各类数据格式,在进行设计时通常遵循“简单、通用、容易解析”的原则进行。

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

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

网络协议格式是该程序最核心的技术秘密,由于一旦协议格式泄漏,则任何一我的均可以根据该格式进行客户端的编写,这样将影响服务器端的实现,也容易出现一些其它的影响。

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

首先关于IP地址和域的关系,并不太懂之间的联系,是IP包含域?仍是域包含IP地址?这块的知识在计算机网络上就存在些许的问题。我以为这篇文章将IP地址和域比喻成手机号码和手机通信录名单,一我的能够有不少个手机号码,但是一个手机号码只能有一我的对应。同理,一个域名能够对应许多个IP地址,可是一个IP地址只能有一个IP地址。

•一样的什么是域?以前只是很简单的讲了域和IP地址的关系,可是域的具体定义却没有给出。百度后"域"的真正含义指的是服务器控制网络上的计算机可否加入的计算机组合。

•是关于协议的问题,协议存在的具体做用是什么?学习事后对于这个问题有了了解,协议的真正做用是一种格式,对于不一样的电脑,不一样的程序有不一样的数据格式,而对于这种数据格式的规定就是协议。

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

-首先操做关于java网络类名操做

package cc.openhome;

        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){}
        }
    }

关于这段代码,是按照学习材料上操做过来的,可是最开始显示失败了,后来又仔细看学习材料,java这个网络InetAddress类必须有网络的链接才可使用。

•关于TCP编程链接部分,以java.net.Socket类表明客户端链接,以java.net.ServerSocket类表明服务器端链接。因此创建客户端网络链接,也就是建立Socket类型的对象,该对象表明网络链接。

Socket socket1 = new Socket(“192.168.1.103”,10000);
 Socket socket2 = new Socket(“www.blog.com”,80);

关于这段代码,socket1实现的是链接到IP地址是192.168.1.103的计算机的10000号端口,而socket2实现的是链接到域名是www.blog.com的计算机的80号端口,若是创建链接时,本机网络不通,或服务器端程序未开启,则会抛出异常。

•关于如何复用Socket链接?经过看才料后,其实很简单,创建链接之后,将数据交换的逻辑写到一个循环中就能够了。这样只要循环不结束则链接就不会被关闭。
package tcp;
import java.io.;
import java.net.;

public class MulSocketClient {
 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[] ={"First","Second","Third"};
           try {
                    //创建链接
                    socket = new Socket(serverIP,port);
                    //初始化流
                    os = socket.getOutputStream();
                    is = socket.getInputStream();
                    byte[] b = new byte[1024];
                    for(int i = 0;i < data.length;i++){
                             //发送数据
                             os.write(data              [i].getBytes());
                             //接收数据
                             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) {}
           }
 }
}

这段代码将数据交换部分的逻辑写在一个for循环的内容,这样就能够创建一次链接,依次将data数组中的数据按照顺序发送给服务器端了。就能够实现复用Socket链接。

结对及互评

点评过的同窗博客和代码

评分标准

  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分

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

这周是学习的内容是学习网络编程,已经到了java语言运用的地方了,不少知识点在其余的课堂上有接触,但发现仍是有不足,这周的代码更多的主要仍是学习材料里的代码进行操做,本身的动手编译程序的水平还欠缺一点。虽然到了java运用的时候,但仍是要把握好java语言基本的知识点,这才是最重要的。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第五周 107/200 1/2 12

参考资料

相关文章
相关标签/搜索