基于Jave的Web服务工作机制(5)

input = socket.getInputStream();
  output = socket.getOutputStream();
await于是就创建一个Request对象并调用它的 parse 方法来解析原始的HTTP请求信息。
 

  // create Request object and parse
  Request request = new Request(input);
  request.parse();

  接下来,await 方法创建了一个Response 对象,使用setRequest方法并调用它的sendStaticResource 方法。

  // create Response object
  Response response = new Response(output);
  response.setRequest(request);
  response.sendStaticResource();

  最后,await关闭该Socket。调用Request的getUri方法来检查HTTP请求的URI是否是一个shutdown命令。如果是,shutdown变量被设置为true,程序退出while循环。

  // Close the socket
  socket.close();
  //check if the previous URI is a shutdown command
  shutdown = request.getUri().equals(SHUTDOWN_COMMAND);

  Request类

  Request类代表一个HTTP请求。Socket处理客户端的通讯,将返回一个InputStream对象,通过传递该对象,可以构造一个Request类的实例。通过调用InputStream 对象的read方法来获得这个HTTP请求的原始数据(raw data)。

  Request 有两个公共方法:parse 和 getUri。parse方法解释HTTP请求的原始数据。它不做很多事情----它能够利用的唯一信息只是HTTP请求的URI ,这个URI是从私有方法 parseUri.得到的。parseUri 方法保存URI 到uri 变量中,然后调用公共方法getUri来返回一个HTTP请求的URI。

  为了理解parse 和 parseUri 方法是如何工作的,需要知道HTTP请求的内部结构。这个结构是在RFC2616文档中定义的。

  一个HTTP请求包含三个部分:

  请求行(Request line)
  请求包头(Headers)
  消息体(Message body)

  现在,我们仅仅只对HTTP请求的第一部分请求行(Request line)感兴趣。一个请求行由方法标记开始,后面根请求的URI和协议版本,最后由CRLF字符结束。请求行中的元素被空格字符分开。比如,使用GET方法请求的index.html文件的请求行如下:

  GET /index.html HTTP/1.1 //这是一个请求行
  方法parse从socket的InputStream 中读取整个字节流,该字节流是 Request 对象传递进来的,然后parse将这些字节流存储在一个缓冲区里, 在缓冲区中组装一个称为request的StringBuffer对象。

  下面的Listing 1.2.显示了parse方法的用法:

  Listing 1.2. The Request class' parse method

  public void parse() {
  // Read a set of characters from the socket
  StringBuffer request = new StringBuffer(2048);
  int i;
  byte[] buffer = new byte[2048];

  try {
    i = input.read(buffer);
  }
  catch (IOException e) {
    e.printStackTrace();
    i = -1;
  }

  for (int j=0; j<i; j++) {
    request.append((char) buffer[j]);
  }

  System.out.print(request.toString());
  uri = parseUri(request.toString());
  }

时间: 2024-11-03 20:28:09

基于Jave的Web服务工作机制(5)的相关文章

基于Jave的Web服务工作机制(7)

web|web服务 sendStaticResource 方法是非常简单的.它首先传递父路径和子路径给File类的构造器,从而对java.io.File类进行了实例化. File file = new File(HttpServer.WEB_ROOT, request.getUri()); 然后它检查文件是否存在.如果存在,sendStaticResource 方法通过传递File对象来构造一个java.io.FileInputStream对象.然后调用FileInputStream 的read

基于Jave的Web服务工作机制(1)

一个WEB服务器也被称为一个HTTP服务器,因为它使用HTTP协议和它的客户进行通讯,而这些客户通常是浏览器. 一个基于JAVA的WEB服务器使用了两个重要的类:java.net.Socket和java.net.ServerSocket,并且是通过HTTP消息进行通讯的.本文开头将讨论HTTP和这两个类,后面,将解释一个简单WEB服务器应用程序的工作机制. 超文本传输协议 (HTTP) HTTP协议允许服务器和客户机通过INTERNET接收和发送数据.它是个请求和回应协议----客户机发送请求,

基于Jave的Web服务工作机制(6)

web|web服务 parseUri 方法从请求行那里得到URI.Listing 1.3 展示了parseUri 方法的用途. parseUri 减缩请求中的第一个和第二个空格来获得URI. Listing 1.3. The Request class' parseUri method private String parseUri(String requestString) { int index1, index2; index1 = requestString.indexOf(' '); i

基于Jave的Web服务工作机制(3)

ServerSocket 类  Socket 类表示的是客户端的socket.无论什么时候,只要你想连接到一个远程服务器的应用,你都要构建一个socket.如果你想执行一个服务器应用程序,比如HTTP服务或者FTP服务的程序,那么你需要使用不同的途径.因为你的服务器必须一直是开机闲置,所以它不知道什么时候客户机试图来连接它. 这个时候,需要使用java.net.ServerSocket 类.它会实现一个服务器socket.一个服务器socket会等待来自客户端的连接.一旦它接收到一个连接请求,它

基于Jave的Web服务工作机制(4)

在下面的段落中,让我们来看看这三个类吧.  HttpServer 类 HttpServer类表示一个web服务器,且在公共静态目录WEB_ROOT及它的子目录中能为找到的那些静态资源而服务.WEB_ROOT用以下方式初始化: public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot"; 这段代码指明了一个包含静态资源的webroot

基于Jave的Web服务工作机制(2)

HTTP响应(Responses)  和请求类似,一个HTTP响应也包含三个部分: 协议状态 代码描叙(Protocol-Status code-Description) 响应包头(Response headers) 实体(Entity body) 下面是HTTP响应的一个简单范例: HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Date: Mon, 3 Jan 1998 13:13:33 GMT Content-Type: text/html Last-M

基于REST的Web服务:基础

基础 REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态.如果考虑使用它的 Web 服务的数量,REST 近年来已经成为最主要的 Web 服务设计模型.事实上,REST 对 Web 的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计. REST 这个概念于 2000 年由 Roy Fielding 在就读加州大学欧文分校期间在学术论文"Architec

用Axis和SOAP开发基于JAX-RPC的Web服务(2)

1.         Web 服务示例:订单处理<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 我之所以选择"订单处理"作为示例,是因为它比较接近实际的商业用例.该Web服务能够处理,更新一个给定的订单.为了达到这个目的,它必须具有两个方法:processOrder和updateOrder.方法processOrder具有一个IN参数orderID和

用JAX-RPC构建RPC服务和客户机:使用Java API构建基于RPC的Web服务(二)

构建客户机来访问 Web 服务 到目前为止,我们用了很多篇幅讨论 JAX-RPC,但是还没有实际使用这个 API.即使在自动部署 BookSearcher 类时,与 JAX-RPC 相关的工作也是由 Axis 完成的.现在,要让 JAX-RPC 发挥作用了. 构建了希望访问的 Web 服务之后,需要编写客户机来使用 Web 服务. 更新类路径 在开始编写代码之前,需要修改类路径.在前面,已经把几个 JAR 文件放在 servlet 引擎的 lib/ 目录中,并使用 Axis 检验 JSP 确认这