java

网络编程概述

计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

网络编程

在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换。

网络通信基本模式

常见的通信模式有如下 2 种形式:Client-Server(CS) 、 Browser/Server(BS)

网络编程三要素

IP 地址:设备在网络中的地址,是唯一的标识。

要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而 IP 地址就是这个标识号。也就是设备的标识。

端口:应用程序在设备中唯一的标识。

网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用程序呢?如果说 IP 地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识。

协议: 数据在网络中传输的规则,常见的协议有 UDP 协议和 TCP 协议。

通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有 UDP 协议和 TCP 协议。

IP 地址

常见的 IP 分类为:IPv4 和 IPv6

IPv4:

IPv6:128 位(16 个字节),号称可以为地球每一粒沙子编号。IPv6 分成 8 个整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开。

IP 地址形式

公网地址、和私有地址(局域网使用)。

192.168. 开头的就是常见的局域网地址,范围即为 192.168.0.0--192.168.255.255,专门为组织机构内部使用。

IP 常用命令:

ipconfig:查看本机 IP 地址

ping IP 地址:检查网络是否连通

特殊 IP 地址:

本机 IP: 127.0.0.1 或者 localhost:称为回送地址也可称本地回环地址,只会寻找当前所在本机。

IP地址操作类-InetAddress

方法名称说明
public static InetAddress getLocalHost()返回本主机的地址对象
public static InetAddress getByName(String host)得到指定主机的IP地址对象,参数是域名或者IP地址
public String getHostName()获取此IP地址的主机名
public String getHostAddress()返回文本显示中的IP 地址字符串
public boolean isReachable(int timeout)在指定毫秒内连通该IP地址对应的主机,连通返回true
public class InetAddressDemo {
  public static void main(String[] args) throws UnknownHostException {
//InetAddress address = InetAddress.getByName("itheima");
    InetAddress address = InetAddress.getByName("192.168.1.66");
    //public String getHostName():获取此IP地址的主机名
    String name = address.getHostName();
    //public String getHostAddress():返回文本显示中的IP地址字符串
    String ip = address.getHostAddress();
    System.out.println("主机名:" + name);
    System.out.println("IP地址:" + ip);
  }
}

端口

端口号

用两个字节表示的整数,被规定为一个 16 位的二进制,它的取值范围是 065535。其中,01023 之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用 1024 以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

端口类型

周知端口:0~1023,被预先定义的知名应用占用(如:HTTP 占用 80,FTP 占用 21)

注册端口:

动态端口:49152 到 65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配。

注意:我们自己开发的程序选择注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

协议

网络通信协议有两套参考模型

  • OSI 参考模型:世界互联协议标准,全球通信规范,由于此模型过于理想化,未能在因特网上进行广泛推广。
  • TCP/IP 参考模型(或 TCP/IP 协议):事实上的国际标准。

传输层的 2 个常见协议

  • TCP(Transmission Control Protocol) :传输控制协议
  • UDP(User Datagram Protocol):用户数据报协议

UDP 协议

UDP 协议:

  • UDP 是一种无连接、不可靠传输的协议。
  • 将数据源 IP、目的地 IP 和端口封装成数据包,不需要建立连接
  • 每个数据包的大小限制在 64KB 内
  • 发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
  • 可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快。

UDP 协议通信场景

  • 语音通话,视频会话等。

TCP 协议

TCP 协议特点

  • 使用 TCP 协议,必须双方先建立连接,它是一种面向连接的可靠通信协议。
  • 传输前,采用"三次握手"方式建立连接,所以是可靠的 。
  • 在连接中可进行大数据量的传输 。
  • 连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低。

TCP 协议通信场景

  • 对信息安全要求较高的场景,例如:文件下载、金融等数据通信。

UDP 通信程序

  • UDP 是一种无连接、不可靠传输的协议。
  • 将数据源 IP、目的地 IP 和端口以及数据封装成数据包,大小限制在 64KB 内,直接发送出去即可。

UDP发送数据

  • UDP 协议是一种不可靠的网络协议,它在通信的两端各建立一个 Socket 对象,但是这两个 Socket 只是发送,接收数据的对象,因此对于基于 UDP 协议的通信双方而言,没有所谓的客户端和服务器的概念。
  • Java 提供了 DatagramSocket 类作为基于 UDP 协议的 Socket

构造方法

构造器说明
DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
DatagramPacket(byte buf,int len,InetAddressadd,int port)创建数据包,发送长度为 len 的数据包到指定主机的指定端口

相关方法

方法名称说明
void send(DatagramPacket p)发送数据报包
void close()关闭数据报套接字
void receive(DatagramPacket p)从此套接字接受数据报包

发送数据的步骤

  • 创建发送端的 Socket 对象(DatagramSocket)
  • 创建数据,并把数据打包
  • 调用 DatagramSocket 对象的方法发送数据
  • 关闭发送端

UDP接收数据

构造器说明
DatagramPacket(byte buf, int len)创建一个 DatagramPacket 用于接收长度为 len 的数据包

相关方法

方法名称说明
byte getData()返回数据缓冲区
int getLength()返回要发送的数据的长度或接收的数据的长度

接收数据的步骤

  • 创建接收端的 Socket 对象(DatagramSocket)
  • 创建一个数据包,用于接收数据
  • 调用 DatagramSocket 对象的方法接收数据
  • 解析数据包,并把数据在控制台显示
  • 关闭接收端

TCP 通信程序

TCP发送数据

  • Java 对基于 TCP 协议的的网络提供了良好的封装,使用 Socket 对象来代表两端的通信端口,并通过 Socket 产生 IO 流来进行网络通信。
  • Java 为客户端提供了 Socket 类,为服务器端提供了 ServerSocket 类

构造方法

构造器说明
Socket(InetAddress address,int port)创建流套接字并将其连接到指定 IP 指定端口号
Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号

相关方法

方法名称说明
InputStream getInputStream()返回此套接字的输入流
OutputStream getOutputStream()返回此套接字的输出流

TCP接收数据

构造器说明
ServletSocket(int port)创建绑定到指定端口的服务器套接字

相关方法

方法名称说明
Socket accept()监听要连接到此的套接字并接受它