java面试 网络编程与 Java I/O:技术要点解析

java面试 网络编程与 Java I/O:技术要点解析

  • 网络编程与 Java I/O:技术要点解析
    • 一、TCP 和 UDP 的区别
      • TCP(Transfer Control Protocol)
      • UDP(User Datagram Protocol)
      • TCP 的三次握手与四次挥手
    • 二、Java 的几种 I/O 模型
      • BIO(同步阻塞 I/O)
      • NIO(同步非阻塞 I/O)
      • AIO(异步非阻塞 I/O)
    • 三、Java NIO 的核心组件
      • Channel
      • Buffer
      • Selector
    • 四、select、poll 和 epoll 的区别
      • select
      • poll
      • epoll
    • 五、HTTP 和 HTTPS 的区别
      • HTTP
      • HTTPS
      • HTTPS 的缺点
    • 总结

网络编程与 Java I/O:技术要点解析

在现代软件开发中,网络编程和 I/O 模型是构建高效、可靠系统的核心技术。本文将深入探讨 TCP 和 UDP 的区别、Java 的几种 I/O 模型、Java NIO 的核心组件、多路复用机制(select、poll、epoll)以及 HTTP 和 HTTPS 的差异。这些知识点对于理解网络通信和提升系统性能至关重要。

一、TCP 和 UDP 的区别

TCP(Transfer Control Protocol)

TCP 是一种面向连接的、可靠的传输层通信协议。它类似于打电话,通信双方必须先建立连接,然后才能进行数据传输。TCP 的特点包括:

  • 面向连接:通信前需要建立连接,通信结束后释放连接。
  • 可靠传输:通过序列号、确认应答、超时重传等机制保证数据的可靠传输。
  • 效率较低:由于需要维护连接状态和进行复杂的错误检测,TCP 的效率相对较低。
  • 占用资源多:TCP 需要维护连接状态,占用较多的系统资源。

UDP(User Datagram Protocol)

UDP 是一种无连接的、不可靠的传输层通信协议。它类似于广播,发送方无需等待接收方准备好即可发送数据。UDP 的特点包括:

  • 无连接:无需建立连接,发送方直接发送数据报。
  • 不可靠:不保证数据的可靠传输,可能会丢失数据。
  • 效率高:由于没有连接管理和错误检测机制,UDP 的效率较高。
  • 占用资源少:UDP 的协议简单,占用的系统资源较少。

TCP 的三次握手与四次挥手

TCP 建立连接需要三次握手,断开连接需要四次挥手。三次握手的过程如下:

  1. 客户端发送一个 SYN(同步)请求到服务器。
  2. 服务器收到 SYN 后,回复一个 SYN-ACK(同步-确认)响应。
  3. 客户端收到 SYN-ACK 后,发送一个 ACK(确认)响应,完成连接建立。

如果采用两次握手,可能会导致连接资源浪费。例如,客户端发送 SYN 请求后,服务器回复 SYN-ACK,但客户端可能因网络问题未收到响应,从而导致服务器端一直等待客户端的确认,浪费资源。

二、Java 的几种 I/O 模型

Java 提供了多种 I/O 模型,每种模型适用于不同的场景,各有优缺点。

BIO(同步阻塞 I/O)

BIO 是最基本的 I/O 模型,特点是同步阻塞。客户端发起请求后,线程会一直等待服务器响应,直到数据读取完成。BIO 的缺点是可靠性差、吞吐量低,适用于连接较少且固定的场景。在 JDK 1.4 之前,BIO 是唯一的选择,编程模型简单。

NIO(同步非阻塞 I/O)

NIO 是 Java 1.4 引入的非阻塞 I/O 模型,特点是同步非阻塞。客户端发起请求后,线程不会一直等待,而是可以去处理其他任务,直到数据准备好后再进行读取。NIO 的可靠性较好,吞吐量较高,适用于连接较多且连接较短的场景,例如聊天室。NIO 的编程模型相对复杂。

AIO(异步非阻塞 I/O)

AIO 是 Java 7 引入的异步非阻塞 I/O 模型,特点是异步非阻塞。客户端发起请求后,线程不会等待,而是继续执行其他任务,直到操作系统通知数据准备好后再进行处理。AIO 的可靠性和吞吐量都非常高,适用于连接较多且连接较长的场景,例如相册服务器。AIO 的编程模型相对简单,但需要操作系统的支持。

三、Java NIO 的核心组件

Java NIO 的核心组件包括 Channel、Buffer 和 Selector,它们共同实现了高效的 I/O 操作。

Channel

Channel 是 NIO 的核心组件之一,类似于传统 I/O 中的流。它表示一个打开的 I/O 连接,可以用于读取或写入数据。每个 Channel 都对应一个 Buffer 缓冲区,用于存储数据。Channel 可以是非阻塞的,也可以是阻塞的。

Buffer

Buffer 是一个缓冲区,用于存储数据。它是一个数组,可以存储不同类型的数据,例如字节、字符、整数等。Buffer 的主要作用是为 Channel 提供数据存储空间,实现数据的读写操作。

Selector

Selector 是 NIO 中的多路复用器,用于管理多个 Channel。它可以通过注册 Channel 来监听事件,例如读事件、写事件等。当某个 Channel 上发生事件时,Selector 会通知对应的线程进行处理。Selector 的作用是提高 I/O 操作的效率,减少线程的使用。

四、select、poll 和 epoll 的区别

select、poll 和 epoll 是 Linux 操作系统提供的三种多路复用机制,用于管理多个 I/O 事件。它们的主要区别如下:

select

select 是最早的多路复用机制,出现于 1984 年。它通过维护一个文件描述符集合(fd_set)来管理多个 I/O 事件。select 的缺点是:

  • 效率较低:需要遍历所有文件描述符集合,效率较低。
  • 最大连接数受限:文件描述符集合的大小受限于内核,通常为 1024 或 2048。

poll

poll 是对 select 的改进,出现于 1997 年。它通过链表结构管理文件描述符,突破了 select 的最大连接数限制。poll 的缺点是:

  • 效率一般:虽然解决了最大连接数的问题,但仍然需要遍历所有文件描述符,效率仍然较低。

epoll

epoll 是 Linux 2.6 内核版本引入的多路复用机制,出现于 2002 年。epoll 通过事件回调机制管理文件描述符,只关注用户关心的事件,减少了用户空间与内核空间之间的数据拷贝。epoll 的优点是:

  • 效率高:通过红黑树结构管理文件描述符,效率非常高。
  • 无连接数限制:不受内核限制,可以支持大量连接。

在 Java NIO 中,Linux 系统默认使用 epoll 机制(如果内核版本为 2.6 或以上),而 Windows 系统使用 WindowsSelectorProvider。

五、HTTP 和 HTTPS 的区别

HTTP 和 HTTPS 是互联网上常用的两种网络通信协议,它们的主要区别如下:

HTTP

HTTP 是一种无状态的、基于 TCP 的应用层协议,用于浏览器和服务器之间的通信。HTTP 的特点包括:

  • 无状态:每次请求都是独立的,服务器不会保存客户端的状态信息。
  • 传输效率高:HTTP 协议简单,传输效率高。
  • 安全性低:HTTP 数据以明文传输,容易被窃听。

HTTPS

HTTPS 是 HTTP 的安全版本,通过 SSL/TLS 加密协议实现数据的安全传输。HTTPS 的特点包括:

  • 安全性高:数据通过 SSL/TLS 加密传输,防止数据被窃听。
  • 需要证书:HTTPS 需要申请证书,证书通常需要收费。
  • 默认端口不同:HTTP 默认使用 80 端口,HTTPS 默认使用 443 端口。

HTTPS 的缺点

尽管 HTTPS 提供了更高的安全性,但它也有一些缺点:

  • 握手协议复杂:HTTPS 的握手过程比较复杂,会影响服务的响应速度和吞吐量。
  • 证书体系不完美:HTTPS 的证书体系并不是完全安全的,证书颁发机构(CA)可能会被攻击。
  • 成本较高:证书需要付费,功能越强大的证书费用越高。

总结

网络编程和 I/O 模型是现代软件开发中的关键技术。TCP 和 UDP 的选择取决于应用场景,TCP 更适合可靠传输,UDP 更适合高效传输。Java 的三种 I/O 模型各有优缺点,BIO 适用于连接较少的场景,NIO 适用于连接较多的场景,AIO 适用于高并发场景。select、poll 和 epoll 是 Linux 提供的多路复用机制,epoll 是效率最高的机制。HTTP 和 HTTPS 的选择取决于对安全性的需求,HTTPS 提供了更高的安全性,但需要付出更高的成本和性能代价。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PhpStorm设置中文

环境信息 系统版本:Windows11 22H2 PhpStorm版本:2025.1.1【Build #PS-251.25410.148】 设置中文 PhpStorm并不需要安装插件或下载相应的汉化包进行汉化 依次点击点击: file或右上角设置按钮→ 进入Settings→ 找到Appearance & Behav…

【监控】Spring Boot 应用监控

这段配置是 Spring Boot 应用中对 Actuator 和 Micrometer 监控系统的配置,用于将应用的指标暴露给 Prometheus 进行收集。下面我将详细介绍这种配置方式及其提供的指标。 配置说明 这个配置主要涉及 Spring Boot Actuator 和 Micrometer 两个核心组件&#xff1a…

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1]

学习笔记(23): 机器学习之数据预处理Pandas和转换成张量格式[1] 学习机器学习,需要学习如何预处理原始数据,这里用到pandas,将原始数据转换为张量格式的数据。 1、安装pandas pip install pandas 2、写入和读取数据 >>创建一个人工…

一台电脑联网如何共享另一台电脑?网线方式

前言 公司内网一个人只能申请一个账号和一个主机设备;会检测MAC地址;如果有两台设备,另一台就没有网;因为是联想老电脑,共享热点用不了,但是有一根网线,现在解决网线方式共享网络; …

Spring Boot 基础知识全面解析:快速构建企业级应用的核心指南

一、Spring Boot 概述:重新定义 Java 开发 1.1 什么是 Spring Boot? Spring Boot 是基于 Spring 框架的快速开发框架,旨在简化 Spring 应用的初始搭建及开发过程。它通过 「约定优于配置」(Convention Over Configuration&#…

CentOS-stream-9 Zabbix的安装与配置

一、Web环境搭建部署Zabbix时,选择合适的MariaDB、PHP和Nginx版本非常重要,以确保兼容性和最佳性能。以下是建议版本:Zabbix 6.4 MariaDB:官方文档推荐使用MariaDB 10.3或更高版本。对于CentOS Stream 9,建议使用Maria…

CppCon 2014 学习:Adventures in Updating a Legacy Vintage Codebase

“VINTAGE” 部分是对现实中飞行模拟系统中遗留系统复杂性的描述。以下是对关键点的理解与拆解: 飞行模拟系统的背景 多环境、多语言、多硬件: 编程语言: 混用的“遗留语言”:Ada, C, C, Fortran, Jovial, PL/M, Pascal不同语言…

【计算机】计算机存储器的分类与特性

文章目录 一、按作用层次分类1. 主存储器(内存)2. 辅助存储器(外存)3. 高速缓冲存储器(Cache) 二、按存储介质分类1. 半导体存储器2. 磁存储技术3. 光存储发展 三、按存取方式分类1. 随机存储器技术细节2. …

Redisson - 实现延迟队列

Redisson 延迟队列 Redisson 是基于 Redis 的一款功能强大的 Java 客户端。它提供了诸如分布式锁、限流器、阻塞队列、延迟队列等高可用、高并发组件。 其中,RDelayedQueue 是对 Redis 数据结构的高阶封装,能让你将消息延迟一定时间后再进入消费队列。…

上门服务小程序订单系统框架设计

一、逻辑分析 上门服务小程序订单系统主要涉及服务展示、用户下单、订单处理、服务人员接单与服务完成反馈等核心流程。 服务展示:不同类型的上门服务(如家政、维修等)需要在小程序中展示详细信息,包括服务名称、价格、服务内容介…

Android apk装机编译类型: verify、speed-profile, speed与启动耗时

Android apk装机编译类型: verify、speed-profile, speed与启动耗时 Dex2oat (dalvik excutable file to optimized art file) ,对 dex 文件进行编译优化,Android 虚拟机可识别的是dex文件,应用运行过程如果每次都将dex文件加载内存&#xff…

winrm登录失败,指定的凭据被服务器拒绝

winrm登录失败,指定的凭据被服务器拒绝。 异常提示:the specified credentials were rejected by the server 在windows power shell执行 set-executionpolicy remotesigned winrm quickconfig winrm set winrm/config/service/auth {Basic"true…

Unity3D ET框架游戏脚本系统解析

前言 ET框架在Unity3D中实现的GamePlay脚本系统是一种革命性的、基于ECS(实体-组件-系统)架构的设计,它彻底改变了传统的基于MonoBehaviour的游戏逻辑编写方式。其核心思想是追求高性能、高解耦、易热更新,特别适合大型复杂的网络…

android与Qt类比

一、概念对应关系 Android RecyclerView 组件类比描述Qt 模型 - 视图组件Qt 类比描述RecyclerView画板(容器)QAbstractItemView视图(展示数据的容器,如列表、表格)RecyclerView.Adapter画布(数据桥梁&…

Jenkins 2.479.1安装和邮箱配置教程

1.安装 在JDK安装并设置环境变量完成后,下载官网对应的war版本,在对应目录下打开命令行窗口并输入 java -jar jenkins.war其余参数感兴趣可以自行查阅,这里启动的 jenkins 服务默认占用8080端口,在浏览器输入 localhost:8080进入…

多分辨率 LCD 的 GUI 架构设计与实现

1.1多分辨率显示系统的挑战与解决方案 1.1.1 分辨率适配的核心问题 在嵌入式系统中,同时支持不同分辨率的 LCD(如 240160、320480 等)面临以下挑战: 布局适配:同一界面元素在不同分辨率下需要调整大小和位置 字体显示:小分辨率屏幕需要更小的字体,而大分辨率需要更清…

11. MySQL事务管理(上)

1. CURD不加控制&#xff0c;会有什么问题&#xff1f; 火车票售票系统tickets表 id name nums 10 西安<->兰州 1 客户端A 客户端B if (nums > 0) { if (nums > 0) { 卖票 卖票 // update numsnums - 1 update numsnums - 1 } } 当客户端A检查还有一张票时&#xf…

Beta分布Dirichlet分布

目录 Beta分布Dirichlet分布Beta分布&Dirichlet分布从Dirichlet分布生成Beta样本Beta分布&Dirichlet分布应用 Beta分布 Beta分布是定义在区间 [ 0 , 1 ] [0, 1] [0,1]上的连续概率分布&#xff0c;通常用于模拟概率或比例的随机变量。Beta分布的概率密度函数&#xff…

嵌入式系统中常用的开源协议

目录 1、GNU通用公共许可证&#xff08;GPL&#xff09; 2、GNU宽松通用公共许可证&#xff08;LGPL&#xff09; 3、MIT许可证 4、Apache许可证2.0 5、BSD许可证 6、如何选择合适的协议 在嵌入式系统开发中&#xff0c;开源软件的使用已成为主流趋势。从物联网设备到汽车…

告别延迟,拥抱速度:存储加速仿真应用的解决方案【1】

需求分析 现代仿真&#xff08;如CFD流体动力学、FEA结构分析、电磁仿真、气候模拟、自动驾驶场景仿真、芯片设计等&#xff09;会产生PB级甚至EB级的数据。海量数据的生成、处理和存储&#xff0c;主要体现在以下几个关键方面&#xff1a; 数据量爆炸式增长&#xff1a;高分…