- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Java网络编程面试题及答案
1.说说TCP和UDP的区别?在Java中分别用什么类实现?
答案:
核心区别体现在可靠性和使用场景:
TCP:面向连接(三次握手)、可靠传输(重传+确认)、字节流、有拥塞控制,适合对数据完整性要求高的场景(如文件传输、HTTP请求);
UDP:无连接、不可靠(丢包不重传)、datagram(数据报)、速度快,适合实时性优先的场景(如即时通讯心跳包、视频流)。
Java实现类:
TCP:.Socket(客户端)、.ServerSocket(服务端);
UDP:.DatagramSocket(收发数据)、.DatagramPacket(封装数据报)。
2.用Java写TCP客户端和服务端的核心流程是什么?实际开发中会遇到什么问题?
答案:
核心流程(BIO模型):
服务端:
创建ServerSocket绑定端口(如newServerSocket(8080));
调用accept()阻塞等待客户端连接,返回Socket;
通过Socket的getInputStream()/getOutputStream()读写数据;
处理完后关闭流和Socket。
客户端:
创建Socket连接服务端(如newSocket(,8080));
同上通过流读写数据;
关闭资源。
实际问题:
粘包/拆包:TCP是字节流,多个数据包可能合并(粘包)或拆分(拆包)。解决方案:
定长协议(如每个包固定1024字节,不足补0);
分隔符(如用\n分割,读取时直到遇到分隔符);
协议头+长度(如前4字节存数据长度,读取时先读长度再读对应字节)。
线程阻塞:BIO一个连接占一个线程,高并发时线程耗尽,需改用NIO或Netty。
3.BIO、NIO、AIO的区别?为什么Netty比JDK原生NIO好用?
答案:
三者核心区别(基于IO模型):
模型
阻塞性
线程模型
适用场景
BIO
同步阻塞
1连接1线程
低并发(如内部管理系统)
NIO
同步非阻塞
1线程处理多连接(Selector)
高并发(如网关、服务端)
AIO
异步非阻塞
回调通知(完成后触发)
高并发且需低延迟(如金融交易,Java中用得少,Linux下依赖epoll)
Netty优势:
解决原生NIO痛点:
避免Selector空轮询bug(JDK1.6前存在,Netty已修复);
简化缓冲区操作(原生ByteBuffer需手动flip切换读写,NettyByteBuf自动扩容+读写分离);
开箱即用功能:
自带粘包拆包解码器(如LengthFieldBasedFrameDecoder);
支持SSL、HTTP、WebSocket等协议;
线程模型优化(主从Reactor,避免单线程瓶颈)。
4.Netty的核心组件有哪些?它的线程模型是怎样的?
答案:
核心组件:
EventLoopGroup:线程池,管理EventLoop(每个EventLoop是单线程,处理多个Channel的IO事件);
通常分两组:BossGroup(接受客户端连接,只处理Accept事件)、WorkerGroup(处理连接的读写事件);
Channel:网络连接的抽象(如NioSocketChannel对应TCP客户端连接);
ChannelPipeline:责任链,存储ChannelHandler(处理IO事件,如解码、业务逻辑);
ChannelHandler:实际处理逻辑的组件(如SimpleChannelInboundHandler处理读事件);
Bootstrap:启动辅助类(客户端用Bootstrap,服务端用ServerBootstrap)。
线程模型(主从Reactor):
BossGroup的EventLoop监听端口,收到Accept事件后,创建NioSocketChannel;
将NioSocketChannel注册到WorkerGroup的某个EventLoop(轮询分配,避免单线程过载);
后续该连接的所有IO事件(读/写)都由同一个EventLoop处理(线程安全,无需加锁)。
5.实际项目中,如何用Netty实现一个高并发的TCP服务端?需要注意哪些优化点?
答案:
核心实现步骤:
初始化EventLoopGroup:
BossGroup线程数:1(默认,因Accept事件少);
WorkerGroup线程数:默认CPU核心数×2(避免线程切换过多);
配置ServerBootstrap:
指定channel(NioServerSocketChannel.class);
文档评论(0)