Java Socket编程面试题及详细答案_第1页
Java Socket编程面试题及详细答案_第2页
Java Socket编程面试题及详细答案_第3页
Java Socket编程面试题及详细答案_第4页
Java Socket编程面试题及详细答案_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaSocket编程面试题及详细答案一、基础概念类1、简单说说什么是Socket?Socket的本质是什么?Socket可以理解为网络通信的端点接口,是应用层与传输层TCP/UDP协议交互的桥梁,也是程序间实现网络数据传输的工具。从本质上来说,Socket不是硬件,也不是单纯的协议,而是操作系统提供的一套网络编程接口。操作系统会为每个Socket分配一个文件描述符,网络读写的本质,就是对这个虚拟文件的读写操作,和本地文件读写的底层逻辑是相通的。日常开发中,我们常说的Socket通信,就是客户端和服务端通过各自的Socket端点,建立连接、传输数据、断开连接的完整过程。2、Socket通信的核心三要素是什么?核心三要素分别是:IP地址、端口号、传输协议。IP地址用于定位网络中的唯一一台主机,区分不同设备;端口号用于定位主机上的唯一进程,一台设备多个网络程序可以通过端口区分,端口取值范围0-65535,其中0-1023为系统保留端口,业务开发一般使用1024以上端口;传输协议决定数据传输规则,主要是TCP和UDP两种。只有三要素全部匹配,两台设备的进程才能精准建立通信链路。3、TCPSocket和UDPSocket的核心区别是什么?这是Socket编程最核心的基础考点,两者差异主要体现在连接、可靠性、传输方式、性能四个方面:1、连接特性:TCP是面向连接的通信,传输数据前必须先经过三次握手建立专属连接通道;UDP是无连接的,无需建立连接,直接打包数据发送。2、可靠性:TCP可靠,保证数据不丢失、不重复、按顺序到达,内置确认应答、重传机制;UDP不可靠,不保证数据一定送达,也不保证顺序,可能出现丢包、乱序。3、传输单元:TCP是字节流传输,数据无边界,连续流式传输;UDP是数据报传输,以数据包为单位,一次发送一个完整报文,有明确数据边界。4、性能开销:TCP需要维护连接状态、校验、重传等机制,开销大、传输速度稍慢;UDP无需维护连接,开销极小、传输速度快。5、适用场景:TCP适用于文件传输、接口通信、网页访问等对可靠性要求高的场景;UDP适用于直播、游戏、语音视频通话等容忍少量丢包、追求实时性的场景。4、Java中TCPSocket和UDPSocket对应的核心类分别是什么?TCP通信核心类:服务端ServerSocket、客户端Socket。ServerSocket绑定服务端端口,持续监听客户端连接请求,成功接收连接后返回Socket对象,服务端和客户端通过各自的Socket完成数据读写。UDP通信核心类:DatagramSocket(通信端点)、DatagramPacket(数据报文包)。UDP没有服务端和客户端的严格区分,两端都使用DatagramSocket收发数据,所有数据都需要封装成DatagramPacket数据包再传输。二、TCPSocket核心原理类1、TCP三次握手在Socket编程中的体现是什么?三次握手是TCP建立连接的底层机制,对应JavaSocket的代码执行流程:1、服务端创建ServerSocket,绑定端口后调用accept()方法,进入阻塞状态,持续监听连接;2、客户端创建Socket对象,指定服务端IP和端口,发起连接请求,对应第一次握手(客户端发送SYN报文);3、服务端监听到请求,返回确认报文并同步发送连接请求,对应第二次握手(服务端返回SYN+ACK报文);4、客户端接收确认报文,回复最终确认信号,对应第三次握手(客户端返回ACK报文);5、三次握手完成,服务端accept()方法解除阻塞,返回Socket对象,连接正式建立,可开始数据传输。2、TCP四次挥手对应的Socket断开流程?为什么需要四次?TCP连接是双向全双工通道,读写通道相互独立,关闭连接需要分别关闭读写两个方向,所以需要四次挥手,无法像建立连接一样合并步骤。对应Socket断开流程:1、客户端主动调用close()关闭Socket写通道,发送FIN报文,第一次挥手,客户端不再发送数据;2、服务端接收FIN报文,返回ACK确认报文,第二次挥手,此时服务端仍可向客户端发送剩余数据;3、服务端数据发送完毕后,调用close()关闭自身写通道,发送FIN报文,第三次挥手,服务端停止数据传输;4、客户端接收FIN报文,返回ACK确认报文,第四次挥手,双方通道全部关闭,连接彻底断开。3、什么是TCP粘包、拆包?产生的原因是什么?TCP是无边界的字节流协议,操作系统会根据缓冲区大小、网络状态自动拆分或合并数据,由此产生粘包拆包问题,这是TCP开发的高频痛点。拆包:发送端发送的一次完整数据,被网络拆分成分多次接收,接收端一次只能读到部分数据;粘包:发送端多次发送的独立数据,被操作系统合并成一次,接收端一次读取到多组数据。产生核心原因:1、TCP底层存在发送缓冲区和接收缓冲区,数据会先存入缓冲区,缓冲区未满或空闲时会合并数据;2、网络MTU(最大传输单元)限制,单次超大数据包会被自动拆分传输;3、应用层读写速度和底层传输速度不匹配,导致数据堆积或拆分。4、JavaSocket中如何解决TCP粘包拆包问题?核心思路是给无边界的字节流添加数据边界,常用四种成熟方案:1、固定长度报文:所有传输数据统一固定长度,接收端每次读取固定字节数,不足则等待,多余则拆分,实现简单,缺点是灵活性差、浪费带宽;2、首尾分隔符:在每组数据首尾添加特殊分隔符(如换行符、自定义特殊字符),接收端根据分隔符拆分完整报文,适合文本数据,注意规避数据内容与分隔符冲突;3、长度+内容报文头:最常用的生产方案,报文头部固定位置存储数据长度,接收端先读取头部获取报文长度,再精准读取对应长度的内容,精准解决粘包拆包,灵活性高;4、使用成熟框架:生产环境直接使用Netty、Mina等网络框架,框架已封装好拆包器,无需手动处理底层问题。三、代码与实战问题类1、简单说明ServerSocket的accept()方法特点?accept()是ServerSocket的核心方法,核心特点是阻塞式监听。当服务端调用accept()后,线程会立即阻塞,暂停后续代码执行,持续等待客户端连接请求;只有当客户端成功发起连接、三次握手完成后,该方法才会解除阻塞,返回一个与当前客户端对应的Socket对象。原生ServerSocket默认是单线程处理,一次只能接收一个客户端连接,必须处理完当前连接的业务,才能接收下一个,这也是原生Socket性能差的核心原因。2、Socket的close()和shutdown()方法有什么区别?两者都是关闭连接的方法,但关闭粒度和效果完全不同:1、close():直接关闭整个Socket连接,同时释放输入流、输出流、端口资源,读写通道全部失效。如果有数据未传输完成,会直接丢弃,资源彻底释放。2、shutdown():支持单向关闭,分为shutdownInput()和shutdownOutput():shutdownOutput()关闭输出通道,不再发送数据,但仍可以接收对方发送的数据;shutdownInput()关闭输入通道,不再接收数据,但仍可发送数据;优势是可以实现半关闭状态,保证剩余数据传输完成后再彻底断开连接,比直接close()更优雅。3、原生Socket为什么不适合高并发场景?如何优化?原生BIOSocket的核心问题是同步阻塞,性能瓶颈非常明显:1、accept()阻塞:无客户端连接时线程一直等待;2、读写阻塞:数据未就绪、未传输完成时,读写操作会阻塞线程;3、单线程处理:单个服务端线程只能串行处理客户端请求,并发量极低。优化方案:1、BIO多线程优化:每接收一个客户端连接,新建一个独立线程处理读写业务,主线程只负责监听连接,能提升并发量,但客户端过多会出现线程爆炸、内存溢出问题;2、NIO非阻塞优化:使用JavaNIO的Selector、Buffer、Channel实现多路复用,单线程可管理多个Socket连接,无阻塞等待,大幅提升并发性能;3、框架优化:生产环境使用Netty,封装NIO底层复杂逻辑,解决并发、粘包、异常重连等各类问题。4、Socket通信中常见的异常有哪些?分别是什么原因?1、ConnectException:Connectionrefused(连接被拒绝):服务端未启动、端口未监听、端口被占用,或客户端IP端口配置错误;2、SocketTimeoutException(读取超时):服务端或客户端设置了超时时间,指定时间内未接收到对方数据;3、EOFException(文件结束异常):对方主动关闭连接,本地仍在读取数据流,数据流中断;4、BindException:Addressalreadyinuse(端口被占用):启动服务端时,绑定的端口已被其他进程占用,或上一次程序端口未及时释放。四、进阶面试题1、什么是Socket半关闭?适用场景是什么?Socket半关闭就是通过shutdown()方法,只关闭连接的读通道或写通道,保留另一通道的通信能力,不再是全双工通信。适用场景:当客户端完成所有数据发送,但需要等待服务端返回处理结果时,客户端可以shutdownOutput()关闭写通道,告知服务端数据发送完毕,同时保留读通道等待响应,避免连接一直占用,保证数据完整性。2、UDPSocket为什么不存在粘包拆包问题?UDP是面向数据报的协议,每次传输都是一个独立的DatagramPacket数据包,有明确的数据边界。发送端发送多少个数据包,接收端就必须对应接收

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论