第十八章 Java网络编程
1、 OSI模型
OSI采用分层结构,将网络分为七层。
作为学习参考模型。
2、TCP/IP模型:
OSI模型目前主要用于教学理解,在实际使用中,网络硬件设备基本都是参考TCP/IP模型。可以吧TCP/IP模型理解为OSI模型的简化版。
1)应用层:
负责应用程序间的交互。HTTP协议(万维网服务)、FTP协议(文件传送服务)、POP3协议(邮件服务)、Telnet协议(网络远程访问协议)等。
2)传输层:
负责传输数据。主要是TCP协议(传输控制协议)、UDP协议(用户数据报协议)。
3)网络互联层:
负责数据封包传送。IP协议(网络协议)是TCP/ IP协议的核心,也是网络层重要的协议。
4)网络接口层:
负责对实际网络媒体的管理,定义如何使用实现网络来传送数据。
网络编程的实质就是两个(或多个)设备(如计算机)之间的数据传输。
IP地址:192.168.1.100(IPV4协议)
域名:www.lovo.com.cn(DNS服务器)
端口:在硬件上规定,端口的号码必须位于0~ 65535之间,每个端口对应.
自定义的端口最好是从1000以后,尽量取大一点,不要超过655535.。
一个网络程序可占用多个端口。
网络通信基于“请求---响应”模型
网络编程中,第一次主动发起通讯的重新称为客服端程序(Client);而在第一次通讯中等待链接的程序被称为服务端程序(Server)。一旦通讯建立,则客服端和服务器端完全一样,没有本质的区别。
3、C/S结构:
基于客服端程序和服务器程序的网络编程结构被称作客服端/服务器结构,也叫作Client/Server 结构,简称C/S结构。
4、B/ S 结构:
使用浏览器作为客服端程序的结构被称为浏览器/服务器结构,也叫作Browser/ Server结构,简称B/ S 结构。
总之,C/ S结构和B/ S 结构是现在网络编程中常见的两种结构,而B / s结构其实也是一种特殊的C/ S结构。
5、网络协议:(网络通讯的两种方式)
1、 TCP(传输控制协议)
2、 UDP(用户数据报协议)
6、TCP协议和UDP协议的区别:(重点)
| 链接 | 传输可靠性 | 传输速度 |
TCP | 面向链接 | 可靠 | 慢 |
UDP | 面向非链接 | 不可靠 | 快 |
7、客服端网络编程的步骤:(三个步骤)
1) 建立网络连接
建立网络连接时需要指定连接到服务器IP地址和端口号,建立完成以后会形成一条虚拟的链接,后续的操作就可以通过该链接实现数据交换。
2) 交换数据
链接建立后,就可以通过这个链接交换数据。交换数据严格按照“请求—响应”模型进行,由客服端发送一个请求数据到服务器,服务器反馈一个响应数据给客服端。如果客服端不发送请求则服务器就不响应。根据数据开发需要,可以多次交换数据,但是好还是必须遵守“请求—响应”模型。
3) 关闭网络连接
在数据交换完成以后,关闭网络连接,释放程序占用的端口号,内存等系统资源,结束网络编程。
8、服务器网络编程步骤:(四个步骤)
1) 监听端口
服务器端口属于被动等待链接,所以服务器启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口号。这个端口号就是服务器端开放给客服端的端口号,服务器端程序运行的本地计算机的IP地址就是服务器程序的IP地址。
2) 获得连接
当客服端连接到服务器端时,服务器端就可以获得一个连接,这个链接包含客服端的信息(如客服端的IP地址等)。服务器端和客服端也就可以通过该链接进行数据交换。一般在服务器编程中,当获得链接是,需要开启专门的线程处理该链接,每个链接都由独立的线程处理。
3) 交换数据
服务器通过获得的链接进行数据交换。服务器端的数据交换步骤首先是接受客服端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客服端。简单来说,就是先接受在发送,这和客服端的数据交换顺序后。服务器端的数据交换也是可以多次进行。
4) 关闭连接
当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存以及系统资源可以释放出来,结束网络编程。
总之:
无论使用任何编程语言,任何方式进行基础的网络编程,都必须遵循固定的步骤进行操作。在熟悉了这些步骤以后,可以根据需要进行逻辑上的处理,但是还是必须遵循固定的步骤进行。
9、Socket(套接字)
套接字(socket)是由伯克利大学首创的,它允许程序把网络连接当成一个流处理,可以通过流的方式实现数据的交换。
10、套接字由两种:
一种套接字实在服务器端创建,叫做服务器套接字(Server Socket),
一种是在客服端创建,叫做客服端套接字(Socket)。
11、InetAddress类---网络基础类:
该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法封装到类中。
和网络编程有关的基本API位于java.net包中,该包中包含了基本的网络编程实现,该包是网络编程的基础。
12、如何服用Socket链接?
建立链接以后,将数据交换的逻辑写入到一个循环中就可以了。这样,只要循环不结束则链接就不会关闭。
13、如何使服务器端支持多个客服端同时工作?
一个服务器一般都需要同时为多个客服端提供服务,如果需要同时支持多个客服端,则必须使用多线程。简单来说,也就是服务器端接收到一个客服端连接时,启动一个专门的线程处理和该客服端之间的数据交换。
14、设计模式(Design PAttern)
是一套被反复使用、经过分类编目、代码设计经验的总结。用设计模式是为了可重用代码、按代码更容易被人理解、保证代码可靠性。
简单说,所谓模式就是得到很好演技也的范例。设计模式就是设计范例。
模式不是框架,也不是过程。模式也不是简单的“问题的的解决方案”,因为模式必须是典型问题的解决访问,是可以让学习者举一反三、有研究价值,有交流价值、有自己的名字的例子。
模式不能被套用,要不以为在任何一个系统中都要试用魔蝎设计模式。系统的设计也不含有设计模式就好,更不是含有越多的设计模式就越好。
15、设计模式的本质:
是面向对象方法的实际运用。具体而言,是封装、继承和多台的反复使用。可以说市面上关于设计模式的书没有一本适合初学者。
要真正理解设计模式就需要透彻理解面向对象设计原则和面向对象的三大特征(封装、继承、和多态)。
16、推荐书籍:
《Java设计模式》面向有一定Java语言基础和一定项目编程的读者,重点探讨Java程序设计中怎样去使用著名23个设计模式。
17、23种模式分为三类:
1、 创建型模式(5种)
a) 单例模式(SingleTon):保证一个类中有一个对象实例。
2、 结构型模式(7种)
3、 行为型模式(11种)
18、java 的三种单例模式
Java单例模式是一种常用的设计模式,单例模式的写法有好几种,这里主要介绍三种:
1) 饿汉式单例
2) 懒汉式单例
3) 登记式单例:实际上维护了一组单例类的实例,将这些实例存放在一个Map(登记薄)结构中,对于已经登记过的实例,则从Map直接返回,对于没有登记过的则登记时单例可忽略,首先他用的比较少,另外其内部实现还是用的饿汉式单例。
懒汉式单例和饿汉式单例的区别:
1) 加载时机
饿汉式单例实在类加载时已经完成对象的实例化、确保在使用时对象已经存在。
懒汉式单例是在第一次调用getIntance方法时才完成对象的实例化,在未使用时对象不存在。这种方式也叫延时加载。
2) 线程安全:
饿汉式单例天生就是线程安全,不需要实现线程安全
懒汉式单例本身是非线程安全,需要手动实现线程安全。
3) 资源性能
饿汉式单例在类加载时完成静态对象的实例化,不管之后会不会使用这个对象,都会占用一定的内存。
单例模式的使用:
单例模式确保某个类只有一个对象例子,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡驱动等对象都被设计成单例。所以单例模式就是为了避免不一致状态,提高资源利用效率。