1.在Java中,NIO和BIO的区别主要体现在那三个方面?
答: 在Java中,BIO是面向流的,NIO是面向缓冲区(块)的;
BIO的各种流是同步阻塞的,而NIO是同步非阻塞的。
BIO没有选择器,NIO有,
NIO会等待数据全部传输过来以后再开辟一个线程去处理,而BIO会一有请求就开辟一个线程,如果数据没有完成传输,就让它等待

在Java中,NIO和OIO的区别主要体现在三个方面:
(1)BIO是面向流(Stream Oriented)的,NIO是面向缓冲区(Buffer Oriented)的。
在一般的BIO操作中,面向字节流或字符流的IO操作总是以流式的方式顺序地从一个流(Stream)中读取一个或多个字节,因此,我们不能随意改变读取指针的位置。在NIO操作中则不同,NIO中引入了Channel和Buffer的概念。面向缓冲区的读取和写入只需要从通道读取数据到缓冲区中,或将数据从缓冲区写入通道中。NIO不像BIO那样是顺序操作,它可以随意读取Buffer中任意位置的数据。
(2)BIO的操作是阻塞的,而NIO的操作是非阻塞的。
BIO操作都是阻塞的。例如,我们调用一个read方法读取一个文件的内容,调用read的线程就会被阻塞,直到read操作完成。
在NIO模式中,当我们调用read方法时,如果此时有数据,则read读取数据并返回;如果此时没有数据,则read也会直接返回,而不会阻塞当前线程。
NIO的非阻塞是如何做到的呢?其实在上一章已经揭晓答案,即NIO使用了通道和通道的多路复用技术。
(3)BIO没有选择器(Selector)的概念,而NIO有选择器的概念。
NIO的实现是基于底层选择器的系统调用的,所以NIO需要底层操作系统提供支持;而BIO不需要用到选择器。

2.RESTful架构风格背后的主要思想是什么?
答:统一接口:组件之间有统一的接口。
RESTful web服务是基于客户机/服务器的,不存储状态。从客户机到服务器的请求的结果可以缓存在客户机中。它具有基于超媒体的统一接口,具有自描述消息。而且客户机和服务器并不知道它们之间的中间连接。

3.AJAX中包括哪些技术?
Ajax即Asynchronous Javascript And XML(异步JavaScript和XML),是一种Web数据交互方式,一种支持异步请求的技术。

  • 基于Web标准(XHTML + CSS)的展示
  • 使用DOM进行动态显示和交互
  • 使用XMLHttpRequest进行数据交换和相关操作
  • 用JS可以控制XMLHttpRequest对象向服务器提出请求并处理响应,而不影响用户对页面的正常访问。

4.请简述HTTP/1.1协议300型响应码中几个重要的响应码,含义是什么?
3xx: 重定向 - 为完成请求,需要进一步的行动。我们常见的301 Redirect就是这个分类内的。

3xx系列的响应涉及的状态码除了304 Not Modified 之外都是用于重定向的。我们首先查看3xx系列的重定向状态码和描述:
300 Multiple Choices 客户端请求了实际指向多个资源的URL。
301 Moved Permanently 请求的 URL 已移走。
302 Found 请求的URL临时移走
303 See Other 客户端应该使用指定URL
307 Temporary Redirect 客户端应该临时定位到指定URL
于是,看起来并不复杂的重定向,稍微对比就会感到很混淆的。特别是301/302 ,303/307 一组,好像根本就是重复的。

300 multiple choices
含义在于——同样的一个URI,可以对应多个实际的资源。比如同样的软件下载可以有多个平台的版本,或者多种打包压缩格式。又比如,同样的文档可以有不同的文档格式 。客户端可以在这些结果中,根据自己的情况作出自动的选择(比如中文用户就自动选择中文文档),或者给出列表,提交给最终用户选择。
标准内并没有给出具体的多个选择项的格式。因此,该状态码很少被标准的web服务器和用户代理使用。

301 Moved Permanently
说的是客户端请求的 URI 对应的资源已经被挪到其他位置,这个新位置已经在响应消息的LOCATION 头字段内指定。如果你的书签使用了这个URI,那么应该由用户代理自动更新到新的位置。下次访问也希望使用新的URI。

  • 客户端请求: GET /abc HTTP/1.1 Host: www.example.org
  • 服务器响应: HTTP/1.1 301 Moved Permanently Location:
    http://www.example.org/def

302 Found
说的是你当前访问的URI对应的资源暂时被移动到一个新位置
这个新位置在Location头内指定。
和301不同的是
302并不影响你的书签
你也不必下次访问新的URI,因为这个变化是暂时的
实际上,这个状态码在HTTP 1.0引入
本来命名就是 302 Moved Temporarily,以便和301对照使用

303 See Other
此状态码也是重定向。但是它不管之前的请求方法是什么,都强制要求转换请求方法为GET

307 Temporary Redirect
此状态码也是重定向响应。但是它和303不同,它要保持新的请求方法和之前发起请求的请求方法一致。就是说,如果之前是 GET 方法,那么这次重定向也需继续使用GET 方法;之前使用POST方法,这次依然需要保持使用POST 方法。

304 Not Modified
此状态码其实和重定向无关。但是总不至于单独为它一个而增加一个分类,所以就放到了300系列内。当用户代理发起GET请求并设置了修改时间的前条件,而服务器发现被请求的资源并没有在给出的时间后被修改,就会返回这个状态码。这个状态码的存在是为了性能上的考量。不必传递用户代理有的、服务器也没有修改的资源。案例:

  • 客户端请求: GET /sample.html HTTP/1.1 Host: example.com If-Modified-Since:
    Wed, 01 Sep 2004 13:24:52 GMT
  • 服务器响应: HTTP/1.1 304 Not Modified Date: Tue, 27 Dec 2005 05:25:19 GMT

5.数据库连接接缓冲池的实现代码。
实现原理其实很简单,当首次建立的时候,根据配置的最小的连接缓冲数,自动创建规定的数据库连接connection,以备访问中间件的应用调用,这里建立起来的连接放在idealpool中,每次有数据库连接请求查看一下idealpool有没有可用连接,如果有则将最后一个返回即可,如果没,看一下inServingPool超过缓冲池的最大值否,没有则创建一个con返回,并放入inServingPool,应用关闭连接的时候不是真正关闭,而是从inServingPool移动到idealpool,等待服务下一个连接请求。

public class DBPool {/*** 连接池对象*/private List<Connection> idealpool;//空闲缓冲池private List<Connection> inServingPool;//在服务缓冲池/**最大最小连接数*/private static final int POOL_MAX_SIZE = DBManager.getConfiguration().getPoolMaxSize();private static final int POOL_MIN_SIZE = DBManager.getConfiguration().getPoolMinSize();/*** 初始化连接池,使池中的连接数达到最小值*/public void initPool() {if (idealpool == null) {idealpool = new ArrayList<Connection>();}inServingPool = new ArrayList<Connection>();while (idealpool.size() < DBPool.POOL_MIN_SIZE) {idealpool.add(DBManager.createConnection());System.out.println("初始化池,池中连接数:" + idealpool.size());}}/*** 从连接池中取出一个连接* @return*/public synchronized Connection getConnection() {int last_index = idealpool.size() - 1;Connection conn = null;if (last_index >= 0) {conn = idealpool.get(last_index);idealpool.remove(last_index);inServingPool.add(conn);}else if (inServingPool.size()<POOL_MAX_SIZE) {conn=DBManager.createConnection();inServingPool.add(conn);}return conn;}/*** 将连接放回池中* @param conn*/public synchronized void close(Connection conn) {if (idealpool.size()+inServingPool.size() >= POOL_MAX_SIZE) {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}} else {idealpool.add(conn);inServingPool.remove(conn);}}public DBPool() {this.initPool();}
}

6.反射的定义和注解的相关概念

  • 反射(Reflection)是程序的自我分析能力,通过反射可以确定类有哪些方法、有哪些构造方法以及有哪些成员变量。Java语言提供了反射机制,通过反射机制能够动态读取一个类的信息;能够在运行时动态加载类,而不是在编译期。反射可以应用于框架开发,它能够从配置文件中读取配置信息动态加载类、创建对象,以及调用方法和成员变量。
  • Java5之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),例如在方法覆盖中使用过的@Override注解,注解都是@符号开头的。
  • 注解并不能改变程序运行的结果,不会影响程序运行的性能。有些注解可以在编译时给用户提示或警告,有的注解可以在运行时读写字节码文件信息。
  • 元注解包括:@Documented、@Target、@Retention、@Inherited、@Repeatable和@Native。元注解是为其他注解进行说明的注解,当自定义一个新的注解类型时,其中可以使用元注解。其中@Documented:如果在一个自定义注解中引用@Documented注解,那么该注解可以修饰代码元素(类、接口、成员变量和成员方法等),javadoc等工具可以提取这些注解信息。

7.NIO的核心组件和相关概念
Java NIO类库包含以下三个核心组件:

  • Channel(通道)
    在BIO中,同一个网络连接会关联到两个流:一个是输入流(Input Stream),另一个是输出流(Output Stream)。Java应用程序通过这两个流不断地进行输入和输出的操作。
    在NIO中,一个网络连接使用一个通道表示,所有NIO的IO操作都是通过连接通道完成的。一个通道类似于BIO中两个流的结合体,既可以从通道读取数据,也可以向通道写入数据。
  • Buffer(缓冲区)
    应用程序与通道的交互主要是进行数据的读取和写入。为了完成NIO的非阻塞读写操作,NIO为大家准备了第三个重要的组件——Buffer。所谓通道的读取,就是将数据从通道读取到缓冲区中;所谓通道的写入,就是将数据从缓冲区写入通道中。缓冲区的使用是面向流进行读写操作的BIO所没有的,也是NIO非阻塞的重要前提和基础之一。
  • Selector(选择器)
    首先回顾一下前面介绍的基础知识——IO多路复用指的是一个进程/线程可以同时监视多个文件描述符(含socket连接),一旦其中的一个或者多个文件描述符可读或者可写,该监听进程/线程就能够进行IO就绪事件的查询。
    在Java应用层面,如何实现对多个文件描述符的监视呢?需要用到一个非常重要的Java NIO组件——选择器。选择器可以理解为一个IO事件的监听与查询器。通过选择器,一个线程可以查询多个通道的IO事件的就绪状态。
    从编程实现维度来说,IO多路复用编程的第一步是把通道注册到选择器中,第二步是通过选择器所提供的事件查询(select)方法来查询这些注册的通道是否有已经就绪的IO事件(例如可读、可写、网络连接完成等)。
    由于一个选择器只需要一个线程进行监控,因此我们可以很简单地使用一个线程,通过选择器去管理多个连接通道。
    与BIO相比,NIO使用选择器的最大优势是系统开销小。系统不必为每一个网络连接(文件描述符)创建进程/线程,从而大大减少了系统的开销。总之,一个线程负责多个连接通道的IO处理是非常高效的,这种高效来自Java的选择器组件Selector及其底层的操作系统IO多路复用技术的支持。

8.HTTP处理多事务的连接方式

  • 域名解析
  • 发起TCP三次握手
  • 建立TCP连接以后发起http请求
  • 服务器端响应请求,浏览器得到html代码
  • 浏览器解析html代码并请求html中的资源
  • 浏览器对页面进行渲染呈现给用户

9.HTTP协议的request和reponse的格式

  • http 协议规定,http request部分报文分三部分。第一部分是请求行,第二部分是请求头,第三部分是请求实体。
  • http request中规定第一行为请求行,请求行中第一个单词为请求的方法。比如GET(请求服务端数据),post(更新数据到服务端),DELETE(删除服务端数据),PUT(新增数据到服务端) OPTION,TRACE等等。
  • 第二个单词为请求的相对路径
  • 第三个单词为http版本。
  • http response报文协议结构和http request报文协议结构几乎相同,第一部分为响应状态行,第二部分为应答头,第三部分为应答实体
  • http response报文规定第一行为响应状态行,第一个单词为http协议值,比如http/0.9 http/1.0 htpp/1.1
  • 第二个单词为响应的状态码。比如 200表示服务端处理该请求成功,4XX开头是客户端发的http resquest有问题,5XX为服务端内部处理出错。3XX为页面转发

10.HTTP/1.1协议200型和300型响应码中几个重要的响应码,含义是什么?
2xx: 成功。请求被成功的接受或者理解,或者执行。我们常见的200 OK就是这个分类内的。

  • 200 OK
    可能是最常用的状态。它指明请求已经成功完成。
  • 201 Created
    201 Created 会比200 OK 有更加具体的语义。201指明请求成功且创建了一个资源,因此201常常配合PUT方法使用,因为PUT方法的语义上就是创建一个资源。
  • 202 Accepted
    202 Accepted 会比200 OK 有更加具体的语义。202表明请求成功被接受,但不一定已经完成资源创建或者修改,而只是被接受,可能还有服务器的后续的处理。
  • 204 No Content
    表明请求处理成功,但是作为服务器并不想要提供消息在消息主体内,或者并没有什么消息主体需要提供。 比如使用DELETE请求情况下,如果服务成功完成,可以返回204 No Content。此场景下就是告诉客户端:“你的DELETE请求已经完成,但是因为这个资源已经被删除,所以,也就没有什么需要返回的消息”。
  • 205 Reset Content
    此状态码告诉客户端请求已经成功执行。不同于204,它的意图是要告诉客户应该清除Form的内容或者刷新用户界面。具体说,我们可以填写Form,提交后,如果接到了205响应,就应该重设Form,然后初始化一个新的输入。
    事实上,并没有什么浏览器支持这样的意图:浏览器要么把205当成204,要么当成200。然而,对于ajax应用就可以实现这样的意图:ajax应用接到205码,用户界面应该把数据设置到默认值。如果是 Restful App ,在数据输入场景下,204响应适合对一条记录做一系列的编辑;205更适合输入一系列的记录;故而,Restful App的建议更加尊重http的设计本意。
  • 206 Partical Content
    它的存在目的是为了支持大文件的分段下载。当客户端发起资源范围请求,服务器就可以返回206型响应,告知客户端操作成功并且返回部分内容。

3xx: 重定向 - 为完成请求,需要进一步的行动。我们常见的301 Redirect就是这个分类内的。(同上)

11.RPC的相关概念
RPC,远程过程调用协议(Remote Procedure Call Protocol),是为解决服务进程间数据交互而诞生的一种技术。客户端发起请求,服务端返回数据。它底层封装了网络交互的各种繁琐细节,使程序员可以专注于程序业务,快速实现进程间数据交互。
+++++++++

12.Java i/o的标准实现方式
BIO—Blocking IO (阻塞IO)
NIO—Non-Blocking IO(非阻塞IO)
AIO— Asynchronous I/O (异步IO)

13.Java8 的标准注解

  • 基本注解包括:@Override、@Deprecated、@SuppressWarnings、@SafeVarargs和@FunctionalInterface。
  • @Override只能用于方法,子类覆盖父类方法(或者实现接口的方法)时可以@Override注解。编译器会检查被@Override注解的方法,确保该方法父类中存在的方法,否则会有编译错误。
    使用@Override注解示例代码见工程。
    当然如果该方法前面不加@Override注解,即便是方法写错误了,也不会有编译错误,但是Object父类的toString()方法并没有被覆盖。这会引起程序出现Bug(缺陷)。
  • @Deprecated用来指示API已经过时了,@Deprecated可以用来注解类、接口、成员方法和成员变量。
    不仅代码中有删除线,而且还有编译警告。
  • @SuppressWarnings注解用来抑制编译器警告,如果你确认程序中的警告没有问题,可以不用理会。但是就是不想看到这些警告,可以使用@SuppressWarnings注解消除这些警告。
    @SuppressWarnings({ “deprecation”
    })-@SuppressWarnings注解中的deprecation表示要抑制API已经过时。使用了@SuppressWarnings注解后会发现程序代码的警告没有了。
  • @FunctionalInterface注解是Java 8增加的,用于接口的注解,声明接口是函数式接口,主要用于Lambda表达式。

14.HTTP协议的标准Method

  • HTTP方法 HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法。
  • GET 表示我们要请求一个由URI指定的在服务器上的资源。
  • PUT方法 表示如果指定URL资源不存在就创建它,否则就修改它。
  • POST方法 表示要创建一个新的子资源,或者更新一个存在的资源。
  • DELETE表示我们要删除一个由URI指定的资源。
  • HEAD 和GET一样,但是仅仅返回指定资源响应的头部分,而不必返回响应主体
  • OPTIONS 查询目标资源支持method的清单。
  • TRACE 查询到目标资源经过的中间节点。用于测试。
  • CONNECT 建立一个到URI指定的服务器的隧道。

15.ORM中间件实现的关键点

  • 实现ORM的关键点在于解决“对象–关系”之间的映射

16.软件的三大类型

  • 单机类型、BS类型、CS类型

17.目前市面上常见的实现Java Servlet的产品和框架

  • Struts1 Struts2 SpringMVC

18.Java AIO的核心组件
Java AIO处理API中,重要的三个类分别是:

  • AsynchronousServerSocketChannel(服务端)

  • AsynchronousSocketChannel(客户端)

  • CompletionHandler(用户处理器)
    CompletionHandler接口实现应用程序向操作系统发起I/O请求,当完成后处理具体逻辑,否则做自己该做的事情,“真正”的异步I/O需要操作系统更强的支持。

19.HTTP1.1协议的头的标准关键字
++++++++++++++++++++++
20.HTML DOM模型中,获取网页中元素的方法

  • 根据ID获取 : document.getElementById(id);
  • 根据标签名获取 : document.getElementsByTagName(name);
  • 通过元素的name属性值:getElementsByName(name):
  • 根据类名返回元素对象集合 (H5新增)
  • 通过选择器返回指定选择器的第一个元素对象 (H5新增)

21.Netty的通道类型

  • Channel:是对网络Socket的封装,抽象了网络I/O的读、写、连接与绑定。
  • AbstractChannel:实现了Channel接口的大部分功能,一次连接用到的Channel、ChannelId、eventLoop、pipelIne、unsafe都会保存在这里。
  • AbstractNioChannel:通过select的方式对读写事件进行监听。
  • 客户端Channel:主要注册read与write事件,关注于具体数据的读写。
  • 服务端Channel:主要注册accept事件,关注于具体连接的接入,这也是与客户端Channel的read事件最主要的区别。

22.HTTP事务的组成

  • 一次完整的请求+响应被称为HTTP事务,在HTTP事务中有一系列的信息交换,这些信息交换是一个不可分割的整体,也就是说,要么所有的信息全部交换完,要么一次交换也不进行。

  • HTTP事务有以下四个部分组成:

  • 客户端与服务器建立连接。HTTP是基于TCP协议,这里的连接可以理解为TCP连接;如果我们只知道服务器的域名,还需要在建立连接前发起DNS解析,TCP的Socket通信需要服务器的IP地址;建立连接的过程需要三次握手。

  • 客户端向服务器发送请求。在建立TCP连接之后,客户端给服务器发送一个HTTP请求报文,请求报文中包含有客户端需要的资源等信息,例如最简单的HTML文档。

  • 服务器给客户端一个响应。服务器收到客户端的请求后,可以拒绝客户端的请求,也可以向客户端发送一个HTTP响应报文;这个响应中包含了客户端请求的HTML文档。

  • 客户端与服务器断开连接。在客户端收到服务器响应后,可以选择与服务器断开连接,也可以选择继续保持连接(HTTP持续连接),以供下一个HTTP事务使用;客户端和服务器都可以发起关闭连接,关闭TCP连接需要四次挥手。

23.Reactor模式的核心组成

  • Reactor模式由Reactor线程、Handlers处理器两大角色组成,两大角色的职责分别如下:
    (1)Reactor线程的职责:负责响应IO事件,并且分发到Handlers处理器。
    (2)Handlers处理器的职责:非阻塞的执行业务处理逻辑。

24.常见的五种基本I/O模型

  • 在网络环境下,通俗地讲,将I/O分为两步:第一步是等待;第二步是数据搬迁。
  • 如果想要提高I/O效率,需要将等待时间降低。因此发展出来五种I/O模型,分别是:
  • 阻塞I/O模型
  • 非阻塞I/O模型
  • 多路复用I/O模型
  • 信号驱动I/O模型
  • 异步I/O模型。其中,前四种被称为同步I/O。

25.HTTP协议请求的八个方法的名称及其功能

  • GET 表示我们要请求一个由URI指定的在服务器上的资源。
  • PUT方法 表示如果指定URL资源不存在就创建它,否则就修改它。
  • POST方法 表示要创建一个新的子资源,或者更新一个存在的资源。
  • DELETE表示我们要删除一个由URI指定的资源。
  • HEAD 和GET一样,但是仅仅返回指定资源响应的头部分,而不必返回响应主体
  • OPTIONS 查询目标资源支持method的清单。
  • TRACE 查询到目标资源经过的中间节点。用于测试。
  • CONNECT 建立一个到URI指定的服务器的隧道。

26.java.lang.reflect包中提供反射处理能力的几个类并说明其作用

  • java.lang.reflect包提供了反射中用到类,主要的类说明如下:
  • Constructor类:提供类的构造方法信息。
  • Field类:提供类或接口中成员变量信息。
  • Method类:提供类或接口成员方法信息。
  • Array类:提供了动态创建和访问Java数组的方法。
  • Modifier类:提供类和成员访问修饰符信息。

27.目前Java中常见的几种实现RESTful技术方案

  • 使用Spring的RestTemplate
  • 通过Servlet实现
  • JAX-RS
  • JAX-RS即Java API for RESTful Web Services

28.简述java.lang.Class类和java.lang.Object的作用和区别

  • Class类也是类的一种,只是名字和class关键字高度相似,用于java反射机制。
  • Class类的对象不能像普通类一样,以 new 的方式创建,它的对象只能由JVM创建,因为这个类没有public构造函数
  • Class类的作用是运行时提供或获得某个对象的类型信息,这些信息也可用于反射。
  • Object类是一切java类的父类,对于普通的java类,即便不声明,也是默认继承了Object类。
  • Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入
  • Object类定义了线程同步与交互的一系列方法

29.HTTP Response类程序和HTTP Request的类的实现代码

public class Request {// 请求方式private String method;// 请求资源private String url;// 请求参数private Map<String, List<String>> parameterMap;private InputStream is;private final String CRLF = "\n";public Request(InputStream is) {try {// 初始化method = "";url = "";parameterMap = new HashMap<>();this.is = is;byte[] arr = new byte[20000];int len = this.is.read(arr);// 开始解析请求正文if (len > 0) {String requestInfo = new String(arr, 0, len); // 请求正文paraseRequest(requestInfo);}} catch (IOException e) {e.printStackTrace();}}// 根据请求正文-->解析出请求方式,请求资源地址private void paraseRequest(String requestInfo) throws UnsupportedEncodingException {String param = ""; // 接收请求参数列表// 1-获取请求行String firstline = requestInfo.substring(0, requestInfo.indexOf(CRLF));this.method = firstline.substring(0, firstline.indexOf("/")).trim();String url = firstline.substring(firstline.indexOf("/"), firstline.indexOf("HTTP/")).trim();// 根据不同请求方式封装请求参数和请求资源if (method.equalsIgnoreCase("post")) {this.url = url;param = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();} else if (method.equalsIgnoreCase("get")) {// 判断是否有请求参数if (url.contains("?")) {String[] arr = url.split("\\?");this.url = arr[0];param = arr[1]; // 有可能有多个请求参数,还要再进一步解析} else {this.url = url;}}// 进一步解析请求参数,并封装到集合中 格式:a=1&b=2&c="你好"if (param != "") {StringTokenizer token = new StringTokenizer(param, "&");while (token.hasMoreElements()) {String key_value = (String) token.nextElement();String[] ks = key_value.split("=");// 请求参数的值为空,手动赋值为nullif (ks.length == 1) {ks = Arrays.copyOf(ks, 2);ks[1] = null;}// 将请求参数键值对封装进集合if (!parameterMap.containsKey(ks[0].trim())) {parameterMap.put(ks[0].trim(), new ArrayList<String>());}// 为避免中文乱码,把请求参数的值按utf-8解码再放进集合parameterMap.get(ks[0].trim()).add(URLDecoder.decode(ks[1].trim(), "UTF-8"));}}}/*** 根据name获取单个参数的值*/public String getParameter(String name) {String[] values = getParameterValues(name);if (values == null)return null;elsereturn values[0];}// 获取多个public String[] getParameterValues(String name) {if (parameterMap.get(name) == null) {return null;} else {List<String> values = parameterMap.get(name);// 参数是指定转换成数组的类型return values.toArray(new String[values.size()]);}}/*** 获取请求资源*/public String getUrl() {return this.url;}
}(2)响应消息:
/*** HTTP Response 根据客户端套接字的输出流封装成 请求正文*/
public class Response {private StringBuilder headInfo; // 响应行和头信息private StringBuilder content; // 正文private BufferedWriter bw;public int code = 200; // 状态码private int len;private final String space = " ";private final String CRLF = "\n";public Response(OutputStream outputStream) {headInfo = new StringBuilder();content = new StringBuilder();bw = new BufferedWriter(new OutputStreamWriter(outputStream));len = 0;}// 向客户端发送响应public void print(String html) throws IOException {// 构建响应正文content.append(html);this.len = html.getBytes().length;// 构建响应行和响应头setHead();// 发送bw.append(headInfo.toString());bw.append(content.toString());bw.flush();}// 构建响应行和响应头private void setHead() {if (code != 200)this.len = 0;headInfo.append("HTTP/1.1").append(space).append(code).append(space);switch (code) {case 200:headInfo.append("OK");break;case 404:headInfo.append("NOT FOUND");break;case 505:headInfo.append("Server ERROR");break;}headInfo.append(CRLF);headInfo.append("Date:").append(LocalDateTime.now()).append(CRLF);headInfo.append("Content-Type:text/html;charset=UTF-8").append(CRLF);headInfo.append("Content-Length:").append(space).append(this.len).append(CRLF).append(CRLF);}//public void setCode(int code) {this.code = code;}
}

30.RPC架构中每个部分的功能作用

(1)、服务提供者(RPC Server),运行在服务器端,提供服务接口定义与服务实现类。

(2)、服务中心(Registry),运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。

(3)、服务消费者(RPC Client),运行在客户端,通过远程代理对象调用远程服务。

服务提供者启动后主动向服务(注册)中心注册机器ip、端口以及提供的服务列表; 服务消费者启动时向服务(注册)中心获取服务提供方地址列表

软件构件技术期末复习相关推荐

  1. 物联网识别技术期末复习概要

    物联网识别技术期末复习概要 物联网识别技术 第一章 物联网的体系结构: 感知层:物联网的皮肤和五官,主要任务是识别物体,采集信息 网络层:物联网的精神中枢和大脑,负责信息传递和处理 应用层:物联网的社 ...

  2. 【软件测试技术期末复习选择题】

    软件测试技术期末复习选择题 1.在软件测试阶段,测试步骤按次序可以划分为以下几步:( A ) A.单元测试.集成测试.系统测试.验收测试 B.验收测试.单元测试.系统测试.集成测试 C.单元测试.集成 ...

  3. 信息安全与技术期末复习

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.课程知识体系结构 二.信息加密技术 (一).古典密码体制 1.网络信息安全基本概念: 2.数据加密的组成及各部分含 ...

  4. 山东大学服务开发技术期末复习

    山东大学服务开发技术期末复习 课后习题 section 1 1.1 请简要论述为什么引入软件服务?1.2 简述 W3C 定义的 Web 服务技术栈主要组成.1.3 简述面向服务架构的三个角色和三个操作 ...

  5. 大数据技术期末复习习题-前两章 大数据概述及Hadoop概述

    链接:大数据技术原理与应用期末复习第三章知识点 链接:HDFS编程实践 习题 1[单选题] 人类社会的数据产生方式大致经历了三个阶段,不包括____C____. A.运营式系统阶段 B.用户原创内容阶 ...

  6. 山东大学软件学院 - 面向对象开发技术 - 期末复习知识点总结

    前言 这篇文章里的总结大部分来自老师的PPT,然后还有一些自己对概念的补充(也就是网上扒的很多知识讲解和自己对于一些概念的理解),希望能对后面的学弟学妹们在复习的时候有点帮助φ(゜▽゜*)♪ 这里是总 ...

  7. 江西理工大学计算机管理技术期末复习(wangzhendong)网络管理与维护

    注:子网划分一定要会. 1.如何进行网络配置管理 答:网络配置是指网络中各设备的功能.设备之间的连接关系和工作参数等.配置管理就是用来支持网络服务的连续性而对管理对象进行的定义.初始化.控制.鉴别和检 ...

  8. 计算机网络技术期末复习考点

    计算机网络 选择题20' 填空题10' 简答题45' 案例分析25' 第一章 ●互联网 三网融合(三大类大家熟悉的网络):电信网.有线电视网.计算机网络. 互联网具有两个基本特征:连通性和共享性. 共 ...

  9. 大数据存储技术期末复习(自用)

    一.题型 1. 判断题(20*2) 2. 简答题(3个*10) 3. 设计题(2个*15) 二.往年题目 三.知识点 (1)CAP理论 1.定义 一致性C:所有数据备份在同一时刻的值相同.读写请求是原 ...

最新文章

  1. 高性能server分析 - Hadoop的RpcServer
  2. 更新到10.11系统之后cocoapods遇到的问题
  3. oracle cache keep pool,请问:alter table ……storage(buffer_pool keep) 与cache的区别
  4. B+树比B树更适合索引
  5. Linux中grep命令的12个实践例子
  6. 漫游飞行_美术课|一年级下漫游飞行世界
  7. mysql声明declare_mysql8 参考手册--DECLARE ... CONDITION声明
  8. Jquery需要掌握的技巧
  9. Redmi K40 Pro将首批搭载骁龙888:或刷新骁龙888最低售价
  10. Leetcode每日一题:面试题17.12 binode
  11. 数据库设计:范式与反范式
  12. Docker从理论到实践(五)------Dokcer容器
  13. 常见的计算机端口及服务
  14. 处理eking.Devos勒索病毒防范解密恢复操作攻略
  15. SuiteCRM Beans(model)
  16. 修复未能连接一个window服务器,未能连接一个windows服务的修复方法
  17. Netty in Action 翻译说明
  18. 平均获客成本_互联网金融获客成本
  19. List<Map,Object>>怎样取出map集合中的某一个的key值?
  20. 搜狗语音云开发入门--移动端轻松添加高大上的语音识别

热门文章

  1. USB(十)2022-03-03
  2. 渗透测试必备google插件
  3. PS边缘工具,边界羽化
  4. Oracle 10.2.0.3使用Logminor工具和把system表空间变成locally
  5. 重温C语言 | 指针基础(指针与内存)
  6. Django框架(一)
  7. HTML音频:音乐播放网页
  8. 手摇计算机发展年代,你知道“手摇式”的计算机吗?你肯定不知道
  9. 阿里云:工厂车间是一个广阔的天地,在那里大有作为
  10. F-Pairwise Modulo