版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025Java网络编程笔试题及答案一、单项选择题(每题2分,共20分)1.在JavaNIO中,下列哪一类或接口真正实现了“非阻塞”语义?A.ServerSocketB.DatagramSocketC.SelectorD.SocketInputStream答案:C2.当使用HTTP/2的Java客户端(JDK11+HttpClient)时,默认并发流控制窗口大小为:A.16KBB.64KBC.128KBD.65535B答案:B3.在SpringWebFlux中,下列哪项最能准确描述Netty事件循环线程的调度策略?A.每个连接绑定一个线程B.每个CPU核心一个事件循环组C.所有连接共享一个队列D.每个请求一个虚拟线程答案:B4.若要在Java21的虚拟线程中执行阻塞式JDBC调用,最合理的做法是:A.使用synchronized避免上下文切换B.直接调用,虚拟线程会自动挂载到平台线程C.包装为CompletableFuture.supplyAsyncD.使用Reactor的publishOn(Schedulers.boundedElastic())答案:B5.在TLS1.3握手过程中,Java17客户端默认启用的密钥交换算法是:A.RSAB.DHEC.ECDHED.PSK答案:C6.当使用gRPCJava1.60时,服务端流式RPC方法返回的StreamObserver在异常场景下必须手动调用:A.onNextB.onErrorC.onCompletedD.request(int)答案:B7.在ZeroCopy场景下,FileChannel.transferTo(…)方法在内核态完成数据传输,其底层依赖的Linux系统调用是:A.read+writeB.mmapC.sendfileD.splice答案:C8.下列关于Java8DatagramChannel的说法,正确的是:A.支持非阻塞模式但无法加入多播组B.加入多播组需借助MembershipKeyC.不支持SO_REUSEPORTD.无法设置TimeToLive答案:B9.在HTTP/1.1持久连接中,客户端判定响应结束最可靠的方式是:A.读取到1字节B.遇到空行C.遇到chunked编码的最后一个0长度块D.依赖ContentLength==0答案:C10.当使用Netty4.1的LengthFieldBasedFrameDecoder时,若lengthFieldOffset=2,lengthFieldLength=4,则实际负载起始偏移为:A.2B.4C.6D.8答案:C二、不定项选择题(每题3分,共15分,多选少选均不得分)11.关于Java21的虚拟线程,下列说法正确的有:A.虚拟线程栈空间随堆分配B.虚拟线程由JVM调度,不依赖OS线程C.虚拟线程在I/O阻塞时会释放载体线程D.Thread.sleep在虚拟线程中不会消耗CPU答案:BCD12.使用HTTP/2ServerPush时,Jetty12提供的控制方式包括:A.PushBuilderB.Link头带rel=preloadC.设置PushStrategy接口D.使用WebFilter拦截答案:ABC13.在gRPCJava中,下列哪些序列化机制官方已提供内置支持?A.ProtocolBuffersB.JSON(使用proto3)C.KryoD.Avro答案:AB14.关于Netty的ChannelHandler生命周期,下列回调顺序正确的有:A.handlerAdded→channelRegistered→channelActiveB.channelInactive→channelUnregistered→handlerRemovedC.exceptionCaught可在任何阶段触发D.channelReadComplete在每次channelRead后必触发答案:ABC15.在Java17的SSLEngine中,握手状态可能返回:A.NEED_WRAPB.NEED_UNWRAPC.NEED_TASKD.FINISHED答案:ABCD三、填空题(每空2分,共20分)16.在JavaNIO中,通过__________方法可将SocketChannel设置为非阻塞模式。答案:configureBlocking(false)17.HTTP/3基于__________传输协议,其Java开源实现之一为__________。答案:QUID;Kwik18.在RMIIIOP中,客户端通过__________类获取远程对象存根。答案:PortableRemoteObject.narrow19.使用WebSocket时,帧opcode0x8表示__________帧。答案:Close20.在Netty中,__________类负责将ByteBuf解码为Java对象,通常继承ByteToMessageDecoder。答案:MessageDecoder21.当使用HTTP/2的Java客户端时,通过__________方法可启用HTTP/2overTLS(ALPN)。答案:HttpClient.newBuilder().version(HttpClient.Version.HTTP_2)22.在Java8的MulticastSocket中,设置多播TTL的方法名是__________。答案:setTimeToLive23.gRPC的service定义中,stream关键字置于参数前表示__________流。答案:服务端24.在ZeroCopy文件传输场景,Linux内核版本__________以上支持splice系统调用。答案:2.6.1725.在SpringCloudGateway中,通过__________过滤器可修改响应体。答案:ModifyResponseBody四、简答题(每题8分,共24分)26.描述Java21虚拟线程在Tomcat11中的I/O调度流程,并指出与传统平台线程模型的差异。答案:1.Tomcat11默认启用虚拟线程执行器(VirtualThreadExecutor)。2.当Acceptor线程接收到新连接,将SocketChannel注册到Poller。3.Poller使用虚拟线程处理读事件;若读阻塞,虚拟线程自动yield,载体线程被释放。4.写操作同理,阻塞时虚拟线程挂载到载体,写完立即卸载。5.差异:传统模型一连接一线程,内存占用约1MB;虚拟线程栈仅几百字节,百万级并发无需池化,调度由JVM完成,减少上下文切换。27.说明HTTP/2的头部压缩算法HPACK在Netty中的实现要点,并给出解码时避免内存泄漏的代码片段。答案:要点:1.使用HpackDecoder动态表,初始容量4096,可配置。2.解码时先读整数表示索引,再读字符串字面量。3.动态表引用计数由ByteBufretain/release管理。4.防止泄漏:在ChannelInboundHandler的channelRead中,解码后必须release原始ByteBuf;若异常,在exceptionCaught中释放。代码:```javapublicvoidchannelRead(ChannelHandlerContextctx,Objectmsg){if(msginstanceofByteBuf){ByteBufbuf=(ByteBuf)msg;try{Http2Headersheaders=decoder.decodeHeaders(buf);ctx.fireChannelRead(headers);}finally{buf.release();}}}```28.给出在gRPCJava中实现双向流式RPC的完整服务端与客户端交互时序,并指出背压控制的关键接口。答案:时序:1.客户端onNext(request1)→服务端streamObserver.onNext(response1)2.服务端可调用streamObserver.request(n)向Netty索取更多消息,实现背压。3.若客户端发送过快,服务端通过onError(Status.RESOURCE_EXHAUSTED)终止。关键接口:io.grpc.stub.ServerCallStreamObserversetOnReadyHandler与isReady(),通过ready状态进行流量控制。五、编程题(共41分)29.(15分)使用Java17HttpClient实现HTTP/2并发请求,要求:•向/items/1~1000发送GET请求;•使用虚拟线程,最大并发不超过200;•统计成功、失败、超时数量;•输出耗时。答案:```javapublicclassHttp2Concurrent{privatestaticfinalHttpClientclient=HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).connectTimeout(Duration.ofSeconds(5)).build();privatestaticfinalExecutorServicepool=Executors.newVirtualThreadPerTaskExecutor();publicstaticvoidmain(String[]args)throwsException{varstart=System.nanoTime();varsuccess=newAtomicInteger();varfail=newAtomicInteger();vartimeout=newAtomicInteger();varsemaphore=newSemaphore(200);vartasks=IntStream.rangeClosed(1,1000).mapToObj(i>CompletableFuture.runAsync(()>{try{semaphore.acquire();varreq=HttpRequest.newBuilder().uri(URI.create("/items/"+i)).timeout(Duration.ofSeconds(3)).build();varres=client.send(req,HttpResponse.BodyHandlers.discarding());if(res.statusCode()==200)success.incrementAndGet();elsefail.incrementAndGet();}catch(TimeoutExceptione){timeout.incrementAndGet();}catch(Exceptione){fail.incrementAndGet();}finally{semaphore.release();}},pool)).toArray(CompletableFuture[]::new);CompletableFuture.allOf(tasks).join();varms=(System.nanoTime()start)/1_000_000;System.out.printf("ok=%dfail=%dtimeout=%dtime=%dms%n",success.get(),fail.get(),timeout.get(),ms);pool.shutdown();}}```30.(13分)基于Netty4.1实现一个支持LengthFieldPrepender的RPC编码器,协议:•魔数0xCAFE(2字节)+版本1(1字节)+序列化类型(1字节)+负载长度(4字节,大端)+负载。要求:•编码时自动添加头;•解码时验证魔数与版本,非法则关闭连接;•使用ReplayingDecoder。答案:```javapublicclassRpcCodec{staticfinalintMAGIC=0xCAFE;staticfinalbyteVERSION=1;publicstaticclassEncoderextendsMessageToByteEncoder<ByteBuf>{protectedvoidencode(ChannelHandlerContextctx,ByteBufmsg,ByteBufout){out.writeShort(MAGIC);out.writeByte(VERSION);out.writeByte(1);//protobufout.writeInt(msg.readableBytes());out.writeBytes(msg,msg.readerIndex(),msg.readableBytes());}}publicstaticclassDecoderextendsReplayingDecoder<Void>{protectedvoiddecode(ChannelHandlerContextctx,ByteBufin,List<Object>out){intmagic=in.readUnsignedShort();if(magic!=MAGIC){ctx.close();return;}bytever=in.readByte();if(ver!=VERSION){ctx.close();return;}in.readByte();//skipserializetypeintlen=in.readInt();out.add(in.readBytes(len));}}}```31.(13分)使用Java17的SSLEngine实现非阻塞HTTPS服务端握手,要求:•监听8443端口,使用自签证书;•事件循环使用单线程Selector;•打印握手状态变化;•握手完成后发送"HelloHTTP/2"字符串并关闭。答案:```javapublicclassNBSSLServer{publicstaticvoidmain(String[]args)throwsException{varkeyStore=KeyStore.getInstance("PKCS12");try(varin=Files.newInputStream(Paths.get("server.p12"))){keyStore.load(in,"changeit".toCharArray());}varkmf=KeyManagerFactory.getInstance("SunX509");kmf.init(keyStore,"changeit".toCharArray());varsslCtx=SSLContext.getInstance("TLSv1.3");sslCtx.init(kmf.getKeyManagers(),null,null);varengine=sslCtx.createSSLEngine();engine.setUseClientMode(false);engine.setNeedClientAuth(false);varserver=ServerSocketChannel.open();server.bind(newInetSocketAddress(8443));server.configureBlocking(false);varselector=Selector.open();server.register(selector,SelectionKey.OP_ACCEPT);while(true){selector.select();variter=selector.selectedKeys().iterator();while(iter.hasNext()){varkey=iter.next();iter.remove();if(key.isAcceptable()){varsc=((ServerSocketChannel)key.channel()).accept();sc.configureBlocking(false);varhandler=newHandler(sc,engine);sc.register(selector,SelectionKey.OP_READ,handler);}elseif(key.isReadable()){varh=(Handler)key.attachment();h.read();}}}}staticclassHandler{privatefinalSocketChannelch;privatefinalSSLEngineengine;privatefinalByteBuffernetIn=ByteBuffer.allocate(321024);privatefinalByteBuffernetOut=ByteBuffer.allocate(321024);privatefinalByteBufferappIn=ByteBuffer.allocate(321024);privatebo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 借调干部工作制度
- 入户宣传工作制度
- 兵地融合工作制度
- 检查易燃易爆工作制度
- 污水处理厂气浮池改造方案
- 2026年设备维护与过程控制系统的集成
- 劳动故事 青年泥塑匠人的乡土情结教学设计小学劳动四年级(2017)粤教版《劳动与技术》
- 本册综合教学设计小学英语1B新概念英语(青少版)
- 石墨密封材料生产线项目规划设计方案
- 欧尼女装店工作制度
- 民事纠纷赔偿合同范本
- 8.2《做中华传统美德的践行者》(教学课件)
- 信息系统安全漏洞扫描指导
- 《数据中心碳排放计算标准》
- 2025年铝板带箔行业分析报告及未来发展趋势预测
- 科创板开通测试题正确答案
- V8瞬变电磁数据处理与反演流程Beta100
- 2025年自考设计概论真题及答案
- 混凝土承台破除施工方案
- 2024年湖南博物院招聘真题
- 浙江安全员c3考试题及答案
评论
0/150
提交评论