JAVA网络编程

14. 网络编程

14.1 网络编程的简介
14.1.1 网络编程概念

其实,所谓的⽹络编程,就是编写程序,实现让同⼀个⽹络中的机器实现数据的传递,实现通信。

14.1.2 ⽹络编程需要具备的条件

如果要实现两台机器之间实现通信,必须要满⾜⼏点要求:

  1. 需要知道对⽅的 IP 地址。
  2. 需要知道对⽅的哪⼀个端⼝号来做数据的接受。
  3. 通信的双⽅,需要遵循相同的通信协议。
14.1.3 IP地址简介

IP是 Internet Protocol (⽹络互连协议),在计算机中,使⽤IP地址来描述⼀个上⽹终端的唯⼀的地址编号。分为 IPv4 和 IPv6。

IPv4 : 使⽤4个字节来描述⼀个IP地址,由四部分组成,每⼀部分⼀个字节。

IPv6 : 使⽤6个字节来描述⼀个IP地址,由六部分组成,每⼀部分⼀个字节。

IP 地址的分类:

  • A类:1.0.0.1 ~ 126.255.255.254 :保留给政府机构
  • B类:128.0.0.1 ~ 191.255.255.254 :分配给⼤中型企业
  • C类:192.0.0.1 ~ 223.255.255.254 :分配给任何有需要的个⼈
  • D类:224.0.0.1 ~ 239.255.255.254 :⽤于组播
  • E类:240.0.0.1 ~ 255.255.255.254 :⽤于实验
14.1.4 端口号的简介

端⼝是设备与外界进⾏通信的数据的出⼝。端⼝号的范围:[0,65535]。

常见的端口占⽤:

3306:MySQL

1521:Oracle

8080:Tomcat

14.1.5 通信协议

TCP、UDP、HTTP

七层⽹络分层: 物理层、数据链路层、⽹络层、传输层、会话层、表示层、应⽤层
14.2 TCP
14.2.1 TCP的简介

是⼀个传输层的通信协议,是⼀个安全的,面向连接的通信协议。所谓的安全,指的是在数据传递的过程中,不会出现数据丢失的问题。

特点:安全的、⾯向连接。

14.2.2 三次握手

使⽤TCP实现数据在两个计算机之间进⾏传递,需要先在两个计算机之间建⽴⼀个安全的连接,然后再

通过这个连接,进⾏数据的传递。因此,TCP是⼀个安全的通信协议。

在使用TCP进行数据传递的时候,存在两个角色,客户端和服务端。

在TCP中,连接的建⽴过程会经历如下⼏个步骤:

  • 第⼀次握⼿:

    • 建⽴连接时,由客户端向服务端发送⼀个 syn 包,syn包中是同步序列编号, 并进⼊

      SYN_SENT 状态,并等待服务器确认。

  • 第⼆次握⼿:

    • 服务器收到了 syn 包,服务器必须确认客户端的syn,同时⾃⼰也发送⼀个syn包给客户端,

      即 SYN_ACK 包,并进⼊到 SYN_RECV 状态。

  • 第三次握⼿:

    • 客户端收到了服务端 SYN_ACK 包,并向服务端回复⼀个 ACK 包,此时客户端和服务端会进

      ⼊到TCP连接成功状态。ESTABLISHED。

14.2.3 几个常用的类
  • InetAddress
    • 是⼀个⽤来描述IP地址的类。
    • 有两个常⻅的⼦类: Inet4Address、Inet6Address
  • Socket
    • 是⼀个⽤来描述TCP中的客户端的类
  • ServerSocket
    • 是⼀个⽤来描述TCP中的服务端的类
14.2.4 InetAddress
try {
    // 1、获取本机
    InetAddress address1 = InetAddress.getLocalHost();
    // 2、通过主机名字,获取⼀个主机
    InetAddress address2 = InetAddress.getByName("懿范");
    // 3、通过IP地址字节数组,获取⼀个主机(需要注意字节数组中的每⼀个元素是否溢出)
    InetAddress address3 = InetAddress.getByAddress(new byte[] {10, 0, (byte)153, 27});
    // 4、通过IP地址字符串获取⼀个主机
    InetAddress address4 = InetAddress.getByName("10.0.153.27");
    // 5、通过域名获取主机
    InetAddress address5 = InetAddress.getByName("www.taobao.com");
    // 6、获取⼀个域名对应的所有的主机
    InetAddress[] addresses = InetAddress.getAllByName("www.taobao.com");
    for (InetAddress address : addresses) {
        System.out.println(address);
    }
    // 通过 InetAddress 对象
    // 1、获取主机名字
    System.out.println(address1.getHostName());
    // 2、获取主机地址
    System.out.println(address1.getHostAddress());
    // 3、获取⼀个IP地址字节数组
    byte[] addr = address1.getAddress();
    for (byte b : addr) {
        System.out.println(b);
    }
} catch (UnknownHostException e) {
    e.printStackTrace();
}
14.2.5 Socket
14.2.6 ServerSocket
14.3 UDP
14.3.1 UDP的简介

UDP是⼀个⾼效的,⾯向⽆连接的⽹络通信协议。不同于TCP,使⽤UDP进⾏⽹络通信的时候,所谓的客户端和服务端之间不需要任何的连接建⽴。数据将会被封装到⼀个 数据报包中,直接发送到⽹络中。在数据报包中,包含了接收⽅的IP、端⼝、要发送的数据。

使⽤UDP进⾏⽹络通信,安全性没有TCP⾼,可能会出现丢包的情况。

14.3.2 发送方数据的发送
// 在UDP中,没有所谓的“客户端”、“服务端”的⻆⾊存在,所有的⻆⾊都由 DatagramSocket 类来描述。
    // DatagramSocket的实例化,不需要知道对⽅的IP地址和端⼝号,因为不需要和⽬标进⾏连接的建⽴
    // 因为所有的要发送的数据都封装到了⼀个数据报包中
    try (DatagramSocket sender = new DatagramSocket()) {
        // 获取要发送给⽬标的数据
        byte[] contents = "hello world".getBytes();
        // 实例化⼀个 InetAddress 对象,将其作为接收⽅的主机
        InetAddress target = InetAddress.getLocalHost();
        // 封装⼀个数据报包 DatagramPacket
        DatagramPacket packet = new DatagramPacket(contents, contents.length,target, 9876);
        // 直接将这个数据报包发送出去即可
        sender.send(packet);
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
14.3.3 接收方数据的接收
// 实例化⼀个DatagramSocket对象作为接收⽅,接收⽅对象的实例化,需要有个端⼝号
try (DatagramSocket receiver = new DatagramSocket(9876)) {
    // 做⼀个数据报包,⽤来接收数据
    byte[] array = new byte[1024];
    DatagramPacket packet = new DatagramPacket(array, array.length);
    // 使⽤数据报包接收数据
    receiver.receive(packet);
    System.out.println(new String(packet.getData(), 0, packet.getLength()));
} catch (SocketException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值