网络编程

网络编程概述

  • Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
  • Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库程序员面对的是一个统一的网络编程环境

.
.
.

网络基础

  • 计算机网络:
    把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
  • 网络编程的目的:
    直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
  • 网络编程中有两个主要的问题:
    如何准确地定位网络上一台或多台主机;定位主机上的特定的应用 —> IP和端口号 找到主机后如何可靠高效地进行数据传输 —> 网络通信协议

如何实现网络中的主机互相通信?

  • 通信双方地址 IP
    端口号
  • 一定的规则(即:网络通信协议。有两套参考模型)
    OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
    TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

.
.
.

通信要素1:IP和端口号

IP 地址:InetAddress

  • 唯一的标识 Internet 上的计算机(通信实体)
  • 在Java中使用InetAddress类代表IP
  • 本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost

.
.

  • IP地址分类方式1:IPV4 和 IPV6
  • java使用nio实现网络编程 java支持网络编程_网络

  • IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)
  • java使用nio实现网络编程 java支持网络编程_java_02

  • .
    .

端口号:标识正在计算机上运行的进程(程序)

  • 不同的进程有不同的端口号
  • 被规定为一个 16 位的整数 0~65535。
  • java使用nio实现网络编程 java支持网络编程_网络协议_03


  • java使用nio实现网络编程 java支持网络编程_网络_04

  • 端口号与IP地址的组合得出一个网络套接字:Socket。

.
.
.

InetAddress类

  • Internet上的主机有两种方式表示地址
    域名(hostName):www.atguigu.com
    IP 地址(hostAddress):202.108.35.210
  • InetAddress 类 对 象 含 有 一 个 Internet 主 机 地 址 的 域 名 和 IP 地 址
    www.atguigu.com 和 202.108.35.210。
  • 域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。 -------域名解析
  • java使用nio实现网络编程 java支持网络编程_网络协议_05

  • .
    .

InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取InetAddress实例

  • 实例化:
    public static InetAddress getLocalHost() —> 本机
    public static InetAddress getByName(String host) —> 指定host主机
  • 常用的方法:
    public String getHostAddress():返回 IP 地址字符串(以文本表现形式) public String getHostName():获取此 IP 地址的主机名 public boolean isReachable(int timeout):测试是否可以达到该地址
  • java使用nio实现网络编程 java支持网络编程_java_06

.
.
.

通信要素2:网络协议

  • 网络通信协议
    计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
  • 通信协议分层的思想
    在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

java使用nio实现网络编程 java支持网络编程_java_07


java使用nio实现网络编程 java支持网络编程_网络协议_08


建立连接:三次握手

java使用nio实现网络编程 java支持网络编程_网络_09


断开连接:四次挥手

java使用nio实现网络编程 java支持网络编程_java_10

.
.
.

TCP网络编程

一、Socket

  • 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。
  • 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字(Socket)。
  • 通信的两端都要有Socket,是两台机器间通信的端点。网络通信其实就是Socket间的通信
  • Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
  • 一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端
  • Socket分类:
    流套接字(stream socket):使用TCP提供可依赖的字节流服务数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务

.
.

Socket常用方法:

java使用nio实现网络编程 java支持网络编程_网络_11


.

.

.

基于Socket的TCP编程

一、客户端Socket的工作过程包含以下四个基本的步骤:

  • 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
  • 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输
  • 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
  • 关闭 Socket:断开客户端到服务器的连接,释放线路

.

二、 服务器程序ServerSocket的工作过程包含以下四个基本的步骤:

  • 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求
  • 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象
  • 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取输出流和输入流,开始网络数据的发送和接收
  • 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。

.

三、客户端—服务端

  • 客户端
    自定义
    浏览器
  • 服务端
    自定义
    Tomcat服务器

java使用nio实现网络编程 java支持网络编程_IP_12


java使用nio实现网络编程 java支持网络编程_IP_13

.
.
.

UDP网络通信

  • DatagramSocket类DatagramPacket类 实现了基于 UDP 协议网络程序。
  • UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  • DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
  • UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接。如同发快递包裹一样。

.
.

常用方法

java使用nio实现网络编程 java支持网络编程_IP_14


java使用nio实现网络编程 java支持网络编程_java_15


.

.

.

URL编程

  • URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。
  • 它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
  • 通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源
  • URL的基本结构由5部分组成:
    http//localhost:8080/IO/Hello.txt?page=123
    <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表

.
.

URL类构造器

public URL (String spec): 通过一个表示URL地址的字符串可以构造一个URL对象。例如:URL url = new URL (“http://www. atguigu.com/”);
public URL(URL context, String spec): 通过基 URL 和相对 URL 构造一个 URL 对象。例如:URL downloadUrl = new URL(url, “download.html")
public URL(String protocol, String host, String file); 例如:new URL(“http”, “www.atguigu.com”, “download. html");
public URL(String protocol, String host, int port, String file); 例如: URL gamelan = new URL(“http”, “www.atguigu.com”, 80, “download.html")

.
.

常用方法

java使用nio实现网络编程 java支持网络编程_网络协议_16

.
.

针对HTTP协议的URLConnection类

  • URL的方法 openStream():能从网络上读取数据
  • 程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用URLConnection 。
  • URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时, 首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.
  • 通过URLConnection对象获取的输入流和输出流,即可以与现有的CGI程序进行交互。
  • Connection对象常用方法

.
.
.

网络编程总结

java使用nio实现网络编程 java支持网络编程_java_17