• peter
    2023-12-16 来自北京
    请教老师几个问题: Q1:streamHandler不需要赋值吗? ServletProcessor.java的process方法中: URLStreamHandler streamHandler = null; urls[0] = new URL(null, repository, streamHandler); 代码声明了变量“streamHandler”, 但是没有赋值,然后直接用来创建URL的对象。 请问:为什么没有给“streamHandler”赋值? Q2:HttpConnector的run方法为什么没有注解? 类定义:HttpConnector implements Runnable, 其run方法上面没有注解,Idea2019提示: Missing '@Override' annotation on 'run()' 。 但程序能运行。请问老师的代码中,run方法为什么没有注解? Q3:第03课代码,一次请求,socket = serverSocket.accept();为什么运行两次? HttpServer.java文件中,while(true)代码块,在serverSocket.accept();这里阻塞。浏览器中输入请求,创建Request,成功地走完了整个流程。走完整个流程后按道理应该还在serverSocket.accept();这里阻塞。但竟然再次创建Request,不过在Request类的parse函数中,在i = input.read(buffer);这个地方不再往下面执行。我在input.read前后都加了打印语句,前面的打印语句执行了,后面的没有执行,神奇啊,为什么啊? 简单地说,就是:浏览器发送一个请求,HttpServer收到了两个request,第一个正常处理,第二个不能正常执行。(我用的是Chrome浏览器,也许和浏览器有关?)
    展开

    作者回复: Q1, 你自己看URL api帮助文档 Q2, @Override是一个编译时注解,加上是一个好习惯,没有也不会出运行时错误 Q3,这个问题好。有些浏览器将请求分成简单请求和非简单请求,对于非简单请求,浏览器会先发出一个OPTIONS预检请求,这是为了安全性的原因。MiniTomcat没有考虑这些实际工作中的复杂性,直接忽略了。

    
    
  • HH🐷🐠
    2023-12-15 来自广东
    😄池子+队列, 学艺不精具体细节答不上来, 请老师指点。

    作者回复: 提高并发度有一系列技术。能第一反应出来的就是多线程,将processor设计成多个线程,放到一个池子里面,服务器接受前端多个请求后交给后面线程池子里面的多个processor线程来并发处理。这解决了一部分问题,但是对一个processor来说,它还是串行工作的,当它涉及到数据库访问网络访问文件操作的时候,可以进一步再分线程。不过程序模式需要调整成使用Future或者CompletableFuture,完全的响应式编程结构复杂。JDK21提出的virtual thread很好地解决了这个问题。实际工作中,要根据场景要求进行选择。

    
    