Java 网络编程的结构与组成


网络编程的结构与组成

1. 软件结构

  • C/S结构 :全称为 Client/Server 结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件;
    在这里插入图片描述
  • B/S结构 :全称为 Browser/Server 结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等;
    在这里插入图片描述
  • 两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序;

2. 网络通信协议

  • 网络通信协议:通信协议是计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换;
  • TCP/IP 协议:传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol),是 Internet 最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了 4 层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求;
    在这里插入图片描述

3. 协议分类

  • 通信的协议还是比较复杂的,java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节,java.net 包中提供了两种常见的网络协议的支持:

  • TCP:传输控制协议 (Transmission Control Protocol)。TCP 协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输;

    • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠:
      • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认;
      • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求;
      • 第三次握手,客户端再次向服务器端发送确认信息,确认连接;
    • 整个交互过程如下图所示:
      在这里插入图片描述
      ​完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP 协议可以保证传输数据的安全,所以应用十分广泛,例如下载文件、浏览网页等;
  • UDP:用户数据报协议(User Datagram Protocol)。UDP 协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在 64k 以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ 聊天等;


4. 网络编程三要素

a. 协议

  • 协议:计算机网络通信必须遵守的规则,已经介绍过了,不再赘述;

b. IP地址

  • IP 地址:指互联网协议地址(Internet Protocol Address),俗称 IP。IP 地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话,那么“IP 地址”就相当于“电话号码”;
  • IP 地址分类
    • IPv4:是一个 32 位的二进制数,通常被分为 4 个字节,表示成 a.b.c.d 的形式,例如192.168.65.100 。其中 a、b、c、d 都是 0 ~ 255 之间的十进制整数,那么最多可以表示 42 亿个;
    • IPv6:由于互联网的蓬勃发展,IP 地址的需求量愈来愈大,但是网络地址资源有限,使得 IP 的分配越发紧张。有资料显示,全球 IPv4 地址在 2011 年 2 月分配完毕;
    • 为了扩大地址空间,拟通过 IPv6 重新定义地址空间,采用 128 位地址长度,每 16 个字节一组,分成 8 组十六进制数,表示成 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称可以为全世界的每一粒沙子编上一个网址,这样就解决了网络地址资源数量不够的问题;
  • 常用命令
    • 查看本机 IP 地址,在控制台输入:ipconfig
    • 检查网络是否连通,在控制台输入:ping 空格 IP地址 ping 220.181.57.216 ping www.baidu.com
  • 特殊的 IP 地址
    • 本机 IP 地址:127.0.0.1localhost

c. 端口号

  • 网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
  • 如果说 IP 地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了;
  • 端口号:用两个字节表示的整数,它的取值范围是 0 ~ 65535。其中,0 ~ 1023 之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用 1024 以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败;
  • 利用 协议 + IP地址 + 端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互;
  • 在 Java 中,可以使用 java.net.InetAddress 类来表示一个IP地址:
import java.net.InetAddress;

/**
 * InetAddress类概述
 * 一个该类的对象就代表一个IP地址对象。
 * <p>
 * InetAddress类成员方法
 * static InetAddress getLocalHost()
 * 获得本地主机IP地址对象
 * static InetAddress getByName(String host)
 * 根据IP地址字符串或主机名获得对应的IP地址对象
 * <p>
 * String getHostName();获得主机名
 * String getHostAddress();获得IP地址字符串
 */
public class Test {
    public static void main(String[] args) throws Exception {
        // 获得本地主机IP地址对象
        InetAddress inet01 = InetAddress.getLocalHost();
        // pkxingdeMacBook-Pro.local/10.211.55.2
        // 主机名/ip地址字符串
        System.out.println(inet01);
        // 根据IP地址字符串或主机名获得对应的IP地址对象
        // InetAddress inet02 = InetAddress.getByName("192.168.73.97");
        InetAddress inet02 = InetAddress.getByName("baidu.com");
        System.out.println(inet02);

        // 获得主机名
        String hostName = inet01.getHostName();
        System.out.println(hostName);
        // 获得IP地址字符串
        String hostAddress = inet01.getHostAddress();
        System.out.println(hostName);
        System.out.println(hostAddress);
    }
}
发布了283 篇原创文章 · 获赞 285 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Regino/article/details/105062796
今日推荐