20145221 《Java程序设计》第十周学习总结

网络编程

网络概述

概述

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

计算机网络概述

  • IP地址: 为了能够方便的识别网络上的每个设备,网络中的每个设备都会有一个唯一的数字标识。

    • 在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP地址由4个0-255之间的数字组成,例如10.0.120.34。每个接入网络的计算机都拥有唯一的IP地址,这个IP地址可能是固定的。
    • 但是由于IP地址不容易记忆,所以为了方便记忆,有创造了另外一个概念——域名(Domain Name),例如sohu.com等。一个IP地址可以对应多个域名,一个域名只能对应一个IP地址。域名的概念可以类比手机中的通讯簿,由于手机号码不方便记忆,所以添加一个姓名标识号码,在实际拨打电话时可以选择该姓名,然后拨打即可。
    • 在网络中传输的数据,全部是以IP地址作为地址标识,所以在实际传输数据以前需要将域名转换为IP地址,实现这种功能的服务器称之为DNS服务器,也就是通俗的说法叫做域名解析。例如当用户在浏览器输入域名时,浏览器首先请求DNS服务器,将域名转换为IP地址,然后将转换后的IP地址反馈给浏览器,然后再进行实际的数据传输。

  • 端口(port):

    • 在同一个计算机中每个程序对应唯一的端口,这样一个计算机上就可以通过端口区分发送给每个端口的数据了,换句话说,也就是一个计算机上可以并发运行多个网络程序,而不会在互相之间产生干扰。
    • 在硬件上规定,端口的号码必须位于0-65535之间,每个端口唯一的对应一个网络程序,一个网络程序可以使用多个端口。
    • 这样一个网络程序运行在一台计算上时,不管是客户端还是服务器,都是至少占用一个端口进行网络通讯。在接收数据时,首先发送给对应的计算机,然后计算机根据端口把数据转发给对应的程序。

网络编程概述

  • 服务器与客户端:

    • 在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
    • Client/Server结构:客户端/服务器结构,也叫做Client/Server结构,简称C/S结构。
    • 优势:种结构的优势在于由于客户端是专门开发的,所以根据需要实现各种效果,专业点说就是表现力丰富,而服务器端也需要专门进行开发。
    • 不足:通用性差,几乎不能通用等,也就是说一种程序的客户端只能和对应的服务器端通讯,而不能和其它服务器端通讯,在实际维护时,也需要维护专门的客户端和服务器端,维护的压力比较大。
  • Browser/Server结构:
    • 使用浏览器作为客户端的结构被称作浏览器/服务器结构,也叫做Browser/Server结构,简称为B/S结构。
    • 优势:这种结构的优势在于开发的压力比较小,不需要维护客户端。
    • 不足:例如浏览器的限制比较大,表现力不强,无法进行系统级操作等。
  • P2P(Point to Point)程序:
    • P2P程序是一种特殊的程序,应该一个P2P程序中既包含客户端程序,也包含服务器端程序。
  • 协议(Protocol):
    • 计算机在实际进行数据交换时,为了让接收端理解该数据,计算机比较笨,什么都不懂的,那么就需要规定该数据的格式,这个数据的格式就是协议。

网络通讯方式

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

    • TCP(传输控制协议)方式
    • UDP(用户数据报协议)方式
    • 对于两种方式的描述:在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

网络编程技术

网络编程步骤

  • 无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成。
  • 骤实现和语言无关,也就是说,这个步骤适用于各种语言实现,不局限于Java语言。

客户端网络编程步骤

  • Step1:建立网络连接

    • 客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。
  • Step2:交换数据
    • 连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
    • 根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。
  • Step3:在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。

服务器端网络编程步骤

  • Step1:监听端口

    • 服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。
    • 这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。
  • Step2: 获得连接
    • 当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。
    • 一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。
  • Step3: 交换数据
    • 服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。
    • 其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。
    • 在数据交换完成以后,关闭和客户端的连接。
  • Step4:关闭连接
    • 当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。

Java网络编程技术

  • 一个基础的网络类——InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。
  • InetAddressDemo.java代码运行结果如下:

TCP编程

TCP客户端编程

  • 在客户端网络编程中,首先需要建立连接,在Java API中以java.net.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下:

    Socket socket = new Socket(“192.168.43.105”,8080);
  • 连接建立之后,然后按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可:
OutputStream os = socket1.getOutputStream();   //获得输出流
InputStream is = socket1.getInputStream(); //获得输入流
  • 最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作:

    socket.close();
  • SimpleSocketClient.java代码运行结果如下:

TCP服务器编程

  • 在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达:

    ServerSocket ss = new ServerSocket(8080);
  • 然后是获得连接,当有客户端连接到达时,建立一个和客户端连接对应的Socket连 接对象,从而释放客户端连接对于服务器端端口的占用:

    Socket socket = ss.accept();
  • 连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反。
  • 最后,在服务器端通信完成以后,关闭服务器端连接:

    ss.close();
  • SimpleSocketServer.java代码运行结果如下:

复用连接客户端

  • 原理:建立连接以后,将数据交换的逻辑写到一个循环中,这样只要循环不结束则连接就不会被关闭,可以用这样的方式来实现建立一次连接,进行多次数据交换。
  • MulSocketClient.java代码运行结果如下:

复用连接服务器

  • 原理:按照客户端实现的逻辑,也可以复用服务器端的连接,实现的原理也是将服务器端的数据交换逻辑写在循环中。
  • MulSocketServer.java代码运行结果如下:

多客户端的服务器

  • 一个服务器端一般都需要同时为多个客户端提供通讯,当服务器端接收到一个连接时,启动一个专门的线程处理和该客户端的通讯,这样就可以支持多个客户端。
  • MulThreadSocketServer类实现服务器端控制,实现接收客户端连接,然后开启专门的逻辑线程处理该连接,LogicThread类实现对于一个客户端连接的逻辑处理,将处理的逻辑放置在该类的run方法中。

UDP编程

概述

  • 使用UDP方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对于服务器的压力要比TCP小很多,但是使用该种方式最大的不足是传输不可靠,所以在网络编程中,必须要求可靠传输的信息一般使用TCP方式实现,一般的数据才使用UDP方式实现。
  • UDP方式的网络编程也在Java语言中获得了良好的支持,由于其在传输数据的过程中不需要建立专用的连接等特点,所以在Java API中设计的实现结构和TCP方式不太一样。当然,需要使用的类还是包含在java.net包中。
  • 在Java API中,实现UDP方式的编程,包含客户端网络编程和服务器端网络编程,主要由两个类实现:
    • DatagramSocket:DatagramSocket实现的是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。
    • DatagramPacket:类的对象代表网络中交换的数据。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。

UDP客户端编程

  • UDP方式的建立连接和TCP方式不同,只需要建立一个连接对象即可,不需要指定服务器的IP和端口号码,示例如下:

    DatagramSocket ds = new DatagramSocket();
  • 使用UDP在发送数据时,需要将需要发送的数据内容首先转换为byte数组,然后将数据内容、服务器IP和服务器端口号一起构造成一个DatagramPacket类型的对象,这样数据的准备就完成了,发送时调用网络连接对象中的send方法发送该对象即可,同样,UDP方式在进行网络通讯时,也遵循“请求-响应”模型。
  • UDP的接收数据是这样实现的:首先构造一个数据缓冲数组,该数组用于存储接收的服务器端反馈数据,该数组的长度必须大于或等于服务器端反馈的实际有效数据的长度。然后以该缓冲数组为基础构造一个DatagramPacket数据包对象,最后调用连接对象的receive方法接收数据即可。接收到的服务器端反馈数据存储在DatagramPacket类型的对象内部。
  • UDP关闭连接,同TCP一致,使用连接对象中的close方法即可:

    ds.close();
  • SimpleUDPClient.java代码运行结果如下:

UDP服务器编程

  • 和前面TCP方式中的网络编程类似,下面示例也仅仅是网络编程的功能示例,也存在前面介绍的客户端无法进行多次数据交换,以及服务器端不支持多个客户端的问题
  • SimpleUDPServer.java代码运行结果如下:

网络协议

  • 网络协议是指对于网络中传输的数据格式的规定,其实质也是客户端程序和服务器端程序对于数据的一种约定。
  • 客户端程序需要完成的处理为:
    • 客户端发送协议格式的生成
    • 服务器端反馈数据格式的解析
  • 服务器端程序需要完成的处理为:
    • 服务器端反馈协议格式的生成
    • 客户端发送协议格式的解析

网络编程示例

  • 客户端程序功能:

    • 接收用户控制台输入
    • 断输入内容是否合法
    • 按照协议格式生成发送数据
    • 发送数据
    • 接收服务器端反馈
    • 解析服务器端反馈信息,并输出
  • 服务器端程序功能:
    • 接收客户端发送数据
    • 按照协议格式解析数据
    • 判断数字是否是质数
    • 根据判断结果,生成协议数据
    • 将数据反馈给客户端

质数判别示例

猜数字小游戏

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

  • 【附1】托管截图:

  • 【附2】代码统计截图:

  • 网络编程开始感觉很难,但是跟着老师分享的博客大体还是都能没慢慢看懂的,特别是这次的学习任务网络编程,就是将《Java程序设计》与《计算机网络》结合了起来,从代码的角度去看待TCP/IP协议,可以明白的更加透彻。

  • 这次的学习内容在周五时很快应用到了实验,通过构建TCP协议实现两台计算机互联,又因为要求是加密通信,所以又要引入《密码学》的相关思想。这周可谓是将自己所学的知识进行了一个大综合,跨学科的学习虽然开始难度会增加,但是拓宽了我们思考问题的范围,提供了更多解决问题的方法,也使知识得到了更好的实践。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/6 20/20 学会MarkdownPad2
第二周 150/350 1/7 15/35 理解了补码机制
第三周 500/850 1/8 25/60 初步了解了对象
第四周 1231/2081 1/9 27/87 初步了解了继承与接口
第五周 749/2930 3/12 30/117 了解了异常处理
第六周 1057/3987 2/11 24/111 初步了解输入输出与线程
第七周 371/4358 3/14 25/136 了解Java中的时间
第八周 472/4830 3/17 30/166 正确的认识了Git
第九周 499/5329 2/19 25/191 第一次运行了Android
第十周 849/6178 2/21 38/229 理解网络编程基础

参考资料

20145221 《Java程序设计》第十周学习总结的更多相关文章

  1. 201521123027 <java程序设计>第十周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 异常: 多线程: 2.书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...

  2. Java程序设计第十周学习总结

    Java课程知识梳理: 流的区分; 字符流与字节流的区别: 字节流是直接操作文件本身的,如果没有关闭字节流操作,文件会依然输出内容 而字符流在程序运行之后会发现文件没有任何的内容,这是因为字符流操作的 ...

  3. 20145221 《Java程序设计》第九周学习总结

    20145221 <Java程序设计>第九周学习总结 教材学习内容总结 整合数据库 JDBC入门 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行 ...

  4. 20145221 《Java程序设计》第二周学习总结

    20145221 <Java程序设计>第二周学习总结 教材学习内容总结 第二周内容已在假期完成,详见博客: <Java程序设计>第三章-基础语法 代码调试中的问题和解决过程 第 ...

  5. 20145221 《Java程序设计》第一周学习总结

    20145221 <Java程序设计>第一周学习总结 教材学习内容总结 第一周内容已在假期完成,详见博客: Hello Java! 开源中国的代码托管 代码调试中的问题和解决过程 第一周内 ...

  6. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  7. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

  8. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  9. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  10. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

随机推荐

  1. Android英文文档翻译系列(2)——HandlerThread

      public class   HandlerThread extends Thread   Class  Overview Handy class for starting a new threa ...

  2. Ubuntu14.04下安装DevStack

    虚拟机中的网络配置 NET8 为nat net2 为host-only 虚拟机网络配置 # The primary network interface vmnet nat type auto eth0 ...

  3. Deploying Cloud Foundry on OpenStack Juno and XenServer (Part I)

    link http://rabbitstack.github.io/deploying-cloud-foundry-on-openstack-juno-and-xenserver-part-i/ Cl ...

  4. 删除lv

    author: headsen  chen date: 2018-09-12  11:52:02 [root@sz02 ~]# umount /var/lib/docker [root@sz02 ~] ...

  5. PMP 笔记

    项目: 为创造独特的产品.服务或结果而进行的临时性工作. 项目特征: 独特性:Unique.临时性:Temporary.渐进明细. 渐进明细:预算越来越精细.比如三峡工程中,预算从10亿级的误差到1亿 ...

  6. shell中的多进程【并发】(转)

    http://bbs.51cto.com/thread-1104907-1-1.html

  7. 微信小程序 --- page.js文件

    page.js文件是写当前 page.wxml 页面的 JS 脚本文件: 示例: //获取应用实例 const app = getApp() Page({ data: { navComOneOnOff ...

  8. reflect 机制

    1: Class.forName的作用?为什么要用? 答:调用该访问返回一个以字符串指定类名的类的对象. 2: 通过反射,有几种方法可以实例化Class类对象? 3种,第一种:Class.forNam ...

  9. 云笔记类APP推荐

    一.思绪收集类 Google Keep - 记事和清单 - Google Play 上的应用 注:谷歌 Keep 是最方便的收集思绪 APP 了.卡片视图,反应迅速,流畅,UI 漂亮,功能齐全,唯一不 ...

  10. Git Bash关键命令

    1.默认目录是C:\Users\用户名 2.切换目录:$cd c:\\windows 3.切换到上级目录:cd ..,中间有空格 4.列出某目录所有文件,相当于DOS下的dir:ls c:\\wind ...