首页 > 开发 > 综合 > 正文

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

2024-07-21 02:14:19
字体:
来源:转载
供稿:网友
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());
  }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表