1)Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
在设计模式中,Socket其实就是一个门面模式(Facade Pattern, 也叫做外观模式),它把复杂的TCP/IP协议族隐藏在Socket接口后面;
对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
2)新建ServerSocket 对象需要一个参数(port),绑定端口;它的accept()方法的执行将使Server端的程序处于等待状态,
Client 端新建Socket 对象需要两个参数(host, port);
程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象。
此后Server程序只要向这个 Socket对象读写数据,就可以实现向远端的Client读写数据。ServerSocket 一般仅用于设置端口号和监听, 真正进行通信的是服务器端的Socket与客户端的Socket,
在ServerSocket 进行accept之后,就将主动权转让了。
当一个Socket会话产生后或者说服务器端SeverSocket接收了Socket后,将这个sokcet会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。
3)Tomcat 流程开始;C:\Program Files\apache-tomcat-8.5.24\bin\startup.bat 启动tomcat
start "Tomcat" "C:/j2sdk1.4.2_15/bin/java" -D...
在该命令中,start "Tomcat"是在控制台打开一个新的窗口,然后运行java虚拟机 C:/j2sdk1.4.2_15/bin/java, 现在大家应该明白了,tomcat是从bootstrap.jar中的org.apache.catalina.startup.Bootstrap 类的main函数开始启动运行,并且传入了start参数。-D开始的都是虚拟机的运行参数;
初始化运行环境,载入需要的jar包,读取conf/server.xml,生成相应的运行对象(组件):connector, service, engine, host, context.
A web container (also known as a servlet container) is essentially the component of a web server that interacts with the servlets.
server就代表一个web容器,代表一个服务器,其它的几个概念都是属于server的一部分。service表示web容器能够提供的某项服务。如果把server按照功能粒度进行细化,那么每个单元就是一个service。connector和engine是组成server的两个组成部分。engine是执行用户的请求的引擎,connector是请求执行的通道。connector本身并不做请求的处理,只是提供通道功能。
Connector 类的构造函数,主要是初始化一个ProtocolHandler对象;启动函数,则主要是启动这个对象;在ProtocolHandler上的init和start所执行的操作,通过AbstractProtocol这两个方法的实现来看;从代码上看AbstractProtocol本身并不做太多请求解析处理相关的事情,它是把事情委托给了一个AbstractEndpoint对象来完成。类似init和start生命周期,其它的几个生命周期如pause、resume、stop、destory也主要是通过AbstractEndpoint对象来完成。在Http11NioProtocol的构造函数中指定的是使用NioEndpoint实例,因此这里通过分析AbstractEndpoint的子类NioEndpoint来做进一步的了解。经过了这么一长串的处理之后,请求被转到了Connector来进行处理。
4)RMI全称为Remote Method Invocation,中文翻译为远程方法调用。指的是从本地调用服务器上的一组方法,服务器根据提交的信息(方法名、方法携带参数)计算得到结果、并将结果返回给调用者。Java Remote Method Invocation指的是在Java上实现上述机制。
5)。。。
6)SpringBoot (SpringMVC+Spring 环境) Debug 记录
org/apache/tomcat/util/net/NioEndpoint$Acceptor.run();
sun.nio.ch.ServerSocketChannelImpl.accept();
SocketChannel和ServerSocketChannel的概念与基础的阻塞式的java 网络编程中的socket和serversocket类似。
在后者的模型中,服务器端生成一个serversocket对象,bind绑定端口号,然后accept阻塞等待客户端连接到服务器。每当连接建立成功,则返回一个Socket对象,用来表示连接建立成功。
在java nio中。ServerSocketChannel和SocketChannel模型其实是与ServerSocket和Socket模型对应的。服务器端open打开一个ServerSocketChannel,这个操作同时会成功一个ServerSocket对象,但生成的ServerSocket对象是没有进行端口绑定的。所以在进行网络监听之前,还需要对ServerSocketChannel的ServerSocket对象进行bind绑定操作。然后ServerSocketChannel开始进行accept网络监听,请求建立成功之后返回一个SocketChannel对象。这个SocketChannel对象有一个与之对应的Socket对象。
ServerSocketChannel是线程安全的 ---- at least the Oracle documentation says so.
sun.rmi.transport.tcp.TCPTransport.class: void executeAcceptLoop(){var1 = this.serverSocket.accept();};
org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller: void run();
Acceptor的作用是控制与tomcat建立连接的数量,但Acceptor只负责建立连接。socket内容的读写是通过Poller来实现的。Poller使用java nio来实现连接的管理。Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。
org.apache.coyote.AbstractProtocol.class;
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor;
org.springframework.boot.web.embedded.tomcat.TomcatWebServer.class
org.apache.catalina.core.StandardServer.class; 它代表一个服务器实例,有一个Service数组的属性,为当前这个Server所拥有的service。(StandardService表示一项具体的服务能力,它有一个Connector数组的属性,是属于这个Service的连接器;此类中的executors代表为这个服务配置的ArrayList 线程池,可在多个Connector之间共享。)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable;
org.apache.tomcat.util.net.SocketProcessorBase;
org\apache\coyote\AbstractProcessorLight.class;
org\apache\coyote\http11\Http11Processor.class;
org/apache/catalina/connector/CoyoteAdapter.class; 每个到达Tomcat Connector的请求都有一个对应的线程去处理;线程池是在服务中配置的,在connector之间共享的。
org/apache/catalina/core/StandardEngineValve.class;
org/apache/catalina/valves/ErrorReportValve.class;
org/apache/catalina/authenticator/AuthenticatorBase.class;
org\apache\catalina\core\StandardHostValve.class;
org/apache/catalina/authenticator/AuthenticatorBase.class;
org/apache/catalina/core/StandardContextValve.class;
org/apache/catalina/core/StandardWrapperValve.class;
org\apache\catalina\core\ApplicationFilterChain.class;
org/springframework/web/filter/OncePerRequestFilter.class;
org/springframework/web/filter/CharacterEncodingFilter.class; 看来SpringBoot 自动配了编码过滤器;之前手动搭建SSM框架需要在web.xml 配置此过滤器。
org/springframework/web/filter/RequestContextFilter.class;
javax/servlet/http/HttpServlet.class;
org/springframework/web/servlet/FrameworkServlet.class;
org/springframework/web/servlet/DispatcherServlet.class;
org/springframework/web/servlet/mvc/method/AbstractHandlerMethodAdapter.class;
org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.class;
org/springframework/web/servlet/mvc/method/annotation/ServletInvocableHandlerMethod.class;
org/springframework/web/method/support/InvocableHandlerMethod.class;
java/lang/reflect/Method.java;