20145218 《Java程序设计》第10周学习总结

20145218 《Java程序设计》第10周学习总结

教材学习内容总结

网络编程

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

13.1 网络概述

网络编程技术是当前一种主流的编程技术,随着联网趋势的逐步增强以及网络应用程序的大量出现,所以在实际的开发中网络编程技术获得了大量的使用。

13.1.1 计算机网络概述

  • 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含的设备有:计算机、路由器、交换机等等。
  • IP:为了能够方便的识别网络上的每个设备,网络中的每个设备都会有一个唯一的数字标识。现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34。每个接入网络的计算机都拥有唯一的IP地址,这个IP地址可能是固定的。
  • 域名(Domain Name):一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。域名的概念可以类比手机中的通讯簿,由于手机号码不方便记忆,所以添加一个姓名标识号码,在实际拨打电话时可以选择该姓名,然后拨打即可。
  • DNS服务器:在网络中传输的数据,全部是以IP地址作为地址标识,所以在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析。IP地址的使用要比域名通用一些。
  • 端口(port):在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了。端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口。前台总机的电话号码就相当于IP地址,而每个员工的分机号就相当于端口。

13.1.2 网络编程概述

  • 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
  • 客户端/服务器结构,也叫做Client/Server结构,简称C/S结构。优势在于表现力丰富,而服务器端也需要专门进行开发;缺点在于通用性差,几乎不能通用等。
  • 浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构。优点是开发的压力比较小,不需要维护客户端。缺点是限制比较大,表现力不强,无法进行系统级操作等。
  • P2P(Point to Point)程序:一种特殊的程序,程序中既包含客户端程序,也包含服务器端程序。
  • 协议(Protocol):协议可以随意编写,只要按照这种协议格式能够生成唯一的编码,按照该编码可以唯一的解析出发送数据的内容即可。也正因为各个网络程序之间协议格式的不同,所以才导致了客户端程序都是专用的结构。

13.1.3 网络通讯方式

在现有的网络中,网络通讯的方式主要有两种:

1.TCP(传输控制协议)方式:进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。

2.UDP(用户数据报协议)方式:进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

13.2 网络编程技术

13.2.1 网络编程步骤

13.2.1.1 客户端网络编程步骤

客户端的编程主要由三个步骤实现:

  • 建立网络连接:在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
  • 交换数据:连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
    根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。
  • 关闭网络连接:在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。
13.2.1.2 服务器端网络编程步骤
  • 监听端口:服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
  • 获得连接:当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。
  • 交换数据:服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。这个和客户端的数据交换数序不同。服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。
  • 关闭连接:当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。

13.2.2 Java网络编程技术

  • InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。
  • 练习截图如下:
13.2.2.1 TCP编程

在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。

  • Java语言中客户端的实现步骤:

    • 建立连接:
      Socket socket1 = new Socket(“192.168.1.103”,10000);
      Socket socket2 = new Socket(“www.sohu.com”,80);
    • 数据交换:
      OutputStream os = socket1.getOutputStream(); //获得输出流
      InputStream is = socket1.getInputStream(); //获得输入流
    • 关闭网络连接:
      socket1.close();
  • Java语言中服务端的实现步骤:

    • 监听端口:
      ServerSocket ss = new ServerSocket(10000);
    • 获得连接:
      Socket socket = ss.accept();
    • 数据交换:
      socket = serverSocket.accept(); //接收客户端发送内容
      is = socket.getInputStream();
    • 关闭网络连接:
      ss.close();
  • 向服务器端发送一个字符串“Hello”,并将服务器端的反馈显示到控制台,数据交换只进行一次,当数据交换进行完成以后关闭网络连接,程序结束。截图如下:

13.2.2.2 UDP编程

1、如何复用Socket连接?

实例:实现建立一次连接,进行多次数据交换呢。其实很简单,建立连接以后,将数据交换的逻辑写到一个循环中就可以了。这样只要循环不结束则连接就不会被关 闭。按照这种思路,可以改造一下上面的代码,让该程序可以在建立连接一次以后,发送三次数据,当然这里的次数也可以是多次。

  • 运行示例截图:

2、如何使服务器端支持多个客户端同时工作?
实例:MulThreadSocketServer类实现服务器端控制,实现接收客户端连接,然后开启专门的逻辑线程处理该连接,LogicThread类实现对于一个客户端连接的逻辑处理,将处理的逻辑放置在该类的run方法中。

  • 运行示例截图:

  • 主要使用两个类:

    1.DatagramSocket:实现“网络连接”,包括客户端网络连接和服务器端网络连接。虽然UDP方式的网络通讯不需要建立专用的网络连接,但是毕竟还是需要发送和接收数据,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。

    2.DatagramPacket:实现对于网络中传输的数据封装。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。其实DatagramPacket类的作用类似于现实中的信件,在信件中包含信件发送到的地址以及接收人,还有发送的内容等,邮局只需要按照地址传递即可。在接收数据时,接收到的数据也必须被处理成DatagramPacket类型的对象,在该对象中包含发送方的地址、端口号等信息,也包含数据的内容。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。

  • Java语言中客户端的实现步骤:

    • 建立连接:
      DatagramSocket ds = new DatagramSocket();
      或者
      DatagramSocket ds = new DatagramSocket(5000);
    • 数据交换:
      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);
      //构造缓冲数组
      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);
    • 关闭网络连接:
      ds.close();
  • Java语言中服务端的实现步骤:

    • 监听端口:
      DatagramSocket ds = new DatagramSocket(10010);
    • 数据交换:同客户端,发送时需要端口号
      //获得客户端的IP
      InetAddress clientIP = receiveDp.getAddress();
      //获得客户端的端口号
      Int clientPort = receiveDp.getPort();
    • 关闭网络连接:
      ds.close();

13.3 网络协议

网络协议是指对于网络中传输的数据格式的规定。网络协议设计完成以后,在进行网络编程时,就需要根据设计好的协议格式,在程序中进行对应的编码。

  • 客户端程序和服务器端程序需要进行协议处理的代码分别如下:

    1.客户端程序需要完成的处理为:

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

    2.服务器端程序需要完成的处理为:

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

代码托管截图

代码产生问题及解决

在运行SimpleSocketClient.java和SimpleSocketServer.java时,如果想要两个人结对做,一个人做服务器另一个人做客户端是完不成的,当然前提是已经修改代码中的IP地址,但使用一台电脑就可以了,既做服务器又做客户端,不知道为什么。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 200/400 1/3 20/40
第三周 500/900 1/4 30/70
第四周 1292/2192 1/5 30/100
第五周 993/3185 1/6 40/140
第六周 1082/4267 2/8 50/190
第七周 656/4923 2/10 30/220
第八周 205/5128 2/12 30/220
第九周 972/6100 2/14 30/250
第十周 1159/7259 2/16 30/250
posted @ 2016-05-07 22:30  20145218  阅读(105)  评论(1编辑  收藏  举报