五分钟学Java:如何学习Java面试必考的网络编程

简介:

副本_未命名.jpg

原创声明

本文作者:黄小斜

转载请务必在文章开头注明出处和作者。

本文思维导图

在这里插入图片描述

简介

Java作为一门后端语言,对于网络编程的支持是必不可少的,但是,作为一个经常CRUD的Java工程师,很多时候都不需要接触到网络编程,自然而然地对这个东西不那么重视了,毕竟,即使像是JVM虚拟机,Java多线程,在平时工作的时候还会用到一些,但是对于网络编程,除非你做的东西确实是需要自己写通讯服务代码的,比如网络游戏,以及偏向中间件方向的开发, 可能会接触到一些网络编程的实践,要不然在平时的开发工作中确实不多见。

让我们看下网络编程在百度百科上的定义:网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。

那么,为什么网络编程重要呢,简单来说,计算机之间之所以能够通信,靠的就是网络编程,只不过平时这些代码不需要我们自己来写罢了,TCP/IP的协议代码已经封装在了Linux内核中 ,而Tomcat里的代码则负责处理一个个网络请求,返回请求方需要的数据。再比如像netty这样的网络编程框架,也会把复杂的NIO处理逻辑封装成简单的API,即使如此,需要使用netty来做服务端开发的工程师仍然不多。

Java网络编程对于Java工程师来说是很重要的能力,这也是我在接触了一系列相关面试题,以及Tomcat和netty实现之后才逐渐意识到的,想要了解这两个东西的实现原理,就必须要会网络编程的知识,当然了,这一切的基础就是你要首先懂得计算机网络,这部分内容也可以参考我关于计算机网络的一篇文章。

本文思维导图

Java网络编程该怎么学

计算机网络和Java网络编程的关系

计算机网络之于Java网络编程,好比数据结构之于算法,前者是后者的基础,没有前者的支撑,直接学习后者,是没有意义的。

之前我也写了一篇关于计算机网络该怎么学的文章,可以先看看。总体来看,计算机网络告诉我们的是,两台计算机想要进行通信,它们需要约定一种传输协议和编码解码的标准,因此计算机网络通常分为5层,而其中一些标准就包括TCP和IP,HTTP等等,这些协议都是为了更好地实现网络数据传输而产生的。

但是,这些协议只是协议而已,要真正在Java代码里实现网络传输,就需要让代码实现协议,当然了,像TCP/IP这样通用的协议栈。还轮不到Java应用程序自己来实现,否则也太麻烦了,Linux的内核里已经对其进行了封装,并且会向上提供API,所以Java应用程序只需要调用Linux内核提供的即可。

而再往上,也就是HTTP这类应用层协议,Java代码是可以直接进行解析或者组装的,毕竟HTTP的报文比较简单,我们可以直接通过Java提供的API进行操作,大家也都知道,Java里有一些网络编程的包,提供了一些常用于网络通讯的类,比如Socket可以用来建立网络连接,IO流则可以用来处理网络传输的IO输入和输出。

换言之,网络编程的实质就是先进行网络连接,然后进行IO传输,而网络IO这个东西里又大有门道,这部分内容我们在下一节里继续分享。

网络编程里BIO、NIO和AIO

说到这三个东西,相比学过Java的朋友都不会陌生,毕竟面试题也经常考,背也都背下来了。
但是这几个东西为什么会有这样的区别呢,不妨一起来探究一下。
BIO是最原始的Java IO模式,也叫阻塞式IO,多个BIO处理必须要串行执行,因为IO此时被阻塞了。
而NIO则是相对较新的一种模式,它基于Linux的epoll来进行实现,通过一个线程对多个连接进行处理,当发现有活跃的连接时进行对应的IO处理,本质上是IO多路复用的一种实现。

而AIO和上面两者不太一样,它强调的不是阻塞非阻塞,而是对IO的处理是异步化的,通常来说就是建立连接,然后提供一个处理完IO的回调接口,然后就可以扔在一边不管了,等待IO处理结束后回调相应的接口。值得一提的是,AIO需要底层操作系统的支持。

通信框架netty

了解了BIO、NIO和AIO之后,你对于网络编程中的几个核心概念你应该已经有所了解了,接下来就不得不看看Java网络编程中最牛掰的一个框架:netty了。比起NIO和BIO,了解netty的人应该更少了,其实,netty就是基于NIO实现的异步网络编程框架,既有了NIO的高性能IO处理方式,又通过异步化编程使得netty的编程方式更加简单高效。

我当时接触netty的时候,还是在学习RPC和分布式服务的时候,我发现每当有RPC出现的地方,也总有网络编程框架的身影,好比netty这样的通讯框架常常会被提到,我当时并不太理解通讯框架是干嘛用的,以至于我对RPC是什么东西都不太理解。

当我现在搞懂了RPC之后,再去研究网络编程框架就有了新的感觉,其实,不管是RPC还是HTTP,都需要通信框架的支持,只不过支持HTTP的服务器已经有很多了,比如Tomcat,比如Nginx,这些服务器完全可以cover掉网络框架,后面我们也会再来聊一下Tomcat这个神奇的服务器。

Tomcat这个神奇的服务器

Tomcat这个服务器我们Java工程师一直在用,但是很多朋友对它其实知之甚少,只知道它可以运行JavaWeb应用。

其实Tomcat这个服务器,也是基于NIO实现的一个服务器,不妨把Tomcat分为两个部分来看,一部分是connector,负责网络连接,接受请求和处理请求,另一部分是container,也就是容器,Tomcat本质上是一个servlet容器,这一部分负责的就是编排一系列容器里的处理器、调用链以及层级结构,比如engine的下一层是host,host的下一层是context。

当一个网络请求到达Tomcat时,connector先负责处理这个请求,再扔到container跑一遍拿到结果,但在生产环境中,connector一次性要处理的请求就多的去了,因此就必须要支持高并发以及IO多路复用,因此Tomcat也采用了NIO的IO处理方式,同时通过多线程进行请求处理,总体来说已经达到了非常不错的性能了。

面向面试复习

一个小小的Java网络编程,居然一下子牵扯出这么多复杂的知识点出来,先是计算机网络,再到Java网络编程API,再到BIO、NIO和AIO,然后又谈到了Tomcat和netty。

其实,网络编程的内容可能还不止这些,比如NIO的底层实现是基于Linux的epoll来完成了,而Linux的网络IO模型有select、poll和epoll等方式,要真正搞懂NIO,你还需要搞懂epoll。

其实一开始我对于Java网络编程也没有什么概念,只不过在看了很多面试题之后,才逐渐发现问题所在,比如BIO和NIO的区别,背了好几次面试答案仍然不解其意,要是再问到epoll、poll和select的区别,更是完全不得要领,究其原因还是不知道这些东西到底是什么,有什么用,以及它们和一些实际场景间的关系。

因此,我觉得,网络编程方向的面试题重在理解概念,对于计算机网络、IO模型,以及网络编程框架要能够真正理解了这些东西之后,你才能够对面试题游刃有余,否则,这类面试题再怎么背都不会有什么效果,正如计算机网络这种纯理论的课程一样,在不理解的情况下,分析问题和回答问题肯定是难以达到面试官要求的。

所以,请按照这样的一个顺序进行复习和实践,相信这对于你学习网络编程会有所帮助。
1、计算机网络知识
2、Java网络编程基础
3、NIO、BIO、AIO
4、Linux的网络IO模型:epoll、select和poll
5、netty网络编程框架
6、Tomcat服务器

推荐资源

这方面能推荐的资源就非常多了,我尽量按照先易后难的顺序为大家推荐资源

书籍

《Java网络编程》
《netty权威指南》
《How Tomcat Work》
《Tomcat架构解析》

视频

我整理一些Java网络编程复习的视频资源,习惯看视频的朋友可以了解一下。

博客

Java技术仓库《Java程序员复习指南》
https://github.com/h2pl/Java-Tutorial
整合全网优质Java学习内容,帮助你从基础到进阶系统化复习Java。

总结

关于如何学习Java网络编程,并且搞定相关面试题,我们今天就讲到这里了,如果还有什么疑问也可以到我公众号里找我探讨,后续会有更多的文章推出,包括如何系统性地学习JavaWeb,以及如何系统性地学习后端技术。敬请期待。

对了,你想问我文章里提到的资源去哪找?我已经给你准备好了

文中提到的资源都可以免费领取,在我的公众号【程序员黄小斜】回复“Java网络编程“即可免费领取对应的资源。

写在最后

如果觉得本文对你有帮助的话,请你也不要吝啬你的“好看”哈,转发朋友圈就是对我最大的支持啦,你们的支持是对我最大的鼓励。

对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。

微信公众号:程序员黄小斜
知乎:黄小斜
B站:黄小斜
相关文章
|
2月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
2月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
120 23
|
4月前
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
270 60
|
3月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
218 14
|
3月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
90 13
|
3月前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
4月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
161 16
|
4月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
194 9
|
4月前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
150 12
|
4月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
90 10

热门文章

最新文章